| OLD | NEW | 
|---|
| 1 // Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file | 
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a | 
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. | 
| 4 | 4 | 
| 5 #include "vm/regexp.h" | 5 #include "vm/regexp.h" | 
| 6 | 6 | 
| 7 #include "vm/dart_entry.h" | 7 #include "vm/dart_entry.h" | 
| 8 #include "vm/regexp_assembler.h" | 8 #include "vm/regexp_assembler.h" | 
| 9 #include "vm/regexp_assembler_bytecode.h" | 9 #include "vm/regexp_assembler_bytecode.h" | 
| 10 #include "vm/regexp_assembler_ir.h" | 10 #include "vm/regexp_assembler_ir.h" | 
| (...skipping 3011 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 3022   const TypedData& boolean_skip_table = TypedData::ZoneHandle( | 3022   const TypedData& boolean_skip_table = TypedData::ZoneHandle( | 
| 3023       compiler_->zone(), | 3023       compiler_->zone(), | 
| 3024       TypedData::New(kTypedDataUint8ArrayCid, kSize, Heap::kOld)); | 3024       TypedData::New(kTypedDataUint8ArrayCid, kSize, Heap::kOld)); | 
| 3025   intptr_t skip_distance = | 3025   intptr_t skip_distance = | 
| 3026       GetSkipTable(min_lookahead, max_lookahead, boolean_skip_table); | 3026       GetSkipTable(min_lookahead, max_lookahead, boolean_skip_table); | 
| 3027   ASSERT(skip_distance != 0); | 3027   ASSERT(skip_distance != 0); | 
| 3028 | 3028 | 
| 3029   BlockLabel cont, again; | 3029   BlockLabel cont, again; | 
| 3030 | 3030 | 
| 3031   masm->BindBlock(&again); | 3031   masm->BindBlock(&again); | 
| 3032   masm->CheckPreemption(/*is_backtrack=*/false); |  | 
| 3033   masm->LoadCurrentCharacter(max_lookahead, &cont, true); | 3032   masm->LoadCurrentCharacter(max_lookahead, &cont, true); | 
| 3034   masm->CheckBitInTable(boolean_skip_table, &cont); | 3033   masm->CheckBitInTable(boolean_skip_table, &cont); | 
| 3035   masm->AdvanceCurrentPosition(skip_distance); | 3034   masm->AdvanceCurrentPosition(skip_distance); | 
| 3036   masm->GoTo(&again); | 3035   masm->GoTo(&again); | 
| 3037   masm->BindBlock(&cont); | 3036   masm->BindBlock(&cont); | 
| 3038 | 3037 | 
| 3039   return; | 3038   return; | 
| 3040 } | 3039 } | 
| 3041 | 3040 | 
| 3042 | 3041 | 
| (...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 3229   // information for each iteration of the loop, which could take up a lot of | 3228   // information for each iteration of the loop, which could take up a lot of | 
| 3230   // space. | 3229   // space. | 
| 3231   ASSERT(trace->stop_node() == NULL); | 3230   ASSERT(trace->stop_node() == NULL); | 
| 3232   macro_assembler->PushCurrentPosition(); | 3231   macro_assembler->PushCurrentPosition(); | 
| 3233   BlockLabel greedy_match_failed; | 3232   BlockLabel greedy_match_failed; | 
| 3234   Trace greedy_match_trace; | 3233   Trace greedy_match_trace; | 
| 3235   if (not_at_start()) greedy_match_trace.set_at_start(false); | 3234   if (not_at_start()) greedy_match_trace.set_at_start(false); | 
| 3236   greedy_match_trace.set_backtrack(&greedy_match_failed); | 3235   greedy_match_trace.set_backtrack(&greedy_match_failed); | 
| 3237   BlockLabel loop_label; | 3236   BlockLabel loop_label; | 
| 3238   macro_assembler->BindBlock(&loop_label); | 3237   macro_assembler->BindBlock(&loop_label); | 
| 3239   macro_assembler->CheckPreemption(/*is_backtrack=*/false); |  | 
| 3240   greedy_match_trace.set_stop_node(this); | 3238   greedy_match_trace.set_stop_node(this); | 
| 3241   greedy_match_trace.set_loop_label(&loop_label); | 3239   greedy_match_trace.set_loop_label(&loop_label); | 
| 3242   (*alternatives_)[0].node()->Emit(compiler, &greedy_match_trace); | 3240   (*alternatives_)[0].node()->Emit(compiler, &greedy_match_trace); | 
| 3243   macro_assembler->BindBlock(&greedy_match_failed); | 3241   macro_assembler->BindBlock(&greedy_match_failed); | 
| 3244 | 3242 | 
| 3245   BlockLabel second_choice;  // For use in greedy matches. | 3243   BlockLabel second_choice;  // For use in greedy matches. | 
| 3246   macro_assembler->BindBlock(&second_choice); | 3244   macro_assembler->BindBlock(&second_choice); | 
| 3247 | 3245 | 
| 3248   Trace* new_trace = greedy_loop_state->counter_backtrack_trace(); | 3246   Trace* new_trace = greedy_loop_state->counter_backtrack_trace(); | 
| 3249 | 3247 | 
| (...skipping 1563 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 4813   } | 4811   } | 
| 4814   on_success()->FillInBMInfo(offset, budget - 1, bm, | 4812   on_success()->FillInBMInfo(offset, budget - 1, bm, | 
| 4815                              true);  // Not at start after a text node. | 4813                              true);  // Not at start after a text node. | 
| 4816   if (initial_offset == 0) set_bm_info(not_at_start, bm); | 4814   if (initial_offset == 0) set_bm_info(not_at_start, bm); | 
| 4817 } | 4815 } | 
| 4818 | 4816 | 
| 4819 | 4817 | 
| 4820 RegExpEngine::CompilationResult RegExpEngine::CompileIR( | 4818 RegExpEngine::CompilationResult RegExpEngine::CompileIR( | 
| 4821     RegExpCompileData* data, | 4819     RegExpCompileData* data, | 
| 4822     const ParsedFunction* parsed_function, | 4820     const ParsedFunction* parsed_function, | 
| 4823     const ZoneGrowableArray<const ICData*>& ic_data_array, | 4821     const ZoneGrowableArray<const ICData*>& ic_data_array) { | 
| 4824     intptr_t osr_id) { |  | 
| 4825   ASSERT(!FLAG_interpret_irregexp); | 4822   ASSERT(!FLAG_interpret_irregexp); | 
| 4826   Zone* zone = Thread::Current()->zone(); | 4823   Zone* zone = Thread::Current()->zone(); | 
| 4827 | 4824 | 
| 4828   const Function& function = parsed_function->function(); | 4825   const Function& function = parsed_function->function(); | 
| 4829   const intptr_t specialization_cid = function.string_specialization_cid(); | 4826   const intptr_t specialization_cid = function.string_specialization_cid(); | 
| 4830   const intptr_t is_sticky = function.is_sticky_specialization(); | 4827   const intptr_t is_sticky = function.is_sticky_specialization(); | 
| 4831   const bool is_one_byte = (specialization_cid == kOneByteStringCid || | 4828   const bool is_one_byte = (specialization_cid == kOneByteStringCid || | 
| 4832                             specialization_cid == kExternalOneByteStringCid); | 4829                             specialization_cid == kExternalOneByteStringCid); | 
| 4833   RegExp& regexp = RegExp::Handle(zone, function.regexp()); | 4830   RegExp& regexp = RegExp::Handle(zone, function.regexp()); | 
| 4834   const String& pattern = String::Handle(zone, regexp.pattern()); | 4831   const String& pattern = String::Handle(zone, regexp.pattern()); | 
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 4890   data->node = node; | 4887   data->node = node; | 
| 4891   Analysis analysis(ignore_case, is_one_byte); | 4888   Analysis analysis(ignore_case, is_one_byte); | 
| 4892   analysis.EnsureAnalyzed(node); | 4889   analysis.EnsureAnalyzed(node); | 
| 4893   if (analysis.has_failed()) { | 4890   if (analysis.has_failed()) { | 
| 4894     const char* error_message = analysis.error_message(); | 4891     const char* error_message = analysis.error_message(); | 
| 4895     return CompilationResult(error_message); | 4892     return CompilationResult(error_message); | 
| 4896   } | 4893   } | 
| 4897 | 4894 | 
| 4898   // Native regexp implementation. | 4895   // Native regexp implementation. | 
| 4899 | 4896 | 
| 4900   IRRegExpMacroAssembler* macro_assembler = new (zone) | 4897   IRRegExpMacroAssembler* macro_assembler = | 
| 4901       IRRegExpMacroAssembler(specialization_cid, data->capture_count, | 4898       new (zone) IRRegExpMacroAssembler(specialization_cid, data->capture_count, | 
| 4902                              parsed_function, ic_data_array, osr_id, zone); | 4899                                         parsed_function, ic_data_array, zone); | 
| 4903 | 4900 | 
| 4904   // Inserted here, instead of in Assembler, because it depends on information | 4901   // Inserted here, instead of in Assembler, because it depends on information | 
| 4905   // in the AST that isn't replicated in the Node structure. | 4902   // in the AST that isn't replicated in the Node structure. | 
| 4906   static const intptr_t kMaxBacksearchLimit = 1024; | 4903   static const intptr_t kMaxBacksearchLimit = 1024; | 
| 4907   if (is_end_anchored && !is_start_anchored && !is_sticky && | 4904   if (is_end_anchored && !is_start_anchored && !is_sticky && | 
| 4908       max_length < kMaxBacksearchLimit) { | 4905       max_length < kMaxBacksearchLimit) { | 
| 4909     macro_assembler->SetCurrentPositionFromEnd(max_length); | 4906     macro_assembler->SetCurrentPositionFromEnd(max_length); | 
| 4910   } | 4907   } | 
| 4911 | 4908 | 
| 4912   if (is_global) { | 4909   if (is_global) { | 
| (...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 5111       CreateSpecializedFunction(thread, zone, regexp, cid, /*sticky=*/true, | 5108       CreateSpecializedFunction(thread, zone, regexp, cid, /*sticky=*/true, | 
| 5112                                 owner); | 5109                                 owner); | 
| 5113     } | 5110     } | 
| 5114   } | 5111   } | 
| 5115 | 5112 | 
| 5116   return regexp.raw(); | 5113   return regexp.raw(); | 
| 5117 } | 5114 } | 
| 5118 | 5115 | 
| 5119 | 5116 | 
| 5120 }  // namespace dart | 5117 }  // namespace dart | 
| OLD | NEW | 
|---|