Commit d303f4fb authored by Jakob Gruber's avatar Jakob Gruber Committed by Commit Bot

[regexp] Always pass the isolate to CaseInsensitiveCompareUC16

In the past we've used the isolate argument to signal whether we were
in unicode mode (nullptr) or not (the real isolate). This is no longer
needed, and in fact breaks no-i18n mode which always expects to have a
real isolate.

Bug: v8:10120
Change-Id: I2f848c4ff8c2ff0e9b84278cbcdf3c3670e44e58
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2081816Reviewed-by: 's avatarJakob Kummerow <jkummerow@chromium.org>
Commit-Queue: Jakob Gruber <jgruber@chromium.org>
Cr-Commit-Position: refs/heads/master@{#66520}
parent 36b80bea
...@@ -223,9 +223,8 @@ void RegExpMacroAssemblerARM::CheckGreedyLoop(Label* on_equal) { ...@@ -223,9 +223,8 @@ void RegExpMacroAssemblerARM::CheckGreedyLoop(Label* on_equal) {
BranchOrBacktrack(eq, on_equal); BranchOrBacktrack(eq, on_equal);
} }
void RegExpMacroAssemblerARM::CheckNotBackReferenceIgnoreCase( void RegExpMacroAssemblerARM::CheckNotBackReferenceIgnoreCase(
int start_reg, bool read_backward, bool unicode, Label* on_no_match) { int start_reg, bool read_backward, Label* on_no_match) {
Label fallthrough; Label fallthrough;
__ ldr(r0, register_location(start_reg)); // Index of start of capture __ ldr(r0, register_location(start_reg)); // Index of start of capture
__ ldr(r1, register_location(start_reg + 1)); // Index of end of capture __ ldr(r1, register_location(start_reg + 1)); // Index of end of capture
...@@ -317,7 +316,7 @@ void RegExpMacroAssemblerARM::CheckNotBackReferenceIgnoreCase( ...@@ -317,7 +316,7 @@ void RegExpMacroAssemblerARM::CheckNotBackReferenceIgnoreCase(
// r0: Address byte_offset1 - Address captured substring's start. // r0: Address byte_offset1 - Address captured substring's start.
// r1: Address byte_offset2 - Address of current character position. // r1: Address byte_offset2 - Address of current character position.
// r2: size_t byte_length - length of capture in bytes(!) // r2: size_t byte_length - length of capture in bytes(!)
// r3: Isolate* isolate or 0 if unicode flag. // r3: Isolate* isolate.
// Address of start of capture. // Address of start of capture.
__ add(r0, r0, Operand(end_of_input_address())); __ add(r0, r0, Operand(end_of_input_address()));
...@@ -331,14 +330,7 @@ void RegExpMacroAssemblerARM::CheckNotBackReferenceIgnoreCase( ...@@ -331,14 +330,7 @@ void RegExpMacroAssemblerARM::CheckNotBackReferenceIgnoreCase(
__ sub(r1, r1, r4); __ sub(r1, r1, r4);
} }
// Isolate. // Isolate.
#ifdef V8_INTL_SUPPORT __ mov(r3, Operand(ExternalReference::isolate_address(isolate())));
if (unicode) {
__ mov(r3, Operand(0));
} else // NOLINT
#endif // V8_INTL_SUPPORT
{
__ mov(r3, Operand(ExternalReference::isolate_address(isolate())));
}
{ {
AllowExternalCallThatCantCauseGC scope(masm_); AllowExternalCallThatCantCauseGC scope(masm_);
...@@ -362,7 +354,6 @@ void RegExpMacroAssemblerARM::CheckNotBackReferenceIgnoreCase( ...@@ -362,7 +354,6 @@ void RegExpMacroAssemblerARM::CheckNotBackReferenceIgnoreCase(
__ bind(&fallthrough); __ bind(&fallthrough);
} }
void RegExpMacroAssemblerARM::CheckNotBackReference(int start_reg, void RegExpMacroAssemblerARM::CheckNotBackReference(int start_reg,
bool read_backward, bool read_backward,
Label* on_no_match) { Label* on_no_match) {
......
...@@ -37,7 +37,7 @@ class V8_EXPORT_PRIVATE RegExpMacroAssemblerARM ...@@ -37,7 +37,7 @@ class V8_EXPORT_PRIVATE RegExpMacroAssemblerARM
virtual void CheckNotBackReference(int start_reg, bool read_backward, virtual void CheckNotBackReference(int start_reg, bool read_backward,
Label* on_no_match); Label* on_no_match);
virtual void CheckNotBackReferenceIgnoreCase(int start_reg, virtual void CheckNotBackReferenceIgnoreCase(int start_reg,
bool read_backward, bool unicode, bool read_backward,
Label* on_no_match); Label* on_no_match);
virtual void CheckNotCharacter(unsigned c, Label* on_not_equal); virtual void CheckNotCharacter(unsigned c, Label* on_not_equal);
virtual void CheckNotCharacterAfterAnd(unsigned c, virtual void CheckNotCharacterAfterAnd(unsigned c,
......
...@@ -288,9 +288,8 @@ void RegExpMacroAssemblerARM64::CheckGreedyLoop(Label* on_equal) { ...@@ -288,9 +288,8 @@ void RegExpMacroAssemblerARM64::CheckGreedyLoop(Label* on_equal) {
BranchOrBacktrack(eq, on_equal); BranchOrBacktrack(eq, on_equal);
} }
void RegExpMacroAssemblerARM64::CheckNotBackReferenceIgnoreCase( void RegExpMacroAssemblerARM64::CheckNotBackReferenceIgnoreCase(
int start_reg, bool read_backward, bool unicode, Label* on_no_match) { int start_reg, bool read_backward, Label* on_no_match) {
Label fallthrough; Label fallthrough;
Register capture_start_offset = w10; Register capture_start_offset = w10;
...@@ -404,7 +403,7 @@ void RegExpMacroAssemblerARM64::CheckNotBackReferenceIgnoreCase( ...@@ -404,7 +403,7 @@ void RegExpMacroAssemblerARM64::CheckNotBackReferenceIgnoreCase(
// x0: Address byte_offset1 - Address captured substring's start. // x0: Address byte_offset1 - Address captured substring's start.
// x1: Address byte_offset2 - Address of current character position. // x1: Address byte_offset2 - Address of current character position.
// w2: size_t byte_length - length of capture in bytes(!) // w2: size_t byte_length - length of capture in bytes(!)
// x3: Isolate* isolate or 0 if unicode flag // x3: Isolate* isolate.
// Address of start of capture. // Address of start of capture.
__ Add(x0, input_end(), Operand(capture_start_offset, SXTW)); __ Add(x0, input_end(), Operand(capture_start_offset, SXTW));
...@@ -416,14 +415,7 @@ void RegExpMacroAssemblerARM64::CheckNotBackReferenceIgnoreCase( ...@@ -416,14 +415,7 @@ void RegExpMacroAssemblerARM64::CheckNotBackReferenceIgnoreCase(
__ Sub(x1, x1, Operand(capture_length, SXTW)); __ Sub(x1, x1, Operand(capture_length, SXTW));
} }
// Isolate. // Isolate.
#ifdef V8_INTL_SUPPORT __ Mov(x3, ExternalReference::isolate_address(isolate()));
if (unicode) {
__ Mov(x3, Operand(0));
} else // NOLINT
#endif // V8_INTL_SUPPORT
{
__ Mov(x3, ExternalReference::isolate_address(isolate()));
}
{ {
AllowExternalCallThatCantCauseGC scope(masm_); AllowExternalCallThatCantCauseGC scope(masm_);
......
...@@ -42,7 +42,7 @@ class V8_EXPORT_PRIVATE RegExpMacroAssemblerARM64 ...@@ -42,7 +42,7 @@ class V8_EXPORT_PRIVATE RegExpMacroAssemblerARM64
virtual void CheckNotBackReference(int start_reg, bool read_backward, virtual void CheckNotBackReference(int start_reg, bool read_backward,
Label* on_no_match); Label* on_no_match);
virtual void CheckNotBackReferenceIgnoreCase(int start_reg, virtual void CheckNotBackReferenceIgnoreCase(int start_reg,
bool read_backward, bool unicode, bool read_backward,
Label* on_no_match); Label* on_no_match);
virtual void CheckNotCharacter(unsigned c, Label* on_not_equal); virtual void CheckNotCharacter(unsigned c, Label* on_not_equal);
virtual void CheckNotCharacterAfterAnd(unsigned c, virtual void CheckNotCharacterAfterAnd(unsigned c,
......
...@@ -205,9 +205,8 @@ void RegExpMacroAssemblerIA32::CheckGreedyLoop(Label* on_equal) { ...@@ -205,9 +205,8 @@ void RegExpMacroAssemblerIA32::CheckGreedyLoop(Label* on_equal) {
__ bind(&fallthrough); __ bind(&fallthrough);
} }
void RegExpMacroAssemblerIA32::CheckNotBackReferenceIgnoreCase( void RegExpMacroAssemblerIA32::CheckNotBackReferenceIgnoreCase(
int start_reg, bool read_backward, bool unicode, Label* on_no_match) { int start_reg, bool read_backward, Label* on_no_match) {
Label fallthrough; Label fallthrough;
__ mov(edx, register_location(start_reg)); // Index of start of capture __ mov(edx, register_location(start_reg)); // Index of start of capture
__ mov(ebx, register_location(start_reg + 1)); // Index of end of capture __ mov(ebx, register_location(start_reg + 1)); // Index of end of capture
...@@ -314,18 +313,11 @@ void RegExpMacroAssemblerIA32::CheckNotBackReferenceIgnoreCase( ...@@ -314,18 +313,11 @@ void RegExpMacroAssemblerIA32::CheckNotBackReferenceIgnoreCase(
// Address byte_offset1 - Address captured substring's start. // Address byte_offset1 - Address captured substring's start.
// Address byte_offset2 - Address of current character position. // Address byte_offset2 - Address of current character position.
// size_t byte_length - length of capture in bytes(!) // size_t byte_length - length of capture in bytes(!)
// Isolate* isolate or 0 if unicode flag. // Isolate* isolate.
// Set isolate. // Set isolate.
#ifdef V8_INTL_SUPPORT __ mov(Operand(esp, 3 * kSystemPointerSize),
if (unicode) { Immediate(ExternalReference::isolate_address(isolate())));
__ mov(Operand(esp, 3 * kSystemPointerSize), Immediate(0));
} else // NOLINT
#endif // V8_INTL_SUPPORT
{
__ mov(Operand(esp, 3 * kSystemPointerSize),
Immediate(ExternalReference::isolate_address(isolate())));
}
// Set byte_length. // Set byte_length.
__ mov(Operand(esp, 2 * kSystemPointerSize), ebx); __ mov(Operand(esp, 2 * kSystemPointerSize), ebx);
// Set byte_offset2. // Set byte_offset2.
...@@ -366,7 +358,6 @@ void RegExpMacroAssemblerIA32::CheckNotBackReferenceIgnoreCase( ...@@ -366,7 +358,6 @@ void RegExpMacroAssemblerIA32::CheckNotBackReferenceIgnoreCase(
__ bind(&fallthrough); __ bind(&fallthrough);
} }
void RegExpMacroAssemblerIA32::CheckNotBackReference(int start_reg, void RegExpMacroAssemblerIA32::CheckNotBackReference(int start_reg,
bool read_backward, bool read_backward,
Label* on_no_match) { Label* on_no_match) {
......
...@@ -37,7 +37,7 @@ class V8_EXPORT_PRIVATE RegExpMacroAssemblerIA32 ...@@ -37,7 +37,7 @@ class V8_EXPORT_PRIVATE RegExpMacroAssemblerIA32
virtual void CheckNotBackReference(int start_reg, bool read_backward, virtual void CheckNotBackReference(int start_reg, bool read_backward,
Label* on_no_match); Label* on_no_match);
virtual void CheckNotBackReferenceIgnoreCase(int start_reg, virtual void CheckNotBackReferenceIgnoreCase(int start_reg,
bool read_backward, bool unicode, bool read_backward,
Label* on_no_match); Label* on_no_match);
virtual void CheckNotCharacter(uint32_t c, Label* on_not_equal); virtual void CheckNotCharacter(uint32_t c, Label* on_not_equal);
virtual void CheckNotCharacterAfterAnd(uint32_t c, virtual void CheckNotCharacterAfterAnd(uint32_t c,
......
...@@ -329,13 +329,11 @@ void RegExpBytecodeGenerator::CheckNotBackReference(int start_reg, ...@@ -329,13 +329,11 @@ void RegExpBytecodeGenerator::CheckNotBackReference(int start_reg,
} }
void RegExpBytecodeGenerator::CheckNotBackReferenceIgnoreCase( void RegExpBytecodeGenerator::CheckNotBackReferenceIgnoreCase(
int start_reg, bool read_backward, bool unicode, Label* on_not_equal) { int start_reg, bool read_backward, Label* on_not_equal) {
DCHECK_LE(0, start_reg); DCHECK_LE(0, start_reg);
DCHECK_GE(kMaxRegister, start_reg); DCHECK_GE(kMaxRegister, start_reg);
Emit(read_backward ? (unicode ? BC_CHECK_NOT_BACK_REF_NO_CASE_UNICODE_BACKWARD Emit(read_backward ? BC_CHECK_NOT_BACK_REF_NO_CASE_BACKWARD
: BC_CHECK_NOT_BACK_REF_NO_CASE_BACKWARD) : BC_CHECK_NOT_BACK_REF_NO_CASE,
: (unicode ? BC_CHECK_NOT_BACK_REF_NO_CASE_UNICODE
: BC_CHECK_NOT_BACK_REF_NO_CASE),
start_reg); start_reg);
EmitOrLink(on_not_equal); EmitOrLink(on_not_equal);
} }
......
...@@ -69,7 +69,7 @@ class V8_EXPORT_PRIVATE RegExpBytecodeGenerator : public RegExpMacroAssembler { ...@@ -69,7 +69,7 @@ class V8_EXPORT_PRIVATE RegExpBytecodeGenerator : public RegExpMacroAssembler {
virtual void CheckNotBackReference(int start_reg, bool read_backward, virtual void CheckNotBackReference(int start_reg, bool read_backward,
Label* on_no_match); Label* on_no_match);
virtual void CheckNotBackReferenceIgnoreCase(int start_reg, virtual void CheckNotBackReferenceIgnoreCase(int start_reg,
bool read_backward, bool unicode, bool read_backward,
Label* on_no_match); Label* on_no_match);
virtual void IfRegisterLT(int register_index, int comparand, Label* if_lt); virtual void IfRegisterLT(int register_index, int comparand, Label* if_lt);
virtual void IfRegisterGE(int register_index, int comparand, Label* if_ge); virtual void IfRegisterGE(int register_index, int comparand, Label* if_ge);
......
...@@ -101,12 +101,12 @@ STATIC_ASSERT(1 << BYTECODE_SHIFT > BYTECODE_MASK); ...@@ -101,12 +101,12 @@ STATIC_ASSERT(1 << BYTECODE_SHIFT > BYTECODE_MASK);
V(CHECK_BIT_IN_TABLE, 34, 24) /* bc8 pad24 addr32 bits128 */ \ V(CHECK_BIT_IN_TABLE, 34, 24) /* bc8 pad24 addr32 bits128 */ \
V(CHECK_LT, 35, 8) /* bc8 pad8 uc16 addr32 */ \ V(CHECK_LT, 35, 8) /* bc8 pad8 uc16 addr32 */ \
V(CHECK_GT, 36, 8) /* bc8 pad8 uc16 addr32 */ \ V(CHECK_GT, 36, 8) /* bc8 pad8 uc16 addr32 */ \
V(CHECK_NOT_BACK_REF, 37, 8) /* bc8 reg_idx24 addr32 */ \ V(CHECK_NOT_BACK_REF, 37, 8) /* bc8 reg_idx24 addr32 */ \
V(CHECK_NOT_BACK_REF_NO_CASE, 38, 8) /* bc8 reg_idx24 addr32 */ \ V(CHECK_NOT_BACK_REF_NO_CASE, 38, 8) /* bc8 reg_idx24 addr32 */ \
V(CHECK_NOT_BACK_REF_NO_CASE_UNICODE, 39, 8) \ V(CHECK_NOT_BACK_REF_NO_CASE_UNICODE, 39, 8) /* UNUSED */ \
V(CHECK_NOT_BACK_REF_BACKWARD, 40, 8) /* bc8 reg_idx24 addr32 */ \ V(CHECK_NOT_BACK_REF_BACKWARD, 40, 8) /* bc8 reg_idx24 addr32 */ \
V(CHECK_NOT_BACK_REF_NO_CASE_BACKWARD, 41, 8) /* bc8 reg_idx24 addr32 */ \ V(CHECK_NOT_BACK_REF_NO_CASE_BACKWARD, 41, 8) /* bc8 reg_idx24 addr32 */ \
V(CHECK_NOT_BACK_REF_NO_CASE_UNICODE_BACKWARD, 42, 8) \ V(CHECK_NOT_BACK_REF_NO_CASE_UNICODE_BACKWARD, 42, 8) /* UNUSED */ \
V(CHECK_NOT_REGS_EQUAL, 43, 12) /* bc8 regidx24 reg_idx32 addr32 */ \ V(CHECK_NOT_REGS_EQUAL, 43, 12) /* bc8 regidx24 reg_idx32 addr32 */ \
V(CHECK_REGISTER_LT, 44, 12) /* bc8 reg_idx24 value32 addr32 */ \ V(CHECK_REGISTER_LT, 44, 12) /* bc8 reg_idx24 value32 addr32 */ \
V(CHECK_REGISTER_GE, 45, 12) /* bc8 reg_idx24 value32 addr32 */ \ V(CHECK_REGISTER_GE, 45, 12) /* bc8 reg_idx24 value32 addr32 */ \
......
...@@ -3429,8 +3429,8 @@ void BackReferenceNode::Emit(RegExpCompiler* compiler, Trace* trace) { ...@@ -3429,8 +3429,8 @@ void BackReferenceNode::Emit(RegExpCompiler* compiler, Trace* trace) {
DCHECK_EQ(start_reg_ + 1, end_reg_); DCHECK_EQ(start_reg_ + 1, end_reg_);
if (IgnoreCase(flags_)) { if (IgnoreCase(flags_)) {
assembler->CheckNotBackReferenceIgnoreCase( assembler->CheckNotBackReferenceIgnoreCase(start_reg_, read_backward(),
start_reg_, read_backward(), IsUnicode(flags_), trace->backtrack()); trace->backtrack());
} else { } else {
assembler->CheckNotBackReference(start_reg_, read_backward(), assembler->CheckNotBackReference(start_reg_, read_backward(),
trace->backtrack()); trace->backtrack());
......
...@@ -35,18 +35,18 @@ namespace internal { ...@@ -35,18 +35,18 @@ namespace internal {
namespace { namespace {
bool BackRefMatchesNoCase(Isolate* isolate, int from, int current, int len, bool BackRefMatchesNoCase(Isolate* isolate, int from, int current, int len,
Vector<const uc16> subject, bool unicode) { Vector<const uc16> subject) {
Address offset_a = Address offset_a =
reinterpret_cast<Address>(const_cast<uc16*>(&subject.at(from))); reinterpret_cast<Address>(const_cast<uc16*>(&subject.at(from)));
Address offset_b = Address offset_b =
reinterpret_cast<Address>(const_cast<uc16*>(&subject.at(current))); reinterpret_cast<Address>(const_cast<uc16*>(&subject.at(current)));
size_t length = len * kUC16Size; size_t length = len * kUC16Size;
return RegExpMacroAssembler::CaseInsensitiveCompareUC16( return RegExpMacroAssembler::CaseInsensitiveCompareUC16(offset_a, offset_b,
offset_a, offset_b, length, unicode ? nullptr : isolate) == 1; length, isolate) == 1;
} }
bool BackRefMatchesNoCase(Isolate* isolate, int from, int current, int len, bool BackRefMatchesNoCase(Isolate* isolate, int from, int current, int len,
Vector<const uint8_t> subject, bool unicode) { Vector<const uint8_t> subject) {
// For Latin1 characters the unicode flag makes no difference. // For Latin1 characters the unicode flag makes no difference.
for (int i = 0; i < len; i++) { for (int i = 0; i < len; i++) {
unsigned int old_char = subject[from++]; unsigned int old_char = subject[from++];
...@@ -747,26 +747,14 @@ IrregexpInterpreter::Result RawMatch(Isolate* isolate, ByteArray code_array, ...@@ -747,26 +747,14 @@ IrregexpInterpreter::Result RawMatch(Isolate* isolate, ByteArray code_array,
DISPATCH(); DISPATCH();
} }
BYTECODE(CHECK_NOT_BACK_REF_NO_CASE_UNICODE) { BYTECODE(CHECK_NOT_BACK_REF_NO_CASE_UNICODE) {
int from = registers[insn >> BYTECODE_SHIFT]; UNREACHABLE(); // TODO(jgruber): Remove this unused bytecode.
int len = registers[(insn >> BYTECODE_SHIFT) + 1] - from;
if (from >= 0 && len > 0) {
if (current + len > subject.length() ||
!BackRefMatchesNoCase(isolate, from, current, len, subject, true)) {
SET_PC_FROM_OFFSET(Load32Aligned(pc + 4));
DISPATCH();
}
current += len;
}
ADVANCE(CHECK_NOT_BACK_REF_NO_CASE_UNICODE);
DISPATCH();
} }
BYTECODE(CHECK_NOT_BACK_REF_NO_CASE) { BYTECODE(CHECK_NOT_BACK_REF_NO_CASE) {
int from = registers[insn >> BYTECODE_SHIFT]; int from = registers[insn >> BYTECODE_SHIFT];
int len = registers[(insn >> BYTECODE_SHIFT) + 1] - from; int len = registers[(insn >> BYTECODE_SHIFT) + 1] - from;
if (from >= 0 && len > 0) { if (from >= 0 && len > 0) {
if (current + len > subject.length() || if (current + len > subject.length() ||
!BackRefMatchesNoCase(isolate, from, current, len, subject, !BackRefMatchesNoCase(isolate, from, current, len, subject)) {
false)) {
SET_PC_FROM_OFFSET(Load32Aligned(pc + 4)); SET_PC_FROM_OFFSET(Load32Aligned(pc + 4));
DISPATCH(); DISPATCH();
} }
...@@ -776,27 +764,14 @@ IrregexpInterpreter::Result RawMatch(Isolate* isolate, ByteArray code_array, ...@@ -776,27 +764,14 @@ IrregexpInterpreter::Result RawMatch(Isolate* isolate, ByteArray code_array,
DISPATCH(); DISPATCH();
} }
BYTECODE(CHECK_NOT_BACK_REF_NO_CASE_UNICODE_BACKWARD) { BYTECODE(CHECK_NOT_BACK_REF_NO_CASE_UNICODE_BACKWARD) {
int from = registers[insn >> BYTECODE_SHIFT]; UNREACHABLE(); // TODO(jgruber): Remove this unused bytecode.
int len = registers[(insn >> BYTECODE_SHIFT) + 1] - from;
if (from >= 0 && len > 0) {
if (current - len < 0 ||
!BackRefMatchesNoCase(isolate, from, current - len, len, subject,
true)) {
SET_PC_FROM_OFFSET(Load32Aligned(pc + 4));
DISPATCH();
}
current -= len;
}
ADVANCE(CHECK_NOT_BACK_REF_NO_CASE_UNICODE_BACKWARD);
DISPATCH();
} }
BYTECODE(CHECK_NOT_BACK_REF_NO_CASE_BACKWARD) { BYTECODE(CHECK_NOT_BACK_REF_NO_CASE_BACKWARD) {
int from = registers[insn >> BYTECODE_SHIFT]; int from = registers[insn >> BYTECODE_SHIFT];
int len = registers[(insn >> BYTECODE_SHIFT) + 1] - from; int len = registers[(insn >> BYTECODE_SHIFT) + 1] - from;
if (from >= 0 && len > 0) { if (from >= 0 && len > 0) {
if (current - len < 0 || if (current - len < 0 ||
!BackRefMatchesNoCase(isolate, from, current - len, len, subject, !BackRefMatchesNoCase(isolate, from, current - len, len, subject)) {
false)) {
SET_PC_FROM_OFFSET(Load32Aligned(pc + 4)); SET_PC_FROM_OFFSET(Load32Aligned(pc + 4));
DISPATCH(); DISPATCH();
} }
......
...@@ -351,17 +351,15 @@ void RegExpMacroAssemblerTracer::CheckNotBackReference(int start_reg, ...@@ -351,17 +351,15 @@ void RegExpMacroAssemblerTracer::CheckNotBackReference(int start_reg,
assembler_->CheckNotBackReference(start_reg, read_backward, on_no_match); assembler_->CheckNotBackReference(start_reg, read_backward, on_no_match);
} }
void RegExpMacroAssemblerTracer::CheckNotBackReferenceIgnoreCase( void RegExpMacroAssemblerTracer::CheckNotBackReferenceIgnoreCase(
int start_reg, bool read_backward, bool unicode, Label* on_no_match) { int start_reg, bool read_backward, Label* on_no_match) {
PrintF(" CheckNotBackReferenceIgnoreCase(register=%d, %s %s, label[%08x]);\n", PrintF(" CheckNotBackReferenceIgnoreCase(register=%d, %s, label[%08x]);\n",
start_reg, read_backward ? "backward" : "forward", start_reg, read_backward ? "backward" : "forward",
unicode ? "unicode" : "non-unicode", LabelToInt(on_no_match)); LabelToInt(on_no_match));
assembler_->CheckNotBackReferenceIgnoreCase(start_reg, read_backward, unicode, assembler_->CheckNotBackReferenceIgnoreCase(start_reg, read_backward,
on_no_match); on_no_match);
} }
void RegExpMacroAssemblerTracer::CheckPosition(int cp_offset, void RegExpMacroAssemblerTracer::CheckPosition(int cp_offset,
Label* on_outside_input) { Label* on_outside_input) {
PrintF(" CheckPosition(cp_offset=%d, label[%08x]);\n", cp_offset, PrintF(" CheckPosition(cp_offset=%d, label[%08x]);\n", cp_offset,
......
...@@ -33,7 +33,6 @@ class RegExpMacroAssemblerTracer: public RegExpMacroAssembler { ...@@ -33,7 +33,6 @@ class RegExpMacroAssemblerTracer: public RegExpMacroAssembler {
void CheckNotBackReference(int start_reg, bool read_backward, void CheckNotBackReference(int start_reg, bool read_backward,
Label* on_no_match) override; Label* on_no_match) override;
void CheckNotBackReferenceIgnoreCase(int start_reg, bool read_backward, void CheckNotBackReferenceIgnoreCase(int start_reg, bool read_backward,
bool unicode,
Label* on_no_match) override; Label* on_no_match) override;
void CheckNotCharacter(unsigned c, Label* on_not_equal) override; void CheckNotCharacter(unsigned c, Label* on_not_equal) override;
void CheckNotCharacterAfterAnd(unsigned c, unsigned and_with, void CheckNotCharacterAfterAnd(unsigned c, unsigned and_with,
......
...@@ -87,7 +87,7 @@ class RegExpMacroAssembler { ...@@ -87,7 +87,7 @@ class RegExpMacroAssembler {
virtual void CheckNotBackReference(int start_reg, bool read_backward, virtual void CheckNotBackReference(int start_reg, bool read_backward,
Label* on_no_match) = 0; Label* on_no_match) = 0;
virtual void CheckNotBackReferenceIgnoreCase(int start_reg, virtual void CheckNotBackReferenceIgnoreCase(int start_reg,
bool read_backward, bool unicode, bool read_backward,
Label* on_no_match) = 0; Label* on_no_match) = 0;
// Check the current character for a match with a literal character. If we // Check the current character for a match with a literal character. If we
// fail to match then goto the on_failure label. End of input always // fail to match then goto the on_failure label. End of input always
......
...@@ -214,9 +214,8 @@ void RegExpMacroAssemblerX64::CheckGreedyLoop(Label* on_equal) { ...@@ -214,9 +214,8 @@ void RegExpMacroAssemblerX64::CheckGreedyLoop(Label* on_equal) {
__ bind(&fallthrough); __ bind(&fallthrough);
} }
void RegExpMacroAssemblerX64::CheckNotBackReferenceIgnoreCase( void RegExpMacroAssemblerX64::CheckNotBackReferenceIgnoreCase(
int start_reg, bool read_backward, bool unicode, Label* on_no_match) { int start_reg, bool read_backward, Label* on_no_match) {
Label fallthrough; Label fallthrough;
ReadPositionFromRegister(rdx, start_reg); // Offset of start of capture ReadPositionFromRegister(rdx, start_reg); // Offset of start of capture
ReadPositionFromRegister(rbx, start_reg + 1); // Offset of end of capture ReadPositionFromRegister(rbx, start_reg + 1); // Offset of end of capture
...@@ -321,7 +320,7 @@ void RegExpMacroAssemblerX64::CheckNotBackReferenceIgnoreCase( ...@@ -321,7 +320,7 @@ void RegExpMacroAssemblerX64::CheckNotBackReferenceIgnoreCase(
// Address byte_offset1 - Address captured substring's start. // Address byte_offset1 - Address captured substring's start.
// Address byte_offset2 - Address of current character position. // Address byte_offset2 - Address of current character position.
// size_t byte_length - length of capture in bytes(!) // size_t byte_length - length of capture in bytes(!)
// Isolate* isolate or 0 if unicode flag. // Isolate* isolate.
#ifdef V8_TARGET_OS_WIN #ifdef V8_TARGET_OS_WIN
DCHECK(rcx == arg_reg_1); DCHECK(rcx == arg_reg_1);
DCHECK(rdx == arg_reg_2); DCHECK(rdx == arg_reg_2);
...@@ -349,14 +348,7 @@ void RegExpMacroAssemblerX64::CheckNotBackReferenceIgnoreCase( ...@@ -349,14 +348,7 @@ void RegExpMacroAssemblerX64::CheckNotBackReferenceIgnoreCase(
// Set byte_length. // Set byte_length.
__ movq(arg_reg_3, rbx); __ movq(arg_reg_3, rbx);
// Isolate. // Isolate.
#ifdef V8_INTL_SUPPORT __ LoadAddress(arg_reg_4, ExternalReference::isolate_address(isolate()));
if (unicode) {
__ movq(arg_reg_4, Immediate(0));
} else // NOLINT
#endif // V8_INTL_SUPPORT
{
__ LoadAddress(arg_reg_4, ExternalReference::isolate_address(isolate()));
}
{ // NOLINT: Can't find a way to open this scope without confusing the { // NOLINT: Can't find a way to open this scope without confusing the
// linter. // linter.
...@@ -388,7 +380,6 @@ void RegExpMacroAssemblerX64::CheckNotBackReferenceIgnoreCase( ...@@ -388,7 +380,6 @@ void RegExpMacroAssemblerX64::CheckNotBackReferenceIgnoreCase(
__ bind(&fallthrough); __ bind(&fallthrough);
} }
void RegExpMacroAssemblerX64::CheckNotBackReference(int start_reg, void RegExpMacroAssemblerX64::CheckNotBackReference(int start_reg,
bool read_backward, bool read_backward,
Label* on_no_match) { Label* on_no_match) {
......
...@@ -37,7 +37,6 @@ class V8_EXPORT_PRIVATE RegExpMacroAssemblerX64 ...@@ -37,7 +37,6 @@ class V8_EXPORT_PRIVATE RegExpMacroAssemblerX64
void CheckNotBackReference(int start_reg, bool read_backward, void CheckNotBackReference(int start_reg, bool read_backward,
Label* on_no_match) override; Label* on_no_match) override;
void CheckNotBackReferenceIgnoreCase(int start_reg, bool read_backward, void CheckNotBackReferenceIgnoreCase(int start_reg, bool read_backward,
bool unicode,
Label* on_no_match) override; Label* on_no_match) override;
void CheckNotCharacter(uint32_t c, Label* on_not_equal) override; void CheckNotCharacter(uint32_t c, Label* on_not_equal) override;
void CheckNotCharacterAfterAnd(uint32_t c, uint32_t mask, void CheckNotCharacterAfterAnd(uint32_t c, uint32_t mask,
......
...@@ -1021,16 +1021,16 @@ TEST(MacroAssemblerNativeBackRefNoCase) { ...@@ -1021,16 +1021,16 @@ TEST(MacroAssemblerNativeBackRefNoCase) {
m.WriteCurrentPositionToRegister(2, 0); m.WriteCurrentPositionToRegister(2, 0);
m.AdvanceCurrentPosition(3); m.AdvanceCurrentPosition(3);
m.WriteCurrentPositionToRegister(3, 0); m.WriteCurrentPositionToRegister(3, 0);
m.CheckNotBackReferenceIgnoreCase(2, false, false, &fail); // Match "AbC". m.CheckNotBackReferenceIgnoreCase(2, false, &fail); // Match "AbC".
m.CheckNotBackReferenceIgnoreCase(2, false, false, &fail); // Match "ABC". m.CheckNotBackReferenceIgnoreCase(2, false, &fail); // Match "ABC".
Label expected_fail; Label expected_fail;
m.CheckNotBackReferenceIgnoreCase(2, false, false, &expected_fail); m.CheckNotBackReferenceIgnoreCase(2, false, &expected_fail);
m.Bind(&fail); m.Bind(&fail);
m.Fail(); m.Fail();
m.Bind(&expected_fail); m.Bind(&expected_fail);
m.AdvanceCurrentPosition(3); // Skip "xYz" m.AdvanceCurrentPosition(3); // Skip "xYz"
m.CheckNotBackReferenceIgnoreCase(2, false, false, &succ); m.CheckNotBackReferenceIgnoreCase(2, false, &succ);
m.Fail(); m.Fail();
m.Bind(&succ); m.Bind(&succ);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment