| // Copyright 2011 the V8 project authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| // A simple interpreter for the Irregexp byte code. |
| |
| #ifndef V8_REGEXP_REGEXP_INTERPRETER_H_ |
| #define V8_REGEXP_REGEXP_INTERPRETER_H_ |
| |
| #include "src/regexp/regexp.h" |
| |
| namespace v8 { |
| namespace internal { |
| |
| class V8_EXPORT_PRIVATE IrregexpInterpreter : public AllStatic { |
| public: |
| enum Result { |
| FAILURE = RegExp::kInternalRegExpFailure, |
| SUCCESS = RegExp::kInternalRegExpSuccess, |
| EXCEPTION = RegExp::kInternalRegExpException, |
| RETRY = RegExp::kInternalRegExpRetry, |
| FALLBACK_TO_EXPERIMENTAL = RegExp::kInternalRegExpFallbackToExperimental, |
| }; |
| |
| // In case a StackOverflow occurs, a StackOverflowException is created and |
| // EXCEPTION is returned. |
| static Result MatchForCallFromRuntime( |
| Isolate* isolate, Handle<JSRegExp> regexp, Handle<String> subject_string, |
| int* output_registers, int output_register_count, int start_position); |
| |
| // In case a StackOverflow occurs, EXCEPTION is returned. The caller is |
| // responsible for creating the exception. |
| // |
| // RETRY is returned if a retry through the runtime is needed (e.g. when |
| // interrupts have been scheduled or the regexp is marked for tier-up). |
| // |
| // Arguments input_start, input_end and backtrack_stack are |
| // unused. They are only passed to match the signature of the native irregex |
| // code. |
| // |
| // Arguments output_registers and output_register_count describe the results |
| // array, which will contain register values of all captures if SUCCESS is |
| // returned. For all other return codes, the results array remains unmodified. |
| static Result MatchForCallFromJs(Address subject, int32_t start_position, |
| Address input_start, Address input_end, |
| int* output_registers, |
| int32_t output_register_count, |
| Address backtrack_stack, |
| RegExp::CallOrigin call_origin, |
| Isolate* isolate, Address regexp); |
| |
| static Result MatchInternal(Isolate* isolate, ByteArray code_array, |
| String subject_string, int* output_registers, |
| int output_register_count, |
| int total_register_count, int start_position, |
| RegExp::CallOrigin call_origin, |
| uint32_t backtrack_limit); |
| |
| private: |
| static Result Match(Isolate* isolate, JSRegExp regexp, String subject_string, |
| int* output_registers, int output_register_count, |
| int start_position, RegExp::CallOrigin call_origin); |
| }; |
| |
| } // namespace internal |
| } // namespace v8 |
| |
| #endif // V8_REGEXP_REGEXP_INTERPRETER_H_ |