115613d0b07bac19e341905ff374c930420b3b9c8mstarzinger@chromium.org// Copyright 2012 the V8 project authors. All rights reserved. 29a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Redistribution and use in source and binary forms, with or without 39a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// modification, are permitted provided that the following conditions are 49a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// met: 59a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// 69a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// * Redistributions of source code must retain the above copyright 79a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// notice, this list of conditions and the following disclaimer. 89a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// * Redistributions in binary form must reproduce the above 99a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// copyright notice, this list of conditions and the following 109a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// disclaimer in the documentation and/or other materials provided 119a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// with the distribution. 129a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// * Neither the name of Google Inc. nor the names of its 139a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// contributors may be used to endorse or promote products derived 149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// from this software without specific prior written permission. 159a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// 169a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 189a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 199a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 209a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 219a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 229a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 239a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 249a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 259a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 269a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 279a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 28a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#include "v8.h" 29a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#include "ast.h" 30a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#include "assembler.h" 31911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org#include "regexp-stack.h" 32a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org#include "regexp-macro-assembler.h" 33c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org#include "simulator.h" 34a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 3571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace v8 { 3671affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace internal { 37a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 387028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.orgRegExpMacroAssembler::RegExpMacroAssembler(Zone* zone) 3915613d0b07bac19e341905ff374c930420b3b9c8mstarzinger@chromium.org : slow_safe_compiler_(false), 407028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org global_mode_(NOT_GLOBAL), 417028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org zone_(zone) { 42a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 43a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 44a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 45a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgRegExpMacroAssembler::~RegExpMacroAssembler() { 46a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 47a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 48a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 4918ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgbool RegExpMacroAssembler::CanReadUnaligned() { 5018ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org#ifdef V8_HOST_CAN_READ_UNALIGNED 5118ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org return true; 5218ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org#else 5318ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org return false; 5418ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org#endif 5518ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org} 5618ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org 5718ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org 58c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org#ifndef V8_INTERPRETED_REGEXP // Avoid unused code, e.g., on ARM. 59911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 607028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.orgNativeRegExpMacroAssembler::NativeRegExpMacroAssembler(Zone* zone) 617028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org : RegExpMacroAssembler(zone) { 62911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org} 63a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 64a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 65911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.orgNativeRegExpMacroAssembler::~NativeRegExpMacroAssembler() { 66911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org} 67a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 6818ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org 6918ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgbool NativeRegExpMacroAssembler::CanReadUnaligned() { 7089e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org return FLAG_enable_unaligned_accesses && !slow_safe(); 7118ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org} 7218ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org 73911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.orgconst byte* NativeRegExpMacroAssembler::StringCharacterPosition( 74911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org String* subject, 75911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org int start_index) { 76911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org // Not just flat, but ultra flat. 77911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org ASSERT(subject->IsExternalString() || subject->IsSeqString()); 78911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org ASSERT(start_index >= 0); 79911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org ASSERT(start_index <= subject->length()); 808e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org if (subject->IsOneByteRepresentation()) { 81911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org const byte* address; 82911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org if (StringShape(subject).IsExternal()) { 8359297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org const uint8_t* data = ExternalAsciiString::cast(subject)->GetChars(); 84911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org address = reinterpret_cast<const byte*>(data); 85911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org } else { 86fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org ASSERT(subject->IsSeqOneByteString()); 8759297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.org const uint8_t* data = SeqOneByteString::cast(subject)->GetChars(); 88911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org address = reinterpret_cast<const byte*>(data); 89a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 90911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org return address + start_index; 91911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org } 92911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org const uc16* data; 93911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org if (StringShape(subject).IsExternal()) { 940ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry data = ExternalTwoByteString::cast(subject)->GetChars(); 95911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org } else { 96911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org ASSERT(subject->IsSeqTwoByteString()); 97911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org data = SeqTwoByteString::cast(subject)->GetChars(); 98a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org } 99911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org return reinterpret_cast<const byte*>(data + start_index); 100a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 101a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org 1023291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org 103911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.orgNativeRegExpMacroAssembler::Result NativeRegExpMacroAssembler::Match( 104911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org Handle<Code> regexp_code, 105911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org Handle<String> subject, 106911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org int* offsets_vector, 107911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org int offsets_vector_length, 108ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org int previous_index, 109ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org Isolate* isolate) { 110911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 111911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org ASSERT(subject->IsFlat()); 112911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org ASSERT(previous_index >= 0); 113911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org ASSERT(previous_index <= subject->length()); 114911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 115911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org // No allocations before calling the regexp, but we can't use 116837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org // DisallowHeapAllocation, since regexps might be preempted, and another 117837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org // thread might do allocation anyway. 118911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 119911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org String* subject_ptr = *subject; 120911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org // Character offsets into string. 121911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org int start_offset = previous_index; 1224668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org int char_length = subject_ptr->length() - start_offset; 1234668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org int slice_offset = 0; 124911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 1254668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org // The string has been flattened, so if it is a cons string it contains the 126b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org // full string in the first part. 127911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org if (StringShape(subject_ptr).IsCons()) { 128b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org ASSERT_EQ(0, ConsString::cast(subject_ptr)->second()->length()); 129911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org subject_ptr = ConsString::cast(subject_ptr)->first(); 1304668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org } else if (StringShape(subject_ptr).IsSliced()) { 1314668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org SlicedString* slice = SlicedString::cast(subject_ptr); 1324668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org subject_ptr = slice->parent(); 1334668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org slice_offset = slice->offset(); 134911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org } 1352efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org // Ensure that an underlying string has the same ASCII-ness. 1368e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org bool is_ascii = subject_ptr->IsOneByteRepresentation(); 137911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org ASSERT(subject_ptr->IsExternalString() || subject_ptr->IsSeqString()); 138911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org // String is now either Sequential or External 139911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org int char_size_shift = is_ascii ? 0 : 1; 140911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 141911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org const byte* input_start = 1424668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org StringCharacterPosition(subject_ptr, start_offset + slice_offset); 143911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org int byte_length = char_length << char_size_shift; 144911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org const byte* input_end = input_start + byte_length; 145911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org Result res = Execute(*regexp_code, 1464668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org *subject, 147911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org start_offset, 148911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org input_start, 149911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org input_end, 150ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org offsets_vector, 15115613d0b07bac19e341905ff374c930420b3b9c8mstarzinger@chromium.org offsets_vector_length, 152ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org isolate); 153911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org return res; 154a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.org} 155911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 156911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 157911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.orgNativeRegExpMacroAssembler::Result NativeRegExpMacroAssembler::Execute( 158911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org Code* code, 1594668a2c7a746d01b382f23aa32e163701e3075f8ricow@chromium.org String* input, // This needs to be the unpacked (sliced, cons) string. 160911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org int start_offset, 161911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org const byte* input_start, 162911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org const byte* input_end, 163ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org int* output, 16415613d0b07bac19e341905ff374c930420b3b9c8mstarzinger@chromium.org int output_size, 165ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org Isolate* isolate) { 166911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org // Ensure that the minimum stack has been allocated. 167ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org RegExpStackScope stack_scope(isolate); 168ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org Address stack_base = stack_scope.stack()->stack_base(); 169911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 1700c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org int direct_call = 0; 17149edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org int result = CALL_GENERATED_REGEXP_CODE(code->entry(), 17218ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org input, 17318ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org start_offset, 17418ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org input_start, 17518ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org input_end, 17618ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org output, 17715613d0b07bac19e341905ff374c930420b3b9c8mstarzinger@chromium.org output_size, 1780c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org stack_base, 179ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org direct_call, 180ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org isolate); 181911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org ASSERT(result >= RETRY); 182911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 183ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org if (result == EXCEPTION && !isolate->has_pending_exception()) { 184911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org // We detected a stack overflow (on the backtrack stack) in RegExp code, 185911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org // but haven't created the exception yet. 186ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org isolate->StackOverflow(); 187911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org } 188911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org return static_cast<Result>(result); 189911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org} 190911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 191911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 192ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgconst byte NativeRegExpMacroAssembler::word_character_map[] = { 193b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 194b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 195b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 196b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 197b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 198b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 199b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 200b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, // '0' - '7' 201b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 0xffu, 0xffu, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, // '8' - '9' 202b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 203b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 0x00u, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, // 'A' - 'G' 204b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, // 'H' - 'O' 205b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, // 'P' - 'W' 206b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 0xffu, 0xffu, 0xffu, 0x00u, 0x00u, 0x00u, 0x00u, 0xffu, // 'X' - 'Z', '_' 207b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 208b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 0x00u, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, // 'a' - 'g' 209b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, // 'h' - 'o' 210b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, 0xffu, // 'p' - 'w' 211b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 0xffu, 0xffu, 0xffu, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, // 'x' - 'z' 2126bec0093ef661b53a1e338a233d7aafb9536a307mvstanton@chromium.org // Latin-1 range 2136bec0093ef661b53a1e338a233d7aafb9536a307mvstanton@chromium.org 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 2146bec0093ef661b53a1e338a233d7aafb9536a307mvstanton@chromium.org 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 2156bec0093ef661b53a1e338a233d7aafb9536a307mvstanton@chromium.org 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 2166bec0093ef661b53a1e338a233d7aafb9536a307mvstanton@chromium.org 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 2176bec0093ef661b53a1e338a233d7aafb9536a307mvstanton@chromium.org 2186bec0093ef661b53a1e338a233d7aafb9536a307mvstanton@chromium.org 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 2196bec0093ef661b53a1e338a233d7aafb9536a307mvstanton@chromium.org 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 2206bec0093ef661b53a1e338a233d7aafb9536a307mvstanton@chromium.org 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 2216bec0093ef661b53a1e338a233d7aafb9536a307mvstanton@chromium.org 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 2226bec0093ef661b53a1e338a233d7aafb9536a307mvstanton@chromium.org 2236bec0093ef661b53a1e338a233d7aafb9536a307mvstanton@chromium.org 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 2246bec0093ef661b53a1e338a233d7aafb9536a307mvstanton@chromium.org 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 2256bec0093ef661b53a1e338a233d7aafb9536a307mvstanton@chromium.org 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 2266bec0093ef661b53a1e338a233d7aafb9536a307mvstanton@chromium.org 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 2276bec0093ef661b53a1e338a233d7aafb9536a307mvstanton@chromium.org 2286bec0093ef661b53a1e338a233d7aafb9536a307mvstanton@chromium.org 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 2296bec0093ef661b53a1e338a233d7aafb9536a307mvstanton@chromium.org 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 2306bec0093ef661b53a1e338a233d7aafb9536a307mvstanton@chromium.org 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 2316bec0093ef661b53a1e338a233d7aafb9536a307mvstanton@chromium.org 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 232b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org}; 233b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 234b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 235911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.orgint NativeRegExpMacroAssembler::CaseInsensitiveCompareUC16( 236911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org Address byte_offset1, 237911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org Address byte_offset2, 238ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org size_t byte_length, 239ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org Isolate* isolate) { 240ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org unibrow::Mapping<unibrow::Ecma262Canonicalize>* canonicalize = 241ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org isolate->regexp_macro_assembler_canonicalize(); 242911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org // This function is not allowed to cause a garbage collection. 243911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org // A GC might move the calling generated code and invalidate the 244911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org // return address on the stack. 245911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org ASSERT(byte_length % 2 == 0); 246911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org uc16* substring1 = reinterpret_cast<uc16*>(byte_offset1); 247911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org uc16* substring2 = reinterpret_cast<uc16*>(byte_offset2); 248911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org size_t length = byte_length >> 1; 249911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 250911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org for (size_t i = 0; i < length; i++) { 251911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org unibrow::uchar c1 = substring1[i]; 252911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org unibrow::uchar c2 = substring2[i]; 253911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org if (c1 != c2) { 254911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org unibrow::uchar s1[1] = { c1 }; 255ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org canonicalize->get(c1, '\0', s1); 256911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org if (s1[0] != c2) { 257911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org unibrow::uchar s2[1] = { c2 }; 258ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org canonicalize->get(c2, '\0', s2); 259911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org if (s1[0] != s2[0]) { 260911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org return 0; 261911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org } 262911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org } 263911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org } 264911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org } 265911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org return 1; 266911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org} 267911335cff40a2630bbe1dfb77b1897be991241bfsgjesse@chromium.org 26818ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org 26918ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.orgAddress NativeRegExpMacroAssembler::GrowStack(Address stack_pointer, 270ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org Address* stack_base, 271ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org Isolate* isolate) { 272ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org RegExpStack* regexp_stack = isolate->regexp_stack(); 273ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org size_t size = regexp_stack->stack_capacity(); 274ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org Address old_stack_base = regexp_stack->stack_base(); 27518ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org ASSERT(old_stack_base == *stack_base); 27618ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org ASSERT(stack_pointer <= old_stack_base); 27718ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org ASSERT(static_cast<size_t>(old_stack_base - stack_pointer) <= size); 278ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org Address new_stack_base = regexp_stack->EnsureCapacity(size * 2); 27918ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org if (new_stack_base == NULL) { 28018ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org return NULL; 28118ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org } 28218ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org *stack_base = new_stack_base; 28318ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org intptr_t stack_content_size = old_stack_base - stack_pointer; 28418ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org return new_stack_base - stack_content_size; 28518ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org} 28618ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org 287c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org#endif // V8_INTERPRETED_REGEXP 288c9c80823e038328f2e1060d7feef0762a50adf06ricow@chromium.org 2893291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org} } // namespace v8::internal 290