| Index: src/arm/regexp-macro-assembler-arm.cc
|
| diff --git a/src/arm/regexp-macro-assembler-arm.cc b/src/arm/regexp-macro-assembler-arm.cc
|
| index 24b6a9c81a8b2dd6e09040a2cfe65075c32437a9..5b17dc18ad5a8d8018dcff5c96274f1c15e9139d 100644
|
| --- a/src/arm/regexp-macro-assembler-arm.cc
|
| +++ b/src/arm/regexp-macro-assembler-arm.cc
|
| @@ -459,8 +459,6 @@ void RegExpMacroAssemblerARM::CheckNotCharacterAfterMinusAnd(
|
|
|
|
|
| bool RegExpMacroAssemblerARM::CheckSpecialCharacterClass(uc16 type,
|
| - int cp_offset,
|
| - bool check_offset,
|
| Label* on_no_match) {
|
| // Range checks (c in min..max) are generally implemented by an unsigned
|
| // (c - min) <= (max - min) check
|
| @@ -469,11 +467,6 @@ bool RegExpMacroAssemblerARM::CheckSpecialCharacterClass(uc16 type,
|
| // Match space-characters
|
| if (mode_ == ASCII) {
|
| // ASCII space characters are '\t'..'\r' and ' '.
|
| - if (check_offset) {
|
| - LoadCurrentCharacter(cp_offset, on_no_match);
|
| - } else {
|
| - LoadCurrentCharacterUnchecked(cp_offset, 1);
|
| - }
|
| Label success;
|
| __ cmp(current_character(), Operand(' '));
|
| __ b(eq, &success);
|
| @@ -487,11 +480,6 @@ bool RegExpMacroAssemblerARM::CheckSpecialCharacterClass(uc16 type,
|
| return false;
|
| case 'S':
|
| // Match non-space characters.
|
| - if (check_offset) {
|
| - LoadCurrentCharacter(cp_offset, on_no_match, 1);
|
| - } else {
|
| - LoadCurrentCharacterUnchecked(cp_offset, 1);
|
| - }
|
| if (mode_ == ASCII) {
|
| // ASCII space characters are '\t'..'\r' and ' '.
|
| __ cmp(current_character(), Operand(' '));
|
| @@ -504,33 +492,18 @@ bool RegExpMacroAssemblerARM::CheckSpecialCharacterClass(uc16 type,
|
| return false;
|
| case 'd':
|
| // Match ASCII digits ('0'..'9')
|
| - if (check_offset) {
|
| - LoadCurrentCharacter(cp_offset, on_no_match, 1);
|
| - } else {
|
| - LoadCurrentCharacterUnchecked(cp_offset, 1);
|
| - }
|
| __ sub(r0, current_character(), Operand('0'));
|
| __ cmp(current_character(), Operand('9' - '0'));
|
| BranchOrBacktrack(hi, on_no_match);
|
| return true;
|
| case 'D':
|
| // Match non ASCII-digits
|
| - if (check_offset) {
|
| - LoadCurrentCharacter(cp_offset, on_no_match, 1);
|
| - } else {
|
| - LoadCurrentCharacterUnchecked(cp_offset, 1);
|
| - }
|
| __ sub(r0, current_character(), Operand('0'));
|
| __ cmp(r0, Operand('9' - '0'));
|
| BranchOrBacktrack(ls, on_no_match);
|
| return true;
|
| case '.': {
|
| // Match non-newlines (not 0x0a('\n'), 0x0d('\r'), 0x2028 and 0x2029)
|
| - if (check_offset) {
|
| - LoadCurrentCharacter(cp_offset, on_no_match, 1);
|
| - } else {
|
| - LoadCurrentCharacterUnchecked(cp_offset, 1);
|
| - }
|
| __ eor(r0, current_character(), Operand(0x01));
|
| // See if current character is '\n'^1 or '\r'^1, i.e., 0x0b or 0x0c
|
| __ sub(r0, r0, Operand(0x0b));
|
| @@ -546,13 +519,71 @@ bool RegExpMacroAssemblerARM::CheckSpecialCharacterClass(uc16 type,
|
| }
|
| return true;
|
| }
|
| + case 'n': {
|
| + // Match newlines (0x0a('\n'), 0x0d('\r'), 0x2028 and 0x2029)
|
| + __ eor(r0, current_character(), Operand(0x01));
|
| + // See if current character is '\n'^1 or '\r'^1, i.e., 0x0b or 0x0c
|
| + __ sub(r0, r0, Operand(0x0b));
|
| + __ cmp(r0, Operand(0x0c - 0x0b));
|
| + if (mode_ == ASCII) {
|
| + BranchOrBacktrack(hi, on_no_match);
|
| + } else {
|
| + Label done;
|
| + __ b(ls, &done);
|
| + // Compare original value to 0x2028 and 0x2029, using the already
|
| + // computed (current_char ^ 0x01 - 0x0b). I.e., check for
|
| + // 0x201d (0x2028 - 0x0b) or 0x201e.
|
| + __ sub(r0, r0, Operand(0x2028 - 0x0b));
|
| + __ cmp(r0, Operand(1));
|
| + BranchOrBacktrack(hi, on_no_match);
|
| + __ bind(&done);
|
| + }
|
| + return true;
|
| + }
|
| + case 'w': {
|
| + // Match word character (0-9, A-Z, a-z and _).
|
| + Label digits, done;
|
| + __ cmp(current_character(), Operand('9'));
|
| + __ b(ls, &digits);
|
| + __ cmp(current_character(), Operand('_'));
|
| + __ b(eq, &done);
|
| + __ orr(r0, current_character(), Operand(0x20));
|
| + __ sub(r0, r0, Operand('a'));
|
| + __ cmp(r0, Operand('z' - 'a'));
|
| + BranchOrBacktrack(hi, on_no_match);
|
| + __ jmp(&done);
|
| +
|
| + __ bind(&digits);
|
| + __ cmp(current_character(), Operand('0'));
|
| + BranchOrBacktrack(lo, on_no_match);
|
| + __ bind(&done);
|
| +
|
| + return true;
|
| + }
|
| + case 'W': {
|
| + // Match non-word character (not 0-9, A-Z, a-z and _).
|
| + Label digits, done;
|
| + __ cmp(current_character(), Operand('9'));
|
| + __ b(ls, &digits);
|
| + __ cmp(current_character(), Operand('_'));
|
| + BranchOrBacktrack(eq, on_no_match);
|
| + __ orr(r0, current_character(), Operand(0x20));
|
| + __ sub(r0, r0, Operand('a'));
|
| + __ cmp(r0, Operand('z' - 'a'));
|
| + BranchOrBacktrack(ls, on_no_match);
|
| + __ jmp(&done);
|
| +
|
| + __ bind(&digits);
|
| + __ cmp(current_character(), Operand('0'));
|
| + BranchOrBacktrack(hs, on_no_match);
|
| + __ bind(&done);
|
| +
|
| + return true;
|
| + }
|
| case '*':
|
| // Match any character.
|
| - if (check_offset) {
|
| - CheckPosition(cp_offset, on_no_match);
|
| - }
|
| return true;
|
| - // No custom implementation (yet): w, W, s(UC16), S(UC16).
|
| + // No custom implementation (yet): s(UC16), S(UC16).
|
| default:
|
| return false;
|
| }
|
|
|