| Index: src/interpreter-irregexp.cc
|
| ===================================================================
|
| --- src/interpreter-irregexp.cc (revision 11134)
|
| +++ src/interpreter-irregexp.cc (working copy)
|
| @@ -33,8 +33,9 @@
|
| #include "utils.h"
|
| #include "ast.h"
|
| #include "bytecodes-irregexp.h"
|
| -#include "jsregexp.h"
|
| #include "interpreter-irregexp.h"
|
| +#include "jsregexp.h"
|
| +#include "regexp-macro-assembler.h"
|
|
|
| namespace v8 {
|
| namespace internal {
|
| @@ -449,6 +450,37 @@
|
| }
|
| break;
|
| }
|
| + BYTECODE(CHECK_CHAR_IN_RANGE) {
|
| + uint32_t from = Load16Aligned(pc + 4);
|
| + uint32_t to = Load16Aligned(pc + 6);
|
| + if (from <= current_char && current_char <= to) {
|
| + pc = code_base + Load32Aligned(pc + 8);
|
| + } else {
|
| + pc += BC_CHECK_CHAR_IN_RANGE_LENGTH;
|
| + }
|
| + break;
|
| + }
|
| + BYTECODE(CHECK_CHAR_NOT_IN_RANGE) {
|
| + uint32_t from = Load16Aligned(pc + 4);
|
| + uint32_t to = Load16Aligned(pc + 6);
|
| + if (from > current_char || current_char > to) {
|
| + pc = code_base + Load32Aligned(pc + 8);
|
| + } else {
|
| + pc += BC_CHECK_CHAR_NOT_IN_RANGE_LENGTH;
|
| + }
|
| + break;
|
| + }
|
| + BYTECODE(CHECK_BIT_IN_TABLE) {
|
| + int mask = RegExpMacroAssembler::kTableMask;
|
| + byte b = pc[8 + ((current_char & mask) >> kBitsPerByteLog2)];
|
| + int bit = (current_char & (kBitsPerByte - 1));
|
| + if ((b & (1 << bit)) != 0) {
|
| + pc = code_base + Load32Aligned(pc + 4);
|
| + } else {
|
| + pc += BC_CHECK_BIT_IN_TABLE_LENGTH;
|
| + }
|
| + break;
|
| + }
|
| BYTECODE(CHECK_LT) {
|
| uint32_t limit = (insn >> BYTECODE_SHIFT);
|
| if (current_char < limit) {
|
| @@ -488,59 +520,6 @@
|
| pc += BC_CHECK_REGISTER_EQ_POS_LENGTH;
|
| }
|
| break;
|
| - BYTECODE(LOOKUP_MAP1) {
|
| - // Look up character in a bitmap. If we find a 0, then jump to the
|
| - // location at pc + 8. Otherwise fall through!
|
| - int index = current_char - (insn >> BYTECODE_SHIFT);
|
| - byte map = code_base[Load32Aligned(pc + 4) + (index >> 3)];
|
| - map = ((map >> (index & 7)) & 1);
|
| - if (map == 0) {
|
| - pc = code_base + Load32Aligned(pc + 8);
|
| - } else {
|
| - pc += BC_LOOKUP_MAP1_LENGTH;
|
| - }
|
| - break;
|
| - }
|
| - BYTECODE(LOOKUP_MAP2) {
|
| - // Look up character in a half-nibble map. If we find 00, then jump to
|
| - // the location at pc + 8. If we find 01 then jump to location at
|
| - // pc + 11, etc.
|
| - int index = (current_char - (insn >> BYTECODE_SHIFT)) << 1;
|
| - byte map = code_base[Load32Aligned(pc + 3) + (index >> 3)];
|
| - map = ((map >> (index & 7)) & 3);
|
| - if (map < 2) {
|
| - if (map == 0) {
|
| - pc = code_base + Load32Aligned(pc + 8);
|
| - } else {
|
| - pc = code_base + Load32Aligned(pc + 12);
|
| - }
|
| - } else {
|
| - if (map == 2) {
|
| - pc = code_base + Load32Aligned(pc + 16);
|
| - } else {
|
| - pc = code_base + Load32Aligned(pc + 20);
|
| - }
|
| - }
|
| - break;
|
| - }
|
| - BYTECODE(LOOKUP_MAP8) {
|
| - // Look up character in a byte map. Use the byte as an index into a
|
| - // table that follows this instruction immediately.
|
| - int index = current_char - (insn >> BYTECODE_SHIFT);
|
| - byte map = code_base[Load32Aligned(pc + 4) + index];
|
| - const byte* new_pc = code_base + Load32Aligned(pc + 8) + (map << 2);
|
| - pc = code_base + Load32Aligned(new_pc);
|
| - break;
|
| - }
|
| - BYTECODE(LOOKUP_HI_MAP8) {
|
| - // Look up high byte of this character in a byte map. Use the byte as
|
| - // an index into a table that follows this instruction immediately.
|
| - int index = (current_char >> 8) - (insn >> BYTECODE_SHIFT);
|
| - byte map = code_base[Load32Aligned(pc + 4) + index];
|
| - const byte* new_pc = code_base + Load32Aligned(pc + 8) + (map << 2);
|
| - pc = code_base + Load32Aligned(new_pc);
|
| - break;
|
| - }
|
| BYTECODE(CHECK_NOT_REGS_EQUAL)
|
| if (registers[insn >> BYTECODE_SHIFT] ==
|
| registers[Load32Aligned(pc + 4)]) {
|
|
|