1ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org// Copyright 2011 the V8 project authors. All rights reserved. 23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// Use of this source code is governed by a BSD-style license that can be 33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// found in the LICENSE file. 4a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 5a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// A simple interpreter for the Irregexp byte code. 6a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 7a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 8196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/v8.h" 9196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/unicode.h" 10196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/utils.h" 11196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/ast.h" 12196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/bytecodes-irregexp.h" 13196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/interpreter-irregexp.h" 14196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/jsregexp.h" 15196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/regexp-macro-assembler.h" 16a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 1771affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace v8 { 1871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace internal { 19a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 20a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 21ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgtypedef unibrow::Mapping<unibrow::Ecma262Canonicalize> Canonicalize; 22a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 23ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgstatic bool BackRefMatchesNoCase(Canonicalize* interp_canonicalize, 24ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org int from, 25a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org int current, 26a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org int len, 27a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org Vector<const uc16> subject) { 28a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org for (int i = 0; i < len; i++) { 29a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org unibrow::uchar old_char = subject[from++]; 30a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org unibrow::uchar new_char = subject[current++]; 31a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org if (old_char == new_char) continue; 32e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org unibrow::uchar old_string[1] = { old_char }; 33e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org unibrow::uchar new_string[1] = { new_char }; 34ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org interp_canonicalize->get(old_char, '\0', old_string); 35ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org interp_canonicalize->get(new_char, '\0', new_string); 36e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org if (old_string[0] != new_string[0]) { 37a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org return false; 38a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 39a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 40a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org return true; 41a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 42a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 43a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 44ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgstatic bool BackRefMatchesNoCase(Canonicalize* interp_canonicalize, 45ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org int from, 468bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org int current, 478bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org int len, 4859297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org Vector<const uint8_t> subject) { 498bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org for (int i = 0; i < len; i++) { 508bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org unsigned int old_char = subject[from++]; 518bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org unsigned int new_char = subject[current++]; 528bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org if (old_char == new_char) continue; 53f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org // Convert both characters to lower case. 54f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org old_char |= 0x20; 55f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org new_char |= 0x20; 568bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org if (old_char != new_char) return false; 57f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org // Not letters in the ASCII range and Latin-1 range. 58f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org if (!(old_char - 'a' <= 'z' - 'a') && 59f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org !(old_char - 224 <= 254 - 224 && old_char != 247)) { 60f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org return false; 61f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org } 628bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org } 638bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org return true; 648bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org} 658bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org 668bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org 67a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#ifdef DEBUG 68a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgstatic void TraceInterpreter(const byte* code_base, 69a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org const byte* pc, 70a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org int stack_depth, 71a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org int current_position, 7237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com uint32_t current_char, 73a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org int bytecode_length, 74a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org const char* bytecode_name) { 75a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org if (FLAG_trace_regexp_bytecodes) { 7637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com bool printable = (current_char < 127 && current_char >= 32); 7737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com const char* format = 7837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com printable ? 7937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com "pc = %02x, sp = %d, curpos = %d, curchar = %08x (%c), bc = %s" : 8037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com "pc = %02x, sp = %d, curpos = %d, curchar = %08x .%c., bc = %s"; 8137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com PrintF(format, 82a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org pc - code_base, 83a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org stack_depth, 84a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org current_position, 8537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com current_char, 8637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com printable ? current_char : '.', 87a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org bytecode_name); 88ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org for (int i = 0; i < bytecode_length; i++) { 89a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org printf(", %02x", pc[i]); 90a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 9137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com printf(" "); 9237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com for (int i = 1; i < bytecode_length; i++) { 9337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com unsigned char b = pc[i]; 9437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com if (b < 127 && b >= 32) { 9537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com printf("%c", b); 9637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com } else { 9737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com printf("."); 9837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com } 9937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com } 100a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org printf("\n"); 101a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 102a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 103a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 104a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 105c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org#define BYTECODE(name) \ 106c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org case BC_##name: \ 107c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org TraceInterpreter(code_base, \ 108c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org pc, \ 109c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org static_cast<int>(backtrack_sp - backtrack_stack_base), \ 110c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org current, \ 111c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org current_char, \ 112c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org BC_##name##_LENGTH, \ 113a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org #name); 114a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#else 115c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org#define BYTECODE(name) \ 116a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org case BC_##name: 117a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#endif 118a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 119a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 120ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgstatic int32_t Load32Aligned(const byte* pc) { 1219085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org ASSERT((reinterpret_cast<intptr_t>(pc) & 3) == 0); 122ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org return *reinterpret_cast<const int32_t *>(pc); 123ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org} 124ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 125ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 126ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgstatic int32_t Load16Aligned(const byte* pc) { 1279085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org ASSERT((reinterpret_cast<intptr_t>(pc) & 1) == 0); 128ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org return *reinterpret_cast<const uint16_t *>(pc); 129ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org} 130ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 131a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 13286f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org// A simple abstraction over the backtracking stack used by the interpreter. 13386f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org// This backtracking stack does not grow automatically, but it ensures that the 13486f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org// the memory held by the stack is released or remembered in a cache if the 13586f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org// matching terminates. 13686f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.orgclass BacktrackStack { 13786f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org public: 138a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org explicit BacktrackStack() { 1396b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org data_ = NewArray<int>(kBacktrackStackSize); 14086f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org } 14186f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org 14286f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org ~BacktrackStack() { 1436b6df382019a622ba20133e47bbe2e6f323b013bdslomov@chromium.org DeleteArray(data_); 14486f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org } 14586f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org 14686f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org int* data() const { return data_; } 14786f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org 14886f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org int max_size() const { return kBacktrackStackSize; } 14986f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org 15086f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org private: 15186f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org static const int kBacktrackStackSize = 10000; 15286f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org 15386f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org int* data_; 15486f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org 15586f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org DISALLOW_COPY_AND_ASSIGN(BacktrackStack); 15686f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org}; 15786f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org 15886f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org 1598bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.orgtemplate <typename Char> 160394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.comstatic RegExpImpl::IrregexpResult RawMatch(Isolate* isolate, 161394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com const byte* code_base, 162394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com Vector<const Char> subject, 163394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com int* registers, 164394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com int current, 165394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com uint32_t current_char) { 166a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org const byte* pc = code_base; 16786f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org // BacktrackStack ensures that the memory allocated for the backtracking stack 16886f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org // is returned to the system or cached if there is no stack being cached at 16986f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org // the moment. 170a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org BacktrackStack backtrack_stack; 17186f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org int* backtrack_stack_base = backtrack_stack.data(); 1722abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org int* backtrack_sp = backtrack_stack_base; 17386f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org int backtrack_stack_space = backtrack_stack.max_size(); 174a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#ifdef DEBUG 175a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org if (FLAG_trace_regexp_bytecodes) { 176a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org PrintF("\n\nStart bytecode interpreter\n\n"); 177a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 178a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#endif 179a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org while (true) { 180ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org int32_t insn = Load32Aligned(pc); 181ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org switch (insn & BYTECODE_MASK) { 182a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org BYTECODE(BREAK) 183a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org UNREACHABLE(); 184394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com return RegExpImpl::RE_FAILURE; 185a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org BYTECODE(PUSH_CP) 186a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org if (--backtrack_stack_space < 0) { 187394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com return RegExpImpl::RE_EXCEPTION; 188a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 189ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org *backtrack_sp++ = current; 190a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org pc += BC_PUSH_CP_LENGTH; 191a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org break; 192a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org BYTECODE(PUSH_BT) 193a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org if (--backtrack_stack_space < 0) { 194394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com return RegExpImpl::RE_EXCEPTION; 195a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 196ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org *backtrack_sp++ = Load32Aligned(pc + 4); 197a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org pc += BC_PUSH_BT_LENGTH; 198a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org break; 199a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org BYTECODE(PUSH_REGISTER) 200a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org if (--backtrack_stack_space < 0) { 201394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com return RegExpImpl::RE_EXCEPTION; 202a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 203ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org *backtrack_sp++ = registers[insn >> BYTECODE_SHIFT]; 204a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org pc += BC_PUSH_REGISTER_LENGTH; 205a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org break; 206a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org BYTECODE(SET_REGISTER) 207ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org registers[insn >> BYTECODE_SHIFT] = Load32Aligned(pc + 4); 208a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org pc += BC_SET_REGISTER_LENGTH; 209a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org break; 210a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org BYTECODE(ADVANCE_REGISTER) 211ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org registers[insn >> BYTECODE_SHIFT] += Load32Aligned(pc + 4); 212a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org pc += BC_ADVANCE_REGISTER_LENGTH; 213a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org break; 214a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org BYTECODE(SET_REGISTER_TO_CP) 215ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org registers[insn >> BYTECODE_SHIFT] = current + Load32Aligned(pc + 4); 216a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org pc += BC_SET_REGISTER_TO_CP_LENGTH; 217a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org break; 218a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org BYTECODE(SET_CP_TO_REGISTER) 219ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org current = registers[insn >> BYTECODE_SHIFT]; 220a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org pc += BC_SET_CP_TO_REGISTER_LENGTH; 221a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org break; 222a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org BYTECODE(SET_REGISTER_TO_SP) 223c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org registers[insn >> BYTECODE_SHIFT] = 224c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org static_cast<int>(backtrack_sp - backtrack_stack_base); 225a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org pc += BC_SET_REGISTER_TO_SP_LENGTH; 226a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org break; 227a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org BYTECODE(SET_SP_TO_REGISTER) 2282abc450936e88b5c98a5e9d43ee6230ccc748272kasperl@chromium.org backtrack_sp = backtrack_stack_base + registers[insn >> BYTECODE_SHIFT]; 22986f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org backtrack_stack_space = backtrack_stack.max_size() - 230c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org static_cast<int>(backtrack_sp - backtrack_stack_base); 231a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org pc += BC_SET_SP_TO_REGISTER_LENGTH; 232a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org break; 233a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org BYTECODE(POP_CP) 234a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org backtrack_stack_space++; 235a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org --backtrack_sp; 236a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org current = *backtrack_sp; 237a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org pc += BC_POP_CP_LENGTH; 238a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org break; 239a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org BYTECODE(POP_BT) 240a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org backtrack_stack_space++; 241a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org --backtrack_sp; 242a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org pc = code_base + *backtrack_sp; 243a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org break; 244a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org BYTECODE(POP_REGISTER) 245a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org backtrack_stack_space++; 246a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org --backtrack_sp; 247ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org registers[insn >> BYTECODE_SHIFT] = *backtrack_sp; 248a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org pc += BC_POP_REGISTER_LENGTH; 249a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org break; 250a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org BYTECODE(FAIL) 251394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com return RegExpImpl::RE_FAILURE; 252a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org BYTECODE(SUCCEED) 253394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com return RegExpImpl::RE_SUCCESS; 254a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org BYTECODE(ADVANCE_CP) 255ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org current += insn >> BYTECODE_SHIFT; 256a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org pc += BC_ADVANCE_CP_LENGTH; 257a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org break; 258a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org BYTECODE(GOTO) 259ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org pc = code_base + Load32Aligned(pc + 4); 260a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org break; 261381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org BYTECODE(ADVANCE_CP_AND_GOTO) 262381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org current += insn >> BYTECODE_SHIFT; 263381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org pc = code_base + Load32Aligned(pc + 4); 264381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org break; 2658bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org BYTECODE(CHECK_GREEDY) 2668bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org if (current == backtrack_sp[-1]) { 2678bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org backtrack_sp--; 2688bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org backtrack_stack_space++; 269ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org pc = code_base + Load32Aligned(pc + 4); 2708bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org } else { 2718bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org pc += BC_CHECK_GREEDY_LENGTH; 2728bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org } 2738bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org break; 274a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org BYTECODE(LOAD_CURRENT_CHAR) { 275ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org int pos = current + (insn >> BYTECODE_SHIFT); 276a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org if (pos >= subject.length()) { 277ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org pc = code_base + Load32Aligned(pc + 4); 278a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } else { 279a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org current_char = subject[pos]; 280a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org pc += BC_LOAD_CURRENT_CHAR_LENGTH; 281a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 282a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org break; 283a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 2848bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org BYTECODE(LOAD_CURRENT_CHAR_UNCHECKED) { 285ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org int pos = current + (insn >> BYTECODE_SHIFT); 2868bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org current_char = subject[pos]; 2878bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org pc += BC_LOAD_CURRENT_CHAR_UNCHECKED_LENGTH; 2888bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org break; 2898bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org } 29037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com BYTECODE(LOAD_2_CURRENT_CHARS) { 291ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org int pos = current + (insn >> BYTECODE_SHIFT); 29237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com if (pos + 2 > subject.length()) { 293ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org pc = code_base + Load32Aligned(pc + 4); 29437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com } else { 29537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com Char next = subject[pos + 1]; 29637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com current_char = 29737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com (subject[pos] | (next << (kBitsPerByte * sizeof(Char)))); 29837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com pc += BC_LOAD_2_CURRENT_CHARS_LENGTH; 29937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com } 30037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com break; 30137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com } 30237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com BYTECODE(LOAD_2_CURRENT_CHARS_UNCHECKED) { 303ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org int pos = current + (insn >> BYTECODE_SHIFT); 30437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com Char next = subject[pos + 1]; 30537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com current_char = (subject[pos] | (next << (kBitsPerByte * sizeof(Char)))); 30637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com pc += BC_LOAD_2_CURRENT_CHARS_UNCHECKED_LENGTH; 30737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com break; 30837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com } 30937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com BYTECODE(LOAD_4_CURRENT_CHARS) { 31037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com ASSERT(sizeof(Char) == 1); 311ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org int pos = current + (insn >> BYTECODE_SHIFT); 31237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com if (pos + 4 > subject.length()) { 313ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org pc = code_base + Load32Aligned(pc + 4); 31437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com } else { 31537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com Char next1 = subject[pos + 1]; 31637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com Char next2 = subject[pos + 2]; 31737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com Char next3 = subject[pos + 3]; 31837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com current_char = (subject[pos] | 31937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com (next1 << 8) | 32037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com (next2 << 16) | 32137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com (next3 << 24)); 32237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com pc += BC_LOAD_4_CURRENT_CHARS_LENGTH; 32337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com } 32437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com break; 32537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com } 32637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com BYTECODE(LOAD_4_CURRENT_CHARS_UNCHECKED) { 32737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com ASSERT(sizeof(Char) == 1); 328ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org int pos = current + (insn >> BYTECODE_SHIFT); 32937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com Char next1 = subject[pos + 1]; 33037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com Char next2 = subject[pos + 2]; 33137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com Char next3 = subject[pos + 3]; 33237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com current_char = (subject[pos] | 33337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com (next1 << 8) | 33437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com (next2 << 16) | 33537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com (next3 << 24)); 33637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com pc += BC_LOAD_4_CURRENT_CHARS_UNCHECKED_LENGTH; 33737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com break; 33837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com } 339ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org BYTECODE(CHECK_4_CHARS) { 340ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org uint32_t c = Load32Aligned(pc + 4); 341ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org if (c == current_char) { 342ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org pc = code_base + Load32Aligned(pc + 8); 343ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org } else { 344ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org pc += BC_CHECK_4_CHARS_LENGTH; 345ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org } 346ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org break; 347ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org } 348a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org BYTECODE(CHECK_CHAR) { 349ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org uint32_t c = (insn >> BYTECODE_SHIFT); 350a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org if (c == current_char) { 351ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org pc = code_base + Load32Aligned(pc + 4); 352a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } else { 353a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org pc += BC_CHECK_CHAR_LENGTH; 354a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 355a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org break; 356a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 357ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org BYTECODE(CHECK_NOT_4_CHARS) { 358ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org uint32_t c = Load32Aligned(pc + 4); 359ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org if (c != current_char) { 360ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org pc = code_base + Load32Aligned(pc + 8); 361ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org } else { 362ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org pc += BC_CHECK_NOT_4_CHARS_LENGTH; 363ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org } 364ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org break; 365ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org } 366a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org BYTECODE(CHECK_NOT_CHAR) { 367ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org uint32_t c = (insn >> BYTECODE_SHIFT); 368a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org if (c != current_char) { 369ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org pc = code_base + Load32Aligned(pc + 4); 370a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } else { 371a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org pc += BC_CHECK_NOT_CHAR_LENGTH; 372a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 373a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org break; 374a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 375ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org BYTECODE(AND_CHECK_4_CHARS) { 376ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org uint32_t c = Load32Aligned(pc + 4); 377ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org if (c == (current_char & Load32Aligned(pc + 8))) { 378ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org pc = code_base + Load32Aligned(pc + 12); 379ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org } else { 380ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org pc += BC_AND_CHECK_4_CHARS_LENGTH; 381ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org } 382ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org break; 383ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org } 38437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com BYTECODE(AND_CHECK_CHAR) { 385ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org uint32_t c = (insn >> BYTECODE_SHIFT); 386ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org if (c == (current_char & Load32Aligned(pc + 4))) { 387ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org pc = code_base + Load32Aligned(pc + 8); 388a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } else { 38937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com pc += BC_AND_CHECK_CHAR_LENGTH; 390a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 391a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org break; 392a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 393ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org BYTECODE(AND_CHECK_NOT_4_CHARS) { 394ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org uint32_t c = Load32Aligned(pc + 4); 395ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org if (c != (current_char & Load32Aligned(pc + 8))) { 396ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org pc = code_base + Load32Aligned(pc + 12); 397ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org } else { 398ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org pc += BC_AND_CHECK_NOT_4_CHARS_LENGTH; 399ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org } 400ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org break; 401ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org } 40237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com BYTECODE(AND_CHECK_NOT_CHAR) { 403ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org uint32_t c = (insn >> BYTECODE_SHIFT); 404ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org if (c != (current_char & Load32Aligned(pc + 4))) { 405ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org pc = code_base + Load32Aligned(pc + 8); 40637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com } else { 40737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com pc += BC_AND_CHECK_NOT_CHAR_LENGTH; 40837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com } 40937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com break; 41037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com } 41137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com BYTECODE(MINUS_AND_CHECK_NOT_CHAR) { 412ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org uint32_t c = (insn >> BYTECODE_SHIFT); 413ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org uint32_t minus = Load16Aligned(pc + 4); 414ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org uint32_t mask = Load16Aligned(pc + 6); 41537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com if (c != ((current_char - minus) & mask)) { 416ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org pc = code_base + Load32Aligned(pc + 8); 417a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } else { 41837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com pc += BC_MINUS_AND_CHECK_NOT_CHAR_LENGTH; 419a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 420a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org break; 421a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 4221456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org BYTECODE(CHECK_CHAR_IN_RANGE) { 4231456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org uint32_t from = Load16Aligned(pc + 4); 4241456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org uint32_t to = Load16Aligned(pc + 6); 4251456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org if (from <= current_char && current_char <= to) { 4261456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org pc = code_base + Load32Aligned(pc + 8); 4271456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org } else { 4281456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org pc += BC_CHECK_CHAR_IN_RANGE_LENGTH; 4291456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org } 4301456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org break; 4311456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org } 4321456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org BYTECODE(CHECK_CHAR_NOT_IN_RANGE) { 4331456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org uint32_t from = Load16Aligned(pc + 4); 4341456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org uint32_t to = Load16Aligned(pc + 6); 4351456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org if (from > current_char || current_char > to) { 4361456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org pc = code_base + Load32Aligned(pc + 8); 4371456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org } else { 4381456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org pc += BC_CHECK_CHAR_NOT_IN_RANGE_LENGTH; 4391456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org } 4401456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org break; 4411456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org } 4421456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org BYTECODE(CHECK_BIT_IN_TABLE) { 4431456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org int mask = RegExpMacroAssembler::kTableMask; 4441456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org byte b = pc[8 + ((current_char & mask) >> kBitsPerByteLog2)]; 4451456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org int bit = (current_char & (kBitsPerByte - 1)); 4461456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org if ((b & (1 << bit)) != 0) { 4471456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org pc = code_base + Load32Aligned(pc + 4); 4481456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org } else { 4491456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org pc += BC_CHECK_BIT_IN_TABLE_LENGTH; 4501456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org } 4511456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org break; 4521456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org } 453a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org BYTECODE(CHECK_LT) { 454ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org uint32_t limit = (insn >> BYTECODE_SHIFT); 455a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org if (current_char < limit) { 456ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org pc = code_base + Load32Aligned(pc + 4); 457a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } else { 458a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org pc += BC_CHECK_LT_LENGTH; 459a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 460a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org break; 461a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 462a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org BYTECODE(CHECK_GT) { 463ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org uint32_t limit = (insn >> BYTECODE_SHIFT); 464a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org if (current_char > limit) { 465ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org pc = code_base + Load32Aligned(pc + 4); 466a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } else { 467a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org pc += BC_CHECK_GT_LENGTH; 468a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 469a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org break; 470a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 471a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org BYTECODE(CHECK_REGISTER_LT) 472ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org if (registers[insn >> BYTECODE_SHIFT] < Load32Aligned(pc + 4)) { 473ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org pc = code_base + Load32Aligned(pc + 8); 474a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } else { 475a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org pc += BC_CHECK_REGISTER_LT_LENGTH; 476a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 477a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org break; 478a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org BYTECODE(CHECK_REGISTER_GE) 479ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org if (registers[insn >> BYTECODE_SHIFT] >= Load32Aligned(pc + 4)) { 480ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org pc = code_base + Load32Aligned(pc + 8); 481a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } else { 482a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org pc += BC_CHECK_REGISTER_GE_LENGTH; 483a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 484a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org break; 4853291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org BYTECODE(CHECK_REGISTER_EQ_POS) 486ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org if (registers[insn >> BYTECODE_SHIFT] == current) { 487ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org pc = code_base + Load32Aligned(pc + 4); 4883291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org } else { 4893291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org pc += BC_CHECK_REGISTER_EQ_POS_LENGTH; 4903291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org } 4913291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org break; 492a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org BYTECODE(CHECK_NOT_REGS_EQUAL) 493ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org if (registers[insn >> BYTECODE_SHIFT] == 494ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org registers[Load32Aligned(pc + 4)]) { 495a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org pc += BC_CHECK_NOT_REGS_EQUAL_LENGTH; 496a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } else { 497ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org pc = code_base + Load32Aligned(pc + 8); 498a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 499a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org break; 500a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org BYTECODE(CHECK_NOT_BACK_REF) { 501ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org int from = registers[insn >> BYTECODE_SHIFT]; 502ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org int len = registers[(insn >> BYTECODE_SHIFT) + 1] - from; 503a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org if (from < 0 || len <= 0) { 504a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org pc += BC_CHECK_NOT_BACK_REF_LENGTH; 505a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org break; 506a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 507a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org if (current + len > subject.length()) { 508ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org pc = code_base + Load32Aligned(pc + 4); 509a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org break; 510a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } else { 511a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org int i; 512a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org for (i = 0; i < len; i++) { 513a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org if (subject[from + i] != subject[current + i]) { 514ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org pc = code_base + Load32Aligned(pc + 4); 515a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org break; 516a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 517a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 518a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org if (i < len) break; 519a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org current += len; 520a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 521a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org pc += BC_CHECK_NOT_BACK_REF_LENGTH; 522a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org break; 523a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 524a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org BYTECODE(CHECK_NOT_BACK_REF_NO_CASE) { 525ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org int from = registers[insn >> BYTECODE_SHIFT]; 526ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org int len = registers[(insn >> BYTECODE_SHIFT) + 1] - from; 527a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org if (from < 0 || len <= 0) { 528a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org pc += BC_CHECK_NOT_BACK_REF_NO_CASE_LENGTH; 529a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org break; 530a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 531a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org if (current + len > subject.length()) { 532ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org pc = code_base + Load32Aligned(pc + 4); 533a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org break; 534a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } else { 535ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org if (BackRefMatchesNoCase(isolate->interp_canonicalize_mapping(), 536ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org from, current, len, subject)) { 5378bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org current += len; 538a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org pc += BC_CHECK_NOT_BACK_REF_NO_CASE_LENGTH; 539a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } else { 540ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org pc = code_base + Load32Aligned(pc + 4); 541a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 542a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 543a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org break; 544a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 545ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org BYTECODE(CHECK_AT_START) 546ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org if (current == 0) { 547ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org pc = code_base + Load32Aligned(pc + 4); 548ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org } else { 549ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org pc += BC_CHECK_AT_START_LENGTH; 550ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org } 551ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org break; 552a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org BYTECODE(CHECK_NOT_AT_START) 553a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org if (current == 0) { 554a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org pc += BC_CHECK_NOT_AT_START_LENGTH; 555a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } else { 556ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org pc = code_base + Load32Aligned(pc + 4); 557a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 558a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org break; 5594a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org BYTECODE(SET_CURRENT_POSITION_FROM_END) { 5604a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org int by = static_cast<uint32_t>(insn) >> BYTECODE_SHIFT; 5614a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org if (subject.length() - current > by) { 5624a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org current = subject.length() - by; 5634a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org current_char = subject[current - 1]; 5644a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org } 5654a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org pc += BC_SET_CURRENT_POSITION_FROM_END_LENGTH; 5664a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org break; 5674a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org } 568a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org default: 569a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org UNREACHABLE(); 570a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org break; 571a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 572a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 573a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 574a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 575a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 576394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.comRegExpImpl::IrregexpResult IrregexpInterpreter::Match( 577394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com Isolate* isolate, 578394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com Handle<ByteArray> code_array, 579394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com Handle<String> subject, 580394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com int* registers, 581394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com int start_position) { 582bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org ASSERT(subject->IsFlat()); 583a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 58479e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org DisallowHeapAllocation no_gc; 585a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org const byte* code_base = code_array->GetDataStartAddress(); 586a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org uc16 previous_char = '\n'; 587ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org String::FlatContent subject_content = subject->GetFlatContent(); 588ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org if (subject_content.IsAscii()) { 58959297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org Vector<const uint8_t> subject_vector = subject_content.ToOneByteVector(); 5908bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org if (start_position != 0) previous_char = subject_vector[start_position - 1]; 591ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return RawMatch(isolate, 592ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org code_base, 5938bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org subject_vector, 5948bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org registers, 5958bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org start_position, 5968bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org previous_char); 5978bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org } else { 598ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org ASSERT(subject_content.IsTwoByte()); 599ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org Vector<const uc16> subject_vector = subject_content.ToUC16Vector(); 6008bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org if (start_position != 0) previous_char = subject_vector[start_position - 1]; 601ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return RawMatch(isolate, 602ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org code_base, 6038bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org subject_vector, 6048bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org registers, 6058bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org start_position, 6068bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org previous_char); 6078bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org } 608a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 609a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 610a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} } // namespace v8::internal 611