1381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org// Copyright 2008-2009 the V8 project authors. All rights reserved. 2a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// Redistribution and use in source and binary forms, with or without 3a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// modification, are permitted provided that the following conditions are 4a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// met: 5a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// 6a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// * Redistributions of source code must retain the above copyright 7a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// notice, this list of conditions and the following disclaimer. 8a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// * Redistributions in binary form must reproduce the above 9a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// copyright notice, this list of conditions and the following 10a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// disclaimer in the documentation and/or other materials provided 11a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// with the distribution. 12a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// * Neither the name of Google Inc. nor the names of its 13a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// contributors may be used to endorse or promote products derived 14a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// from this software without specific prior written permission. 15a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// 16a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 28a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#include "v8.h" 29a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#include "ast.h" 30a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#include "bytecodes-irregexp.h" 31a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#include "regexp-macro-assembler.h" 32a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#include "regexp-macro-assembler-irregexp.h" 33a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#include "regexp-macro-assembler-irregexp-inl.h" 34a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 35a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 3671affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace v8 { 3771affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace internal { 38a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 39c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org#ifdef V8_INTERPRETED_REGEXP 40a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 415a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.orgRegExpMacroAssemblerIrregexp::RegExpMacroAssemblerIrregexp(Vector<byte> buffer, 425a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org Zone* zone) 435a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org : RegExpMacroAssembler(zone), 445a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org buffer_(buffer), 45a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org pc_(0), 46381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org own_buffer_(false), 471fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org advance_current_end_(kInvalidPC), 481fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org isolate_(zone->isolate()) { } 49a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 50a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 51a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgRegExpMacroAssemblerIrregexp::~RegExpMacroAssemblerIrregexp() { 5237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com if (backtrack_.is_linked()) backtrack_.Unuse(); 53eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org if (own_buffer_) buffer_.Dispose(); 54a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 55a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 56a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 57a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgRegExpMacroAssemblerIrregexp::IrregexpImplementation 58a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgRegExpMacroAssemblerIrregexp::Implementation() { 59a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org return kBytecodeImplementation; 60a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 61a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 62a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 63a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid RegExpMacroAssemblerIrregexp::Bind(Label* l) { 64381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org advance_current_end_ = kInvalidPC; 65a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org ASSERT(!l->is_bound()); 66a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org if (l->is_linked()) { 67a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org int pos = l->pos(); 68a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org while (pos != 0) { 69a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org int fixup = pos; 70ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org pos = *reinterpret_cast<int32_t*>(buffer_.start() + fixup); 71ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org *reinterpret_cast<uint32_t*>(buffer_.start() + fixup) = pc_; 72a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 73a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 74a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org l->bind_to(pc_); 75a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 76a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 77a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 78a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid RegExpMacroAssemblerIrregexp::EmitOrLink(Label* l) { 798bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org if (l == NULL) l = &backtrack_; 80a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org if (l->is_bound()) { 81a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org Emit32(l->pos()); 82a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } else { 83a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org int pos = 0; 84a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org if (l->is_linked()) { 85a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org pos = l->pos(); 86a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 87a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org l->link_to(pc_); 88a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org Emit32(pos); 89a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 90a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 91a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 92a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 93a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid RegExpMacroAssemblerIrregexp::PopRegister(int register_index) { 94ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org ASSERT(register_index >= 0); 95ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org ASSERT(register_index <= kMaxRegister); 96ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org Emit(BC_POP_REGISTER, register_index); 97a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 98a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 99a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 1003291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgvoid RegExpMacroAssemblerIrregexp::PushRegister( 1013291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org int register_index, 1023291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org StackCheckFlag check_stack_limit) { 103a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org ASSERT(register_index >= 0); 104ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org ASSERT(register_index <= kMaxRegister); 105ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org Emit(BC_PUSH_REGISTER, register_index); 106a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 107a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 108a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 109a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid RegExpMacroAssemblerIrregexp::WriteCurrentPositionToRegister( 1108bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org int register_index, int cp_offset) { 111a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org ASSERT(register_index >= 0); 112ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org ASSERT(register_index <= kMaxRegister); 113ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org Emit(BC_SET_REGISTER_TO_CP, register_index); 1148bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org Emit32(cp_offset); // Current position offset. 115a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 116a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 117a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 118ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgvoid RegExpMacroAssemblerIrregexp::ClearRegisters(int reg_from, int reg_to) { 119ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org ASSERT(reg_from <= reg_to); 120ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org for (int reg = reg_from; reg <= reg_to; reg++) { 121ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org SetRegister(reg, -1); 122ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org } 1233291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org} 1243291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org 1253291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org 126a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid RegExpMacroAssemblerIrregexp::ReadCurrentPositionFromRegister( 127a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org int register_index) { 128a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org ASSERT(register_index >= 0); 129ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org ASSERT(register_index <= kMaxRegister); 130ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org Emit(BC_SET_CP_TO_REGISTER, register_index); 131a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 132a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 133a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 134a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid RegExpMacroAssemblerIrregexp::WriteStackPointerToRegister( 135a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org int register_index) { 136a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org ASSERT(register_index >= 0); 137ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org ASSERT(register_index <= kMaxRegister); 138ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org Emit(BC_SET_REGISTER_TO_SP, register_index); 139a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 140a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 141a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 142a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid RegExpMacroAssemblerIrregexp::ReadStackPointerFromRegister( 143a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org int register_index) { 144a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org ASSERT(register_index >= 0); 145ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org ASSERT(register_index <= kMaxRegister); 146ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org Emit(BC_SET_SP_TO_REGISTER, register_index); 147a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 148a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 149a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 1504a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.orgvoid RegExpMacroAssemblerIrregexp::SetCurrentPositionFromEnd(int by) { 1514a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org ASSERT(is_uint24(by)); 1524a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org Emit(BC_SET_CURRENT_POSITION_FROM_END, by); 1534a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org} 1544a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org 1554a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org 156a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid RegExpMacroAssemblerIrregexp::SetRegister(int register_index, int to) { 157a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org ASSERT(register_index >= 0); 158ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org ASSERT(register_index <= kMaxRegister); 159ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org Emit(BC_SET_REGISTER, register_index); 160a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org Emit32(to); 161a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 162a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 163a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 164a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid RegExpMacroAssemblerIrregexp::AdvanceRegister(int register_index, int by) { 165a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org ASSERT(register_index >= 0); 166ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org ASSERT(register_index <= kMaxRegister); 167ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org Emit(BC_ADVANCE_REGISTER, register_index); 168a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org Emit32(by); 169a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 170a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 171a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 172a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid RegExpMacroAssemblerIrregexp::PopCurrentPosition() { 173ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org Emit(BC_POP_CP, 0); 174a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 175a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 176a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 177a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid RegExpMacroAssemblerIrregexp::PushCurrentPosition() { 178ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org Emit(BC_PUSH_CP, 0); 179a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 180a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 181a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 182a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid RegExpMacroAssemblerIrregexp::Backtrack() { 183ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org Emit(BC_POP_BT, 0); 184a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 185a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 186a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 187a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid RegExpMacroAssemblerIrregexp::GoTo(Label* l) { 188381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org if (advance_current_end_ == pc_) { 189381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org // Combine advance current and goto. 190381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org pc_ = advance_current_start_; 191381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org Emit(BC_ADVANCE_CP_AND_GOTO, advance_current_offset_); 192381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org EmitOrLink(l); 193381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org advance_current_end_ = kInvalidPC; 194381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org } else { 195381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org // Regular goto. 196381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org Emit(BC_GOTO, 0); 197381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org EmitOrLink(l); 198381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org } 199a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 200a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 201a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 202a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid RegExpMacroAssemblerIrregexp::PushBacktrack(Label* l) { 203ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org Emit(BC_PUSH_BT, 0); 204a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org EmitOrLink(l); 205a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 206a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 207a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 20815613d0b07bac19e341905ff374c930420b3b9c8mstarzinger@chromium.orgbool RegExpMacroAssemblerIrregexp::Succeed() { 209ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org Emit(BC_SUCCEED, 0); 21015613d0b07bac19e341905ff374c930420b3b9c8mstarzinger@chromium.org return false; // Restart matching for global regexp not supported. 211a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 212a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 213a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 214a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid RegExpMacroAssemblerIrregexp::Fail() { 215ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org Emit(BC_FAIL, 0); 216a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 217a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 218a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 219a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid RegExpMacroAssemblerIrregexp::AdvanceCurrentPosition(int by) { 220ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org ASSERT(by >= kMinCPOffset); 221ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org ASSERT(by <= kMaxCPOffset); 222381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org advance_current_start_ = pc_; 223381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org advance_current_offset_ = by; 224ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org Emit(BC_ADVANCE_CP, by); 225381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org advance_current_end_ = pc_; 226a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 227a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 228a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 2298bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.orgvoid RegExpMacroAssemblerIrregexp::CheckGreedyLoop( 2308bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org Label* on_tos_equals_current_position) { 231ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org Emit(BC_CHECK_GREEDY, 0); 2328bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org EmitOrLink(on_tos_equals_current_position); 233a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 234a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 235a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 236a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid RegExpMacroAssemblerIrregexp::LoadCurrentCharacter(int cp_offset, 23737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com Label* on_failure, 23837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com bool check_bounds, 23937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com int characters) { 240ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org ASSERT(cp_offset >= kMinCPOffset); 241ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org ASSERT(cp_offset <= kMaxCPOffset); 24237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com int bytecode; 24337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com if (check_bounds) { 24437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com if (characters == 4) { 24537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com bytecode = BC_LOAD_4_CURRENT_CHARS; 24637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com } else if (characters == 2) { 24737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com bytecode = BC_LOAD_2_CURRENT_CHARS; 24837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com } else { 24937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com ASSERT(characters == 1); 25037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com bytecode = BC_LOAD_CURRENT_CHAR; 25137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com } 25237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com } else { 25337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com if (characters == 4) { 25437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com bytecode = BC_LOAD_4_CURRENT_CHARS_UNCHECKED; 25537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com } else if (characters == 2) { 25637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com bytecode = BC_LOAD_2_CURRENT_CHARS_UNCHECKED; 25737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com } else { 25837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com ASSERT(characters == 1); 25937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com bytecode = BC_LOAD_CURRENT_CHAR_UNCHECKED; 26037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com } 26137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com } 262ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org Emit(bytecode, cp_offset); 26337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com if (check_bounds) EmitOrLink(on_failure); 2648bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org} 2658bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org 2668bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org 267a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid RegExpMacroAssemblerIrregexp::CheckCharacterLT(uc16 limit, 268a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org Label* on_less) { 269ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org Emit(BC_CHECK_LT, limit); 270a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org EmitOrLink(on_less); 271a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 272a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 273a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 274a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid RegExpMacroAssemblerIrregexp::CheckCharacterGT(uc16 limit, 275a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org Label* on_greater) { 276ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org Emit(BC_CHECK_GT, limit); 277a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org EmitOrLink(on_greater); 278a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 279a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 280a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 28137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.comvoid RegExpMacroAssemblerIrregexp::CheckCharacter(uint32_t c, Label* on_equal) { 282ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org if (c > MAX_FIRST_ARG) { 283ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org Emit(BC_CHECK_4_CHARS, 0); 284ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org Emit32(c); 285ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org } else { 286ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org Emit(BC_CHECK_CHAR, c); 287ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org } 288a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org EmitOrLink(on_equal); 289a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 290a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 291a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 292ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.orgvoid RegExpMacroAssemblerIrregexp::CheckAtStart(Label* on_at_start) { 293ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org Emit(BC_CHECK_AT_START, 0); 294ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org EmitOrLink(on_at_start); 295ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org} 296ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 297ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org 298a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid RegExpMacroAssemblerIrregexp::CheckNotAtStart(Label* on_not_at_start) { 299ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org Emit(BC_CHECK_NOT_AT_START, 0); 300a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org EmitOrLink(on_not_at_start); 301a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 302a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 303a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 30437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.comvoid RegExpMacroAssemblerIrregexp::CheckNotCharacter(uint32_t c, 305a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org Label* on_not_equal) { 306ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org if (c > MAX_FIRST_ARG) { 307ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org Emit(BC_CHECK_NOT_4_CHARS, 0); 308ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org Emit32(c); 309ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org } else { 310ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org Emit(BC_CHECK_NOT_CHAR, c); 311ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org } 312a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org EmitOrLink(on_not_equal); 313a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 314a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 315a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 31637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.comvoid RegExpMacroAssemblerIrregexp::CheckCharacterAfterAnd( 31737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com uint32_t c, 31837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com uint32_t mask, 31937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com Label* on_equal) { 320ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org if (c > MAX_FIRST_ARG) { 321ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org Emit(BC_AND_CHECK_4_CHARS, 0); 322ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org Emit32(c); 323ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org } else { 324ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org Emit(BC_AND_CHECK_CHAR, c); 325ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org } 32637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com Emit32(mask); 32737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com EmitOrLink(on_equal); 32837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com} 32937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com 33037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com 33137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.comvoid RegExpMacroAssemblerIrregexp::CheckNotCharacterAfterAnd( 33237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com uint32_t c, 33337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com uint32_t mask, 334a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org Label* on_not_equal) { 335ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org if (c > MAX_FIRST_ARG) { 336ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org Emit(BC_AND_CHECK_NOT_4_CHARS, 0); 337ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org Emit32(c); 338ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org } else { 339ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org Emit(BC_AND_CHECK_NOT_CHAR, c); 340ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org } 34137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com Emit32(mask); 342a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org EmitOrLink(on_not_equal); 343a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 344a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 345a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 34637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.comvoid RegExpMacroAssemblerIrregexp::CheckNotCharacterAfterMinusAnd( 347a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org uc16 c, 34837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com uc16 minus, 349a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org uc16 mask, 350a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org Label* on_not_equal) { 351ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org Emit(BC_MINUS_AND_CHECK_NOT_CHAR, c); 35237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com Emit16(minus); 353a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org Emit16(mask); 354a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org EmitOrLink(on_not_equal); 355a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 356a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 357a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 3581456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.orgvoid RegExpMacroAssemblerIrregexp::CheckCharacterInRange( 3591456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org uc16 from, 3601456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org uc16 to, 3611456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org Label* on_in_range) { 3621456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org Emit(BC_CHECK_CHAR_IN_RANGE, 0); 3631456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org Emit16(from); 3641456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org Emit16(to); 3651456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org EmitOrLink(on_in_range); 3661456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org} 3671456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org 3681456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org 3691456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.orgvoid RegExpMacroAssemblerIrregexp::CheckCharacterNotInRange( 3701456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org uc16 from, 3711456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org uc16 to, 3721456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org Label* on_not_in_range) { 3731456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org Emit(BC_CHECK_CHAR_NOT_IN_RANGE, 0); 3741456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org Emit16(from); 3751456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org Emit16(to); 3761456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org EmitOrLink(on_not_in_range); 3771456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org} 3781456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org 3791456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org 3801456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.orgvoid RegExpMacroAssemblerIrregexp::CheckBitInTable( 3811456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org Handle<ByteArray> table, Label* on_bit_set) { 3821456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org Emit(BC_CHECK_BIT_IN_TABLE, 0); 3831456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org EmitOrLink(on_bit_set); 3841456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org for (int i = 0; i < kTableSize; i += kBitsPerByte) { 3851456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org int byte = 0; 3861456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org for (int j = 0; j < kBitsPerByte; j++) { 3871456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org if (table->get(i + j) != 0) byte |= 1 << j; 3881456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org } 3891456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org Emit8(byte); 3901456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org } 3911456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org} 3921456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org 3931456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org 394a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid RegExpMacroAssemblerIrregexp::CheckNotBackReference(int start_reg, 3958bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org Label* on_not_equal) { 396ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org ASSERT(start_reg >= 0); 397ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org ASSERT(start_reg <= kMaxRegister); 398ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org Emit(BC_CHECK_NOT_BACK_REF, start_reg); 399a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org EmitOrLink(on_not_equal); 400a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 401a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 402a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 403a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid RegExpMacroAssemblerIrregexp::CheckNotBackReferenceIgnoreCase( 404a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org int start_reg, 405a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org Label* on_not_equal) { 406ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org ASSERT(start_reg >= 0); 407ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org ASSERT(start_reg <= kMaxRegister); 408ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org Emit(BC_CHECK_NOT_BACK_REF_NO_CASE, start_reg); 409a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org EmitOrLink(on_not_equal); 410a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 411a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 412a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 413a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid RegExpMacroAssemblerIrregexp::IfRegisterLT(int register_index, 414a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org int comparand, 415a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org Label* on_less_than) { 416ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org ASSERT(register_index >= 0); 417ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org ASSERT(register_index <= kMaxRegister); 418ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org Emit(BC_CHECK_REGISTER_LT, register_index); 419ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org Emit32(comparand); 420a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org EmitOrLink(on_less_than); 421a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 422a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 423a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 424a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid RegExpMacroAssemblerIrregexp::IfRegisterGE(int register_index, 425a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org int comparand, 426a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org Label* on_greater_or_equal) { 427ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org ASSERT(register_index >= 0); 428ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org ASSERT(register_index <= kMaxRegister); 429ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org Emit(BC_CHECK_REGISTER_GE, register_index); 430ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org Emit32(comparand); 431a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org EmitOrLink(on_greater_or_equal); 432a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 433a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 434a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 4353291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgvoid RegExpMacroAssemblerIrregexp::IfRegisterEqPos(int register_index, 4363291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org Label* on_eq) { 437ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org ASSERT(register_index >= 0); 438ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org ASSERT(register_index <= kMaxRegister); 439ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org Emit(BC_CHECK_REGISTER_EQ_POS, register_index); 4403291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org EmitOrLink(on_eq); 4413291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org} 4423291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org 4433291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org 44483a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.orgHandle<HeapObject> RegExpMacroAssemblerIrregexp::GetCode( 44583a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org Handle<String> source) { 4468bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org Bind(&backtrack_); 447ddb913d619a6e602f53dd17b0fe71158ce66888dager@chromium.org Emit(BC_POP_BT, 0); 4481fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org Handle<ByteArray> array = isolate_->factory()->NewByteArray(length()); 449a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org Copy(array->GetDataStartAddress()); 450a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org return array; 451a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 452a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 453a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 454a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgint RegExpMacroAssemblerIrregexp::length() { 455a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org return pc_; 456a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 457a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 458a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 459a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid RegExpMacroAssemblerIrregexp::Copy(Address a) { 460e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org OS::MemCopy(a, buffer_.start(), length()); 461a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 462a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 463a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 464a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgvoid RegExpMacroAssemblerIrregexp::Expand() { 465a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org bool old_buffer_was_our_own = own_buffer_; 466a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org Vector<byte> old_buffer = buffer_; 467a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org buffer_ = Vector<byte>::New(old_buffer.length() * 2); 468a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org own_buffer_ = true; 469e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org OS::MemCopy(buffer_.start(), old_buffer.start(), old_buffer.length()); 470a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org if (old_buffer_was_our_own) { 471a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org old_buffer.Dispose(); 472a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 473a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 474a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 475c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org#endif // V8_INTERPRETED_REGEXP 476a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 477a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} } // namespace v8::internal 478