Index: src/regexp/interpreter-irregexp.cc |
diff --git a/src/regexp/interpreter-irregexp.cc b/src/regexp/interpreter-irregexp.cc |
index 67cd025953f300166956b4b2476e6da8163b40fd..14834d512a5c9aba83d1740f6e5d645375035673 100644 |
--- a/src/regexp/interpreter-irregexp.cc |
+++ b/src/regexp/interpreter-irregexp.cc |
@@ -15,37 +15,32 @@ |
#include "src/unicode.h" |
#include "src/utils.h" |
+#ifdef V8_I18N_SUPPORT |
+#include "unicode/uchar.h" |
+#endif // V8_I18N_SUPPORT |
+ |
namespace v8 { |
namespace internal { |
typedef unibrow::Mapping<unibrow::Ecma262Canonicalize> Canonicalize; |
-static bool BackRefMatchesNoCase(Canonicalize* interp_canonicalize, |
- int from, |
- int current, |
- int len, |
- Vector<const uc16> subject) { |
- for (int i = 0; i < len; i++) { |
- unibrow::uchar old_char = subject[from++]; |
- unibrow::uchar new_char = subject[current++]; |
- if (old_char == new_char) continue; |
- unibrow::uchar old_string[1] = { old_char }; |
- unibrow::uchar new_string[1] = { new_char }; |
- interp_canonicalize->get(old_char, '\0', old_string); |
- interp_canonicalize->get(new_char, '\0', new_string); |
- if (old_string[0] != new_string[0]) { |
- return false; |
- } |
- } |
- return true; |
+static bool BackRefMatchesNoCase(Isolate* isolate, int from, int current, |
+ int len, Vector<const uc16> subject, |
+ bool unicode) { |
+ Address offset_a = |
+ reinterpret_cast<Address>(const_cast<uc16*>(&subject.at(from))); |
+ Address offset_b = |
+ reinterpret_cast<Address>(const_cast<uc16*>(&subject.at(current))); |
+ size_t length = len * kUC16Size; |
+ return RegExpMacroAssembler::CaseInsensitiveCompareUC16( |
+ offset_a, offset_b, length, unicode ? nullptr : isolate) == 1; |
} |
-static bool BackRefMatchesNoCase(Canonicalize* interp_canonicalize, |
- int from, |
- int current, |
- int len, |
- Vector<const uint8_t> subject) { |
+static bool BackRefMatchesNoCase(Isolate* isolate, int from, int current, |
+ int len, Vector<const uint8_t> subject, |
+ bool unicode) { |
+ // For Latin1 characters the unicode flag makes no difference. |
for (int i = 0; i < len; i++) { |
unsigned int old_char = subject[from++]; |
unsigned int new_char = subject[current++]; |
@@ -523,13 +518,16 @@ static RegExpImpl::IrregexpResult RawMatch(Isolate* isolate, |
pc += BC_CHECK_NOT_BACK_REF_BACKWARD_LENGTH; |
break; |
} |
+ BYTECODE(CHECK_NOT_BACK_REF_NO_CASE_UNICODE) |
BYTECODE(CHECK_NOT_BACK_REF_NO_CASE) { |
+ bool unicode = |
+ (insn & BYTECODE_MASK) == BC_CHECK_NOT_BACK_REF_NO_CASE_UNICODE; |
int from = registers[insn >> BYTECODE_SHIFT]; |
int len = registers[(insn >> BYTECODE_SHIFT) + 1] - from; |
if (from >= 0 && len > 0) { |
if (current + len > subject.length() || |
- !BackRefMatchesNoCase(isolate->interp_canonicalize_mapping(), |
- from, current, len, subject)) { |
+ !BackRefMatchesNoCase(isolate, from, current, len, subject, |
+ unicode)) { |
pc = code_base + Load32Aligned(pc + 4); |
break; |
} |
@@ -538,13 +536,16 @@ static RegExpImpl::IrregexpResult RawMatch(Isolate* isolate, |
pc += BC_CHECK_NOT_BACK_REF_NO_CASE_LENGTH; |
break; |
} |
+ BYTECODE(CHECK_NOT_BACK_REF_NO_CASE_UNICODE_BACKWARD) |
BYTECODE(CHECK_NOT_BACK_REF_NO_CASE_BACKWARD) { |
+ bool unicode = (insn & BYTECODE_MASK) == |
+ BC_CHECK_NOT_BACK_REF_NO_CASE_UNICODE_BACKWARD; |
int from = registers[insn >> BYTECODE_SHIFT]; |
int len = registers[(insn >> BYTECODE_SHIFT) + 1] - from; |
if (from >= 0 && len > 0) { |
if (current - len < 0 || |
- !BackRefMatchesNoCase(isolate->interp_canonicalize_mapping(), |
- from, current - len, len, subject)) { |
+ !BackRefMatchesNoCase(isolate, from, current - len, len, subject, |
+ unicode)) { |
pc = code_base + Load32Aligned(pc + 4); |
break; |
} |