| 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;
|
| }
|
|
|