OLD | NEW |
1 // Copyright 2006-2008 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2008 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 360 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
371 Handle<FixedArray> irregexp_data) { | 371 Handle<FixedArray> irregexp_data) { |
372 Factory::SetRegExpData(re, JSRegExp::IRREGEXP, pattern, flags, irregexp_data); | 372 Factory::SetRegExpData(re, JSRegExp::IRREGEXP, pattern, flags, irregexp_data); |
373 return re; | 373 return re; |
374 } | 374 } |
375 | 375 |
376 | 376 |
377 static inline Object* DoCompile(String* pattern, | 377 static inline Object* DoCompile(String* pattern, |
378 JSRegExp::Flags flags, | 378 JSRegExp::Flags flags, |
379 unsigned* number_of_captures, | 379 unsigned* number_of_captures, |
380 const char** error_message, | 380 const char** error_message, |
381 JscreRegExp** code) { | 381 v8::jscre::JscreRegExp** code) { |
382 JSRegExpIgnoreCaseOption case_option = flags.is_ignore_case() | 382 v8::jscre::JSRegExpIgnoreCaseOption case_option = flags.is_ignore_case() |
383 ? JSRegExpIgnoreCase | 383 ? v8::jscre::JSRegExpIgnoreCase |
384 : JSRegExpDoNotIgnoreCase; | 384 : v8::jscre::JSRegExpDoNotIgnoreCase; |
385 JSRegExpMultilineOption multiline_option = flags.is_multiline() | 385 v8::jscre::JSRegExpMultilineOption multiline_option = flags.is_multiline() |
386 ? JSRegExpMultiline | 386 ? v8::jscre::JSRegExpMultiline |
387 : JSRegExpSingleLine; | 387 : v8::jscre::JSRegExpSingleLine; |
388 *error_message = NULL; | 388 *error_message = NULL; |
389 malloc_failure = Failure::Exception(); | 389 malloc_failure = Failure::Exception(); |
390 *code = jsRegExpCompile(pattern->GetTwoByteData(), | 390 *code = v8::jscre::jsRegExpCompile(pattern->GetTwoByteData(), |
391 pattern->length(), | 391 pattern->length(), |
392 case_option, | 392 case_option, |
393 multiline_option, | 393 multiline_option, |
394 number_of_captures, | 394 number_of_captures, |
395 error_message, | 395 error_message, |
396 &JSREMalloc, | 396 &JSREMalloc, |
397 &JSREFree); | 397 &JSREFree); |
398 if (*code == NULL && (malloc_failure->IsRetryAfterGC() || | 398 if (*code == NULL && (malloc_failure->IsRetryAfterGC() || |
399 malloc_failure->IsOutOfMemoryFailure())) { | 399 malloc_failure->IsOutOfMemoryFailure())) { |
400 return malloc_failure; | 400 return malloc_failure; |
401 } else { | 401 } else { |
402 // It doesn't matter which object we return here, we just need to return | 402 // It doesn't matter which object we return here, we just need to return |
403 // a non-failure to indicate to the GC-retry code that there was no | 403 // a non-failure to indicate to the GC-retry code that there was no |
404 // allocation failure. | 404 // allocation failure. |
405 return pattern; | 405 return pattern; |
406 } | 406 } |
407 } | 407 } |
408 | 408 |
409 | 409 |
410 void CompileWithRetryAfterGC(Handle<String> pattern, | 410 void CompileWithRetryAfterGC(Handle<String> pattern, |
411 JSRegExp::Flags flags, | 411 JSRegExp::Flags flags, |
412 unsigned* number_of_captures, | 412 unsigned* number_of_captures, |
413 const char** error_message, | 413 const char** error_message, |
414 JscreRegExp** code) { | 414 v8::jscre::JscreRegExp** code) { |
415 CALL_HEAP_FUNCTION_VOID(DoCompile(*pattern, | 415 CALL_HEAP_FUNCTION_VOID(DoCompile(*pattern, |
416 flags, | 416 flags, |
417 number_of_captures, | 417 number_of_captures, |
418 error_message, | 418 error_message, |
419 code)); | 419 code)); |
420 } | 420 } |
421 | 421 |
422 | 422 |
423 Handle<Object> RegExpImpl::JscreCompile(Handle<JSRegExp> re) { | 423 Handle<Object> RegExpImpl::JscreCompile(Handle<JSRegExp> re) { |
424 ASSERT_EQ(re->TypeTag(), JSRegExp::JSCRE); | 424 ASSERT_EQ(re->TypeTag(), JSRegExp::JSCRE); |
425 ASSERT(re->DataAt(JSRegExp::kJscreDataIndex)->IsUndefined()); | 425 ASSERT(re->DataAt(JSRegExp::kJscreDataIndex)->IsUndefined()); |
426 | 426 |
427 Handle<String> pattern(re->Pattern()); | 427 Handle<String> pattern(re->Pattern()); |
428 JSRegExp::Flags flags = re->GetFlags(); | 428 JSRegExp::Flags flags = re->GetFlags(); |
429 | 429 |
430 Handle<String> two_byte_pattern = StringToTwoByte(pattern); | 430 Handle<String> two_byte_pattern = StringToTwoByte(pattern); |
431 | 431 |
432 unsigned number_of_captures; | 432 unsigned number_of_captures; |
433 const char* error_message = NULL; | 433 const char* error_message = NULL; |
434 | 434 |
435 JscreRegExp* code = NULL; | 435 v8::jscre::JscreRegExp* code = NULL; |
436 FlattenString(pattern); | 436 FlattenString(pattern); |
437 | 437 |
438 CompileWithRetryAfterGC(two_byte_pattern, | 438 CompileWithRetryAfterGC(two_byte_pattern, |
439 flags, | 439 flags, |
440 &number_of_captures, | 440 &number_of_captures, |
441 &error_message, | 441 &error_message, |
442 &code); | 442 &code); |
443 | 443 |
444 if (code == NULL) { | 444 if (code == NULL) { |
445 // Throw an exception. | 445 // Throw an exception. |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
553 int num_captures, | 553 int num_captures, |
554 Handle<String> subject, | 554 Handle<String> subject, |
555 int previous_index, | 555 int previous_index, |
556 const uc16* two_byte_subject, | 556 const uc16* two_byte_subject, |
557 int* offsets_vector, | 557 int* offsets_vector, |
558 int offsets_vector_length) { | 558 int offsets_vector_length) { |
559 int rc; | 559 int rc; |
560 { | 560 { |
561 AssertNoAllocation a; | 561 AssertNoAllocation a; |
562 ByteArray* internal = JscreInternal(regexp); | 562 ByteArray* internal = JscreInternal(regexp); |
563 const JscreRegExp* js_regexp = | 563 const v8::jscre::JscreRegExp* js_regexp = |
564 reinterpret_cast<JscreRegExp*>(internal->GetDataStartAddress()); | 564 reinterpret_cast<v8::jscre::JscreRegExp*>( |
| 565 internal->GetDataStartAddress()); |
565 | 566 |
566 LOG(RegExpExecEvent(regexp, previous_index, subject)); | 567 LOG(RegExpExecEvent(regexp, previous_index, subject)); |
567 | 568 |
568 rc = jsRegExpExecute(js_regexp, | 569 rc = v8::jscre::jsRegExpExecute(js_regexp, |
569 two_byte_subject, | 570 two_byte_subject, |
570 subject->length(), | 571 subject->length(), |
571 previous_index, | 572 previous_index, |
572 offsets_vector, | 573 offsets_vector, |
573 offsets_vector_length); | 574 offsets_vector_length); |
574 } | 575 } |
575 | 576 |
576 // The KJS JavaScript engine returns null (ie, a failed match) when | 577 // The KJS JavaScript engine returns null (ie, a failed match) when |
577 // JSRE's internal match limit is exceeded. We duplicate that behavior here. | 578 // JSRE's internal match limit is exceeded. We duplicate that behavior here. |
578 if (rc == JSRegExpErrorNoMatch | 579 if (rc == v8::jscre::JSRegExpErrorNoMatch |
579 || rc == JSRegExpErrorHitLimit) { | 580 || rc == v8::jscre::JSRegExpErrorHitLimit) { |
580 return Factory::null_value(); | 581 return Factory::null_value(); |
581 } | 582 } |
582 | 583 |
583 // Other JSRE errors: | 584 // Other JSRE errors: |
584 if (rc < 0) { | 585 if (rc < 0) { |
585 // Throw an exception. | 586 // Throw an exception. |
586 Handle<Object> code(Smi::FromInt(rc)); | 587 Handle<Object> code(Smi::FromInt(rc)); |
587 Handle<Object> args[2] = { Factory::LookupAsciiSymbol("jsre_exec"), code }; | 588 Handle<Object> args[2] = { Factory::LookupAsciiSymbol("jsre_exec"), code }; |
588 Handle<Object> regexp_err( | 589 Handle<Object> regexp_err( |
589 Factory::NewTypeError("jsre_error", HandleVector(args, 2))); | 590 Factory::NewTypeError("jsre_error", HandleVector(args, 2))); |
(...skipping 2006 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2596 byte codes[1024]; | 2597 byte codes[1024]; |
2597 IrregexpAssembler assembler(Vector<byte>(codes, 1024)); | 2598 IrregexpAssembler assembler(Vector<byte>(codes, 1024)); |
2598 RegExpMacroAssemblerIrregexp macro_assembler(&assembler); | 2599 RegExpMacroAssemblerIrregexp macro_assembler(&assembler); |
2599 return compiler.Assemble(¯o_assembler, | 2600 return compiler.Assemble(¯o_assembler, |
2600 node, | 2601 node, |
2601 input->capture_count); | 2602 input->capture_count); |
2602 } | 2603 } |
2603 | 2604 |
2604 | 2605 |
2605 }} // namespace v8::internal | 2606 }} // namespace v8::internal |
OLD | NEW |