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 #ifndef VM_REGEXP_ASSEMBLER_H_ | 5 #ifndef VM_REGEXP_ASSEMBLER_H_ |
6 #define VM_REGEXP_ASSEMBLER_H_ | 6 #define VM_REGEXP_ASSEMBLER_H_ |
7 | 7 |
8 #include "vm/assembler.h" | 8 #include "vm/assembler.h" |
9 #include "vm/intermediate_language.h" | 9 #include "vm/intermediate_language.h" |
10 #include "vm/object.h" | 10 #include "vm/object.h" |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
77 enum { | 77 enum { |
78 kParamStringIndex = 0, | 78 kParamStringIndex = 0, |
79 kParamStartOffsetIndex, | 79 kParamStartOffsetIndex, |
80 kParamCount | 80 kParamCount |
81 }; | 81 }; |
82 | 82 |
83 enum IrregexpImplementation { | 83 enum IrregexpImplementation { |
84 kIRImplementation | 84 kIRImplementation |
85 }; | 85 }; |
86 | 86 |
87 explicit RegExpMacroAssembler(Isolate* isolate); | 87 explicit RegExpMacroAssembler(Zone* zone); |
88 virtual ~RegExpMacroAssembler(); | 88 virtual ~RegExpMacroAssembler(); |
89 // The maximal number of pushes between stack checks. Users must supply | 89 // The maximal number of pushes between stack checks. Users must supply |
90 // kCheckStackLimit flag to push operations (instead of kNoStackLimitCheck) | 90 // kCheckStackLimit flag to push operations (instead of kNoStackLimitCheck) |
91 // at least once for every stack_limit() pushes that are executed. | 91 // at least once for every stack_limit() pushes that are executed. |
92 virtual intptr_t stack_limit_slack() = 0; | 92 virtual intptr_t stack_limit_slack() = 0; |
93 virtual bool CanReadUnaligned() = 0; | 93 virtual bool CanReadUnaligned() = 0; |
94 virtual void AdvanceCurrentPosition(intptr_t by) = 0; // Signed cp change. | 94 virtual void AdvanceCurrentPosition(intptr_t by) = 0; // Signed cp change. |
95 virtual void AdvanceRegister(intptr_t reg, intptr_t by) = 0; // r[reg] += by. | 95 virtual void AdvanceRegister(intptr_t reg, intptr_t by) = 0; // r[reg] += by. |
96 // Continues execution from the position pushed on the top of the backtrack | 96 // Continues execution from the position pushed on the top of the backtrack |
97 // stack by an earlier PushBacktrack(BlockLabel*). | 97 // stack by an earlier PushBacktrack(BlockLabel*). |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
202 | 202 |
203 enum GlobalMode { NOT_GLOBAL, GLOBAL, GLOBAL_NO_ZERO_LENGTH_CHECK }; | 203 enum GlobalMode { NOT_GLOBAL, GLOBAL, GLOBAL_NO_ZERO_LENGTH_CHECK }; |
204 // Set whether the regular expression has the global flag. Exiting due to | 204 // Set whether the regular expression has the global flag. Exiting due to |
205 // a failure in a global regexp may still mean success overall. | 205 // a failure in a global regexp may still mean success overall. |
206 inline void set_global_mode(GlobalMode mode) { global_mode_ = mode; } | 206 inline void set_global_mode(GlobalMode mode) { global_mode_ = mode; } |
207 inline bool global() { return global_mode_ != NOT_GLOBAL; } | 207 inline bool global() { return global_mode_ != NOT_GLOBAL; } |
208 inline bool global_with_zero_length_check() { | 208 inline bool global_with_zero_length_check() { |
209 return global_mode_ == GLOBAL; | 209 return global_mode_ == GLOBAL; |
210 } | 210 } |
211 | 211 |
212 Isolate* isolate() const { return isolate_; } | 212 Zone* zone() const { return zone_; } |
213 | 213 |
214 private: | 214 private: |
215 bool slow_safe_compiler_; | 215 bool slow_safe_compiler_; |
216 bool global_mode_; | 216 bool global_mode_; |
217 Isolate* isolate_; | 217 Zone* zone_; |
218 }; | 218 }; |
219 | 219 |
220 | 220 |
221 class IRRegExpMacroAssembler : public RegExpMacroAssembler { | 221 class IRRegExpMacroAssembler : public RegExpMacroAssembler { |
222 public: | 222 public: |
223 // Type of input string to generate code for. | 223 // Type of input string to generate code for. |
224 enum Mode { ASCII = 1, UC16 = 2 }; | 224 enum Mode { ASCII = 1, UC16 = 2 }; |
225 | 225 |
226 // Result of calling generated native RegExp code. | 226 // Result of calling generated native RegExp code. |
227 // RETRY: Something significant changed during execution, and the matching | 227 // RETRY: Something significant changed during execution, and the matching |
228 // should be retried from scratch. | 228 // should be retried from scratch. |
229 // EXCEPTION: Something failed during execution. If no exception has been | 229 // EXCEPTION: Something failed during execution. If no exception has been |
230 // thrown, it's an internal out-of-memory, and the caller should | 230 // thrown, it's an internal out-of-memory, and the caller should |
231 // throw the exception. | 231 // throw the exception. |
232 // FAILURE: Matching failed. | 232 // FAILURE: Matching failed. |
233 // SUCCESS: Matching succeeded, and the output array has been filled with | 233 // SUCCESS: Matching succeeded, and the output array has been filled with |
234 // capture positions. | 234 // capture positions. |
235 enum Result { RETRY = -2, EXCEPTION = -1, FAILURE = 0, SUCCESS = 1 }; | 235 enum Result { RETRY = -2, EXCEPTION = -1, FAILURE = 0, SUCCESS = 1 }; |
236 | 236 |
237 IRRegExpMacroAssembler(intptr_t specialization_cid, | 237 IRRegExpMacroAssembler(intptr_t specialization_cid, |
238 intptr_t capture_count, | 238 intptr_t capture_count, |
239 const ParsedFunction* parsed_function, | 239 const ParsedFunction* parsed_function, |
240 const ZoneGrowableArray<const ICData*>& ic_data_array, | 240 const ZoneGrowableArray<const ICData*>& ic_data_array, |
241 Isolate* isolate); | 241 Zone* zone); |
242 virtual ~IRRegExpMacroAssembler(); | 242 virtual ~IRRegExpMacroAssembler(); |
243 | 243 |
244 virtual bool CanReadUnaligned(); | 244 virtual bool CanReadUnaligned(); |
245 | 245 |
246 // Compares two-byte strings case insensitively. | 246 // Compares two-byte strings case insensitively. |
247 // Called from generated RegExp code. | 247 // Called from generated RegExp code. |
248 static RawBool* CaseInsensitiveCompareUC16( | 248 static RawBool* CaseInsensitiveCompareUC16( |
249 RawString* str_raw, | 249 RawString* str_raw, |
250 RawSmi* lhs_index_raw, | 250 RawSmi* lhs_index_raw, |
251 RawSmi* rhs_index_raw, | 251 RawSmi* rhs_index_raw, |
252 RawSmi* length_raw); | 252 RawSmi* length_raw); |
253 | 253 |
254 static RawArray* Execute(const Function& function, | 254 static RawArray* Execute(const Function& function, |
255 const String& input, | 255 const String& input, |
256 const Smi& start_offset, | 256 const Smi& start_offset, |
257 Isolate* isolate); | 257 Zone* zone); |
258 | 258 |
259 virtual bool IsClosed() const { return (current_instruction_ == NULL); } | 259 virtual bool IsClosed() const { return (current_instruction_ == NULL); } |
260 | 260 |
261 virtual intptr_t stack_limit_slack(); | 261 virtual intptr_t stack_limit_slack(); |
262 virtual void AdvanceCurrentPosition(intptr_t by); | 262 virtual void AdvanceCurrentPosition(intptr_t by); |
263 virtual void AdvanceRegister(intptr_t reg, intptr_t by); | 263 virtual void AdvanceRegister(intptr_t reg, intptr_t by); |
264 virtual void Backtrack(); | 264 virtual void Backtrack(); |
265 virtual void BindBlock(BlockLabel* label); | 265 virtual void BindBlock(BlockLabel* label); |
266 virtual void CheckAtStart(BlockLabel* on_at_start); | 266 virtual void CheckAtStart(BlockLabel* on_at_start); |
267 virtual void CheckCharacter(uint32_t c, BlockLabel* on_equal); | 267 virtual void CheckCharacter(uint32_t c, BlockLabel* on_equal); |
(...skipping 372 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
640 IdAllocator temp_id_; | 640 IdAllocator temp_id_; |
641 IdAllocator arg_id_; | 641 IdAllocator arg_id_; |
642 IdAllocator local_id_; | 642 IdAllocator local_id_; |
643 IdAllocator indirect_id_; | 643 IdAllocator indirect_id_; |
644 }; | 644 }; |
645 | 645 |
646 | 646 |
647 } // namespace dart | 647 } // namespace dart |
648 | 648 |
649 #endif // VM_REGEXP_ASSEMBLER_H_ | 649 #endif // VM_REGEXP_ASSEMBLER_H_ |
OLD | NEW |