| 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 24 matching lines...) Expand all Loading... |
| 35 #include "runtime.h" | 35 #include "runtime.h" |
| 36 #include "top.h" | 36 #include "top.h" |
| 37 #include "compilation-cache.h" | 37 #include "compilation-cache.h" |
| 38 #include "string-stream.h" | 38 #include "string-stream.h" |
| 39 #include "parser.h" | 39 #include "parser.h" |
| 40 #include "regexp-macro-assembler.h" | 40 #include "regexp-macro-assembler.h" |
| 41 #include "regexp-macro-assembler-tracer.h" | 41 #include "regexp-macro-assembler-tracer.h" |
| 42 #include "regexp-macro-assembler-irregexp.h" | 42 #include "regexp-macro-assembler-irregexp.h" |
| 43 #include "regexp-stack.h" | 43 #include "regexp-stack.h" |
| 44 | 44 |
| 45 #ifdef V8_ARCH_ARM | 45 #ifdef V8_TARGET_ARCH_IA32 |
| 46 #include "ia32/macro-assembler-ia32.h" |
| 47 #include "ia32/regexp-macro-assembler-ia32.h" |
| 48 #elif V8_TARGET_ARCH_X64 |
| 49 #include "x64/macro-assembler-x64.h" |
| 50 #include "x64/regexp-macro-assembler-x64.h" |
| 51 #elif V8_TARGET_ARCH_ARM |
| 46 #include "arm/regexp-macro-assembler-arm.h" | 52 #include "arm/regexp-macro-assembler-arm.h" |
| 47 #endif | 53 #endif |
| 48 | 54 |
| 49 #ifdef V8_ARCH_X64 | |
| 50 #include "x64/macro-assembler-x64.h" | |
| 51 #include "x64/regexp-macro-assembler-x64.h" | |
| 52 #endif | |
| 53 | |
| 54 #ifdef V8_ARCH_IA32 | |
| 55 #include "ia32/macro-assembler-ia32.h" | |
| 56 #include "ia32/regexp-macro-assembler-ia32.h" | |
| 57 #endif | |
| 58 | |
| 59 #include "interpreter-irregexp.h" | 55 #include "interpreter-irregexp.h" |
| 60 | 56 |
| 61 | 57 |
| 62 namespace v8 { namespace internal { | 58 namespace v8 { namespace internal { |
| 63 | 59 |
| 64 | 60 |
| 65 Handle<Object> RegExpImpl::CreateRegExpLiteral(Handle<JSFunction> constructor, | 61 Handle<Object> RegExpImpl::CreateRegExpLiteral(Handle<JSFunction> constructor, |
| 66 Handle<String> pattern, | 62 Handle<String> pattern, |
| 67 Handle<String> flags, | 63 Handle<String> flags, |
| 68 bool* has_pending_exception) { | 64 bool* has_pending_exception) { |
| (...skipping 355 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 424 last_match_info->EnsureSize(number_of_capture_registers + kLastMatchOverhead); | 420 last_match_info->EnsureSize(number_of_capture_registers + kLastMatchOverhead); |
| 425 | 421 |
| 426 int* offsets_vector = offsets.vector(); | 422 int* offsets_vector = offsets.vector(); |
| 427 bool rc; | 423 bool rc; |
| 428 | 424 |
| 429 // Dispatch to the correct RegExp implementation. | 425 // Dispatch to the correct RegExp implementation. |
| 430 | 426 |
| 431 Handle<String> original_subject = subject; | 427 Handle<String> original_subject = subject; |
| 432 Handle<FixedArray> regexp(FixedArray::cast(jsregexp->data())); | 428 Handle<FixedArray> regexp(FixedArray::cast(jsregexp->data())); |
| 433 if (UseNativeRegexp()) { | 429 if (UseNativeRegexp()) { |
| 434 #ifdef V8_ARCH_ARM | 430 #if V8_TARGET_ARCH_IA32 |
| 435 UNREACHABLE(); | |
| 436 #endif | |
| 437 #ifdef V8_ARCH_X64 | |
| 438 UNIMPLEMENTED(); | |
| 439 #endif | |
| 440 #ifdef V8_ARCH_IA32 | |
| 441 RegExpMacroAssemblerIA32::Result res; | 431 RegExpMacroAssemblerIA32::Result res; |
| 442 do { | 432 do { |
| 443 bool is_ascii = subject->IsAsciiRepresentation(); | 433 bool is_ascii = subject->IsAsciiRepresentation(); |
| 444 if (!EnsureCompiledIrregexp(jsregexp, is_ascii)) { | 434 if (!EnsureCompiledIrregexp(jsregexp, is_ascii)) { |
| 445 return Handle<Object>::null(); | 435 return Handle<Object>::null(); |
| 446 } | 436 } |
| 447 Handle<Code> code(RegExpImpl::IrregexpNativeCode(*regexp, is_ascii)); | 437 Handle<Code> code(RegExpImpl::IrregexpNativeCode(*regexp, is_ascii)); |
| 448 res = RegExpMacroAssemblerIA32::Match(code, | 438 res = RegExpMacroAssemblerIA32::Match(code, |
| 449 subject, | 439 subject, |
| 450 offsets_vector, | 440 offsets_vector, |
| 451 offsets.length(), | 441 offsets.length(), |
| 452 previous_index); | 442 previous_index); |
| 453 // If result is RETRY, the string have changed representation, and we | 443 // If result is RETRY, the string have changed representation, and we |
| 454 // must restart from scratch. | 444 // must restart from scratch. |
| 455 } while (res == RegExpMacroAssemblerIA32::RETRY); | 445 } while (res == RegExpMacroAssemblerIA32::RETRY); |
| 456 if (res == RegExpMacroAssemblerIA32::EXCEPTION) { | 446 if (res == RegExpMacroAssemblerIA32::EXCEPTION) { |
| 457 ASSERT(Top::has_pending_exception()); | 447 ASSERT(Top::has_pending_exception()); |
| 458 return Handle<Object>::null(); | 448 return Handle<Object>::null(); |
| 459 } | 449 } |
| 460 ASSERT(res == RegExpMacroAssemblerIA32::SUCCESS | 450 ASSERT(res == RegExpMacroAssemblerIA32::SUCCESS |
| 461 || res == RegExpMacroAssemblerIA32::FAILURE); | 451 || res == RegExpMacroAssemblerIA32::FAILURE); |
| 462 | 452 |
| 463 rc = (res == RegExpMacroAssemblerIA32::SUCCESS); | 453 rc = (res == RegExpMacroAssemblerIA32::SUCCESS); |
| 454 #else |
| 455 UNREACHABLE(); |
| 464 #endif | 456 #endif |
| 465 } else { | 457 } else { |
| 466 bool is_ascii = subject->IsAsciiRepresentation(); | 458 bool is_ascii = subject->IsAsciiRepresentation(); |
| 467 if (!EnsureCompiledIrregexp(jsregexp, is_ascii)) { | 459 if (!EnsureCompiledIrregexp(jsregexp, is_ascii)) { |
| 468 return Handle<Object>::null(); | 460 return Handle<Object>::null(); |
| 469 } | 461 } |
| 470 for (int i = number_of_capture_registers - 1; i >= 0; i--) { | 462 for (int i = number_of_capture_registers - 1; i >= 0; i--) { |
| 471 offsets_vector[i] = -1; | 463 offsets_vector[i] = -1; |
| 472 } | 464 } |
| 473 Handle<ByteArray> byte_codes(IrregexpByteCode(*regexp, is_ascii)); | 465 Handle<ByteArray> byte_codes(IrregexpByteCode(*regexp, is_ascii)); |
| (...skipping 2040 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2514 if (!trace->is_trivial()) { | 2506 if (!trace->is_trivial()) { |
| 2515 trace->Flush(compiler, this); | 2507 trace->Flush(compiler, this); |
| 2516 return; | 2508 return; |
| 2517 } | 2509 } |
| 2518 ChoiceNode::Emit(compiler, trace); | 2510 ChoiceNode::Emit(compiler, trace); |
| 2519 } | 2511 } |
| 2520 | 2512 |
| 2521 | 2513 |
| 2522 int ChoiceNode::CalculatePreloadCharacters(RegExpCompiler* compiler) { | 2514 int ChoiceNode::CalculatePreloadCharacters(RegExpCompiler* compiler) { |
| 2523 int preload_characters = EatsAtLeast(4, 0); | 2515 int preload_characters = EatsAtLeast(4, 0); |
| 2524 #ifdef CAN_READ_UNALIGNED | 2516 #ifdef V8_HOST_CAN_READ_UNALIGNED |
| 2525 bool ascii = compiler->ascii(); | 2517 bool ascii = compiler->ascii(); |
| 2526 if (ascii) { | 2518 if (ascii) { |
| 2527 if (preload_characters > 4) preload_characters = 4; | 2519 if (preload_characters > 4) preload_characters = 4; |
| 2528 // We can't preload 3 characters because there is no machine instruction | 2520 // We can't preload 3 characters because there is no machine instruction |
| 2529 // to do that. We can't just load 4 because we could be reading | 2521 // to do that. We can't just load 4 because we could be reading |
| 2530 // beyond the end of the string, which could cause a memory fault. | 2522 // beyond the end of the string, which could cause a memory fault. |
| 2531 if (preload_characters == 3) preload_characters = 2; | 2523 if (preload_characters == 3) preload_characters = 2; |
| 2532 } else { | 2524 } else { |
| 2533 if (preload_characters > 2) preload_characters = 2; | 2525 if (preload_characters > 2) preload_characters = 2; |
| 2534 } | 2526 } |
| (...skipping 1903 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4438 node = loop_node; | 4430 node = loop_node; |
| 4439 } | 4431 } |
| 4440 } | 4432 } |
| 4441 data->node = node; | 4433 data->node = node; |
| 4442 Analysis analysis(ignore_case); | 4434 Analysis analysis(ignore_case); |
| 4443 analysis.EnsureAnalyzed(node); | 4435 analysis.EnsureAnalyzed(node); |
| 4444 | 4436 |
| 4445 NodeInfo info = *node->info(); | 4437 NodeInfo info = *node->info(); |
| 4446 | 4438 |
| 4447 if (RegExpImpl::UseNativeRegexp()) { | 4439 if (RegExpImpl::UseNativeRegexp()) { |
| 4448 #ifdef V8_ARCH_ARM | 4440 #ifdef V8_TARGET_ARCH_ARM |
| 4449 UNREACHABLE(); | 4441 UNREACHABLE(); |
| 4450 #endif | 4442 #endif |
| 4451 #ifdef V8_ARCH_X64 | 4443 #ifdef V8_TARGET_ARCH_X64 |
| 4452 UNREACHABLE(); | 4444 UNREACHABLE(); |
| 4453 #endif | 4445 #endif |
| 4454 #ifdef V8_ARCH_IA32 | 4446 #ifdef V8_TARGET_ARCH_IA32 |
| 4455 RegExpMacroAssemblerIA32::Mode mode; | 4447 RegExpMacroAssemblerIA32::Mode mode; |
| 4456 if (is_ascii) { | 4448 if (is_ascii) { |
| 4457 mode = RegExpMacroAssemblerIA32::ASCII; | 4449 mode = RegExpMacroAssemblerIA32::ASCII; |
| 4458 } else { | 4450 } else { |
| 4459 mode = RegExpMacroAssemblerIA32::UC16; | 4451 mode = RegExpMacroAssemblerIA32::UC16; |
| 4460 } | 4452 } |
| 4461 RegExpMacroAssemblerIA32 macro_assembler(mode, | 4453 RegExpMacroAssemblerIA32 macro_assembler(mode, |
| 4462 (data->capture_count + 1) * 2); | 4454 (data->capture_count + 1) * 2); |
| 4463 return compiler.Assemble(¯o_assembler, | 4455 return compiler.Assemble(¯o_assembler, |
| 4464 node, | 4456 node, |
| 4465 data->capture_count, | 4457 data->capture_count, |
| 4466 pattern); | 4458 pattern); |
| 4467 #endif | 4459 #endif |
| 4468 } | 4460 } |
| 4469 EmbeddedVector<byte, 1024> codes; | 4461 EmbeddedVector<byte, 1024> codes; |
| 4470 RegExpMacroAssemblerIrregexp macro_assembler(codes); | 4462 RegExpMacroAssemblerIrregexp macro_assembler(codes); |
| 4471 return compiler.Assemble(¯o_assembler, | 4463 return compiler.Assemble(¯o_assembler, |
| 4472 node, | 4464 node, |
| 4473 data->capture_count, | 4465 data->capture_count, |
| 4474 pattern); | 4466 pattern); |
| 4475 } | 4467 } |
| 4476 | 4468 |
| 4477 | 4469 |
| 4478 }} // namespace v8::internal | 4470 }} // namespace v8::internal |
| OLD | NEW |