| OLD | NEW |
| 1 // Copyright 2006-2009 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2009 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 338 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 349 flags, | 349 flags, |
| 350 capture_count); | 350 capture_count); |
| 351 } | 351 } |
| 352 | 352 |
| 353 | 353 |
| 354 int RegExpImpl::IrregexpPrepare(Handle<JSRegExp> regexp, | 354 int RegExpImpl::IrregexpPrepare(Handle<JSRegExp> regexp, |
| 355 Handle<String> subject) { | 355 Handle<String> subject) { |
| 356 if (!subject->IsFlat()) { | 356 if (!subject->IsFlat()) { |
| 357 FlattenString(subject); | 357 FlattenString(subject); |
| 358 } | 358 } |
| 359 bool is_ascii = subject->IsAsciiRepresentation(); | 359 // Check the asciiness of the underlying storage. |
| 360 bool is_ascii; |
| 361 { |
| 362 AssertNoAllocation no_gc; |
| 363 String* sequential_string = *subject; |
| 364 if (subject->IsConsString()) { |
| 365 sequential_string = ConsString::cast(*subject)->first(); |
| 366 } |
| 367 is_ascii = sequential_string->IsAsciiRepresentation(); |
| 368 } |
| 360 if (!EnsureCompiledIrregexp(regexp, is_ascii)) { | 369 if (!EnsureCompiledIrregexp(regexp, is_ascii)) { |
| 361 return -1; | 370 return -1; |
| 362 } | 371 } |
| 363 #ifdef V8_INTERPRETED_REGEXP | 372 #ifdef V8_INTERPRETED_REGEXP |
| 364 // Byte-code regexp needs space allocated for all its registers. | 373 // Byte-code regexp needs space allocated for all its registers. |
| 365 return IrregexpNumberOfRegisters(FixedArray::cast(regexp->data())); | 374 return IrregexpNumberOfRegisters(FixedArray::cast(regexp->data())); |
| 366 #else // V8_INTERPRETED_REGEXP | 375 #else // V8_INTERPRETED_REGEXP |
| 367 // Native regexp only needs room to output captures. Registers are handled | 376 // Native regexp only needs room to output captures. Registers are handled |
| 368 // internally. | 377 // internally. |
| 369 return (IrregexpNumberOfCaptures(FixedArray::cast(regexp->data())) + 1) * 2; | 378 return (IrregexpNumberOfCaptures(FixedArray::cast(regexp->data())) + 1) * 2; |
| 370 #endif // V8_INTERPRETED_REGEXP | 379 #endif // V8_INTERPRETED_REGEXP |
| 371 } | 380 } |
| 372 | 381 |
| 373 | 382 |
| 374 RegExpImpl::IrregexpResult RegExpImpl::IrregexpExecOnce(Handle<JSRegExp> regexp, | 383 RegExpImpl::IrregexpResult RegExpImpl::IrregexpExecOnce(Handle<JSRegExp> regexp, |
| 375 Handle<String> subject, | 384 Handle<String> subject, |
| 376 int index, | 385 int index, |
| 377 Vector<int> output) { | 386 Vector<int> output) { |
| 378 Handle<FixedArray> irregexp(FixedArray::cast(regexp->data())); | 387 Handle<FixedArray> irregexp(FixedArray::cast(regexp->data())); |
| 379 | 388 |
| 380 ASSERT(index >= 0); | 389 ASSERT(index >= 0); |
| 381 ASSERT(index <= subject->length()); | 390 ASSERT(index <= subject->length()); |
| 382 ASSERT(subject->IsFlat()); | 391 ASSERT(subject->IsFlat()); |
| 383 | 392 |
| 393 // A flat ASCII string might have a two-byte first part. |
| 394 if (subject->IsConsString()) { |
| 395 subject = Handle<String>(ConsString::cast(*subject)->first()); |
| 396 } |
| 397 |
| 384 #ifndef V8_INTERPRETED_REGEXP | 398 #ifndef V8_INTERPRETED_REGEXP |
| 385 ASSERT(output.length() >= | 399 ASSERT(output.length() >= |
| 386 (IrregexpNumberOfCaptures(*irregexp) + 1) * 2); | 400 (IrregexpNumberOfCaptures(*irregexp) + 1) * 2); |
| 387 do { | 401 do { |
| 388 bool is_ascii = subject->IsAsciiRepresentation(); | 402 bool is_ascii = subject->IsAsciiRepresentation(); |
| 389 Handle<Code> code(IrregexpNativeCode(*irregexp, is_ascii)); | 403 Handle<Code> code(IrregexpNativeCode(*irregexp, is_ascii)); |
| 390 NativeRegExpMacroAssembler::Result res = | 404 NativeRegExpMacroAssembler::Result res = |
| 391 NativeRegExpMacroAssembler::Match(code, | 405 NativeRegExpMacroAssembler::Match(code, |
| 392 subject, | 406 subject, |
| 393 output.start(), | 407 output.start(), |
| 394 output.length(), | 408 output.length(), |
| 395 index); | 409 index); |
| 396 if (res != NativeRegExpMacroAssembler::RETRY) { | 410 if (res != NativeRegExpMacroAssembler::RETRY) { |
| 397 ASSERT(res != NativeRegExpMacroAssembler::EXCEPTION || | 411 ASSERT(res != NativeRegExpMacroAssembler::EXCEPTION || |
| 398 Top::has_pending_exception()); | 412 Top::has_pending_exception()); |
| 399 STATIC_ASSERT( | 413 STATIC_ASSERT( |
| 400 static_cast<int>(NativeRegExpMacroAssembler::SUCCESS) == RE_SUCCESS); | 414 static_cast<int>(NativeRegExpMacroAssembler::SUCCESS) == RE_SUCCESS); |
| 401 STATIC_ASSERT( | 415 STATIC_ASSERT( |
| 402 static_cast<int>(NativeRegExpMacroAssembler::FAILURE) == RE_FAILURE); | 416 static_cast<int>(NativeRegExpMacroAssembler::FAILURE) == RE_FAILURE); |
| 403 STATIC_ASSERT(static_cast<int>(NativeRegExpMacroAssembler::EXCEPTION) | 417 STATIC_ASSERT(static_cast<int>(NativeRegExpMacroAssembler::EXCEPTION) |
| 404 == RE_EXCEPTION); | 418 == RE_EXCEPTION); |
| 405 return static_cast<IrregexpResult>(res); | 419 return static_cast<IrregexpResult>(res); |
| 406 } | 420 } |
| 407 // If result is RETRY, the string has changed representation, and we | 421 // If result is RETRY, the string has changed representation, and we |
| 408 // must restart from scratch. | 422 // must restart from scratch. |
| 409 // In this case, it means we must make sure we are prepared to handle | 423 // In this case, it means we must make sure we are prepared to handle |
| 410 // the, potentially, differen subject (the string can switch between | 424 // the, potentially, different subject (the string can switch between |
| 411 // being internal and external, and even between being ASCII and UC16, | 425 // being internal and external, and even between being ASCII and UC16, |
| 412 // but the characters are always the same). | 426 // but the characters are always the same). |
| 413 IrregexpPrepare(regexp, subject); | 427 IrregexpPrepare(regexp, subject); |
| 414 } while (true); | 428 } while (true); |
| 415 UNREACHABLE(); | 429 UNREACHABLE(); |
| 416 return RE_EXCEPTION; | 430 return RE_EXCEPTION; |
| 417 #else // V8_INTERPRETED_REGEXP | 431 #else // V8_INTERPRETED_REGEXP |
| 418 | 432 |
| 419 ASSERT(output.length() >= IrregexpNumberOfRegisters(*irregexp)); | 433 ASSERT(output.length() >= IrregexpNumberOfRegisters(*irregexp)); |
| 420 bool is_ascii = subject->IsAsciiRepresentation(); | 434 bool is_ascii = subject->IsAsciiRepresentation(); |
| (...skipping 4839 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5260 node, | 5274 node, |
| 5261 data->capture_count, | 5275 data->capture_count, |
| 5262 pattern); | 5276 pattern); |
| 5263 } | 5277 } |
| 5264 | 5278 |
| 5265 | 5279 |
| 5266 int OffsetsVector::static_offsets_vector_[ | 5280 int OffsetsVector::static_offsets_vector_[ |
| 5267 OffsetsVector::kStaticOffsetsVectorSize]; | 5281 OffsetsVector::kStaticOffsetsVectorSize]; |
| 5268 | 5282 |
| 5269 }} // namespace v8::internal | 5283 }} // namespace v8::internal |
| OLD | NEW |