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