Index: src/jsregexp.h |
diff --git a/src/jsregexp.h b/src/jsregexp.h |
index 9a84237fde95ba829715e03d6947acd7444959e9..96825cef218db17ba2b7ff6c56d9f30078c42617 100644 |
--- a/src/jsregexp.h |
+++ b/src/jsregexp.h |
@@ -93,6 +93,14 @@ class RegExpImpl { |
JSRegExp::Flags flags, |
Handle<String> match_pattern); |
+ |
+ static int AtomExecRaw(Handle<JSRegExp> regexp, |
+ Handle<String> subject, |
+ int index, |
+ int32_t* output, |
+ int output_size); |
+ |
+ |
static Handle<Object> AtomExec(Handle<JSRegExp> regexp, |
Handle<String> subject, |
int index, |
@@ -105,17 +113,11 @@ class RegExpImpl { |
// This ensures that the regexp is compiled for the subject, and that |
// the subject is flat. |
// Returns the number of integer spaces required by IrregexpExecOnce |
- // as its "registers" argument. If the regexp cannot be compiled, |
+ // as its "registers" argument. If the regexp cannot be compiled, |
// an exception is set as pending, and this function returns negative. |
static int IrregexpPrepare(Handle<JSRegExp> regexp, |
Handle<String> subject); |
- // Calculate the size of offsets vector for the case of global regexp |
- // and the number of matches this vector is able to store. |
- static int GlobalOffsetsVectorSize(Handle<JSRegExp> regexp, |
- int registers_per_match, |
- int* max_matches); |
- |
// Execute a regular expression on the subject, starting from index. |
// If matching succeeds, return the number of matches. This can be larger |
// than one in the case of global regular expressions. |
@@ -125,17 +127,57 @@ class RegExpImpl { |
static int IrregexpExecRaw(Handle<JSRegExp> regexp, |
Handle<String> subject, |
int index, |
- Vector<int> registers); |
+ int32_t* output, |
+ int output_size); |
// Execute an Irregexp bytecode pattern. |
// On a successful match, the result is a JSArray containing |
- // captured positions. On a failure, the result is the null value. |
+ // captured positions. On a failure, the result is the null value. |
// Returns an empty handle in case of an exception. |
static Handle<Object> IrregexpExec(Handle<JSRegExp> regexp, |
Handle<String> subject, |
int index, |
Handle<JSArray> lastMatchInfo); |
+ // Set last match info. If match is NULL, then setting captures is omitted. |
+ static Handle<JSArray> SetLastMatchInfo(Handle<JSArray> last_match_info, |
+ Handle<String> subject, |
+ int capture_count, |
+ int32_t* match); |
+ |
+ |
+ class GlobalCache { |
+ public: |
+ GlobalCache(Handle<JSRegExp> regexp, |
+ Handle<String> subject, |
+ bool is_global, |
+ Isolate* isolate); |
+ |
+ ~GlobalCache(); |
+ |
+ // Fetch the next entry in the cache for global regexp match results. |
+ // This does not set the last match info. Upon failure, NULL is returned. |
+ // The cause can be checked with Result(). The previous |
+ // result is still in available in memory when a failure happens. |
+ int32_t* FetchNext(); |
+ |
+ int32_t* LastSuccessfulMatch(); |
+ |
+ inline bool HasException() { return num_matches_ < 0; } |
+ |
+ private: |
+ int num_matches_; |
+ int max_matches_; |
+ int current_match_index_; |
+ int registers_per_match_; |
+ // Pointer to the last set of captures. |
+ int32_t* register_array_; |
+ int register_array_size_; |
+ Handle<JSRegExp> regexp_; |
+ Handle<String> subject_; |
+ }; |
+ |
+ |
// Array index in the lastMatchInfo array. |
static const int kLastCaptureCount = 0; |
static const int kLastSubject = 1; |
@@ -195,30 +237,10 @@ class RegExpImpl { |
static const int kRegWxpCompiledLimit = 1 * MB; |
private: |
- static String* last_ascii_string_; |
- static String* two_byte_cached_string_; |
- |
static bool CompileIrregexp( |
Handle<JSRegExp> re, Handle<String> sample_subject, bool is_ascii); |
static inline bool EnsureCompiledIrregexp( |
Handle<JSRegExp> re, Handle<String> sample_subject, bool is_ascii); |
- |
- |
- // Set the subject cache. The previous string buffer is not deleted, so the |
- // caller should ensure that it doesn't leak. |
- static void SetSubjectCache(String* subject, |
- char* utf8_subject, |
- int uft8_length, |
- int character_position, |
- int utf8_position); |
- |
- // A one element cache of the last utf8_subject string and its length. The |
- // subject JS String object is cached in the heap. We also cache a |
- // translation between position and utf8 position. |
- static char* utf8_subject_cache_; |
- static int utf8_length_cache_; |
- static int utf8_position_; |
- static int character_position_; |
}; |
@@ -1622,40 +1644,6 @@ class RegExpEngine: public AllStatic { |
}; |
-class OffsetsVector { |
- public: |
- inline OffsetsVector(int num_registers, Isolate* isolate) |
- : offsets_vector_length_(num_registers) { |
- if (offsets_vector_length_ > Isolate::kJSRegexpStaticOffsetsVectorSize) { |
- vector_ = NewArray<int>(offsets_vector_length_); |
- } else { |
- vector_ = isolate->jsregexp_static_offsets_vector(); |
- } |
- } |
- inline ~OffsetsVector() { |
- if (offsets_vector_length_ > Isolate::kJSRegexpStaticOffsetsVectorSize) { |
- DeleteArray(vector_); |
- vector_ = NULL; |
- } |
- } |
- inline int* vector() { return vector_; } |
- inline int length() { return offsets_vector_length_; } |
- |
- static const int kStaticOffsetsVectorSize = |
- Isolate::kJSRegexpStaticOffsetsVectorSize; |
- |
- private: |
- static Address static_offsets_vector_address(Isolate* isolate) { |
- return reinterpret_cast<Address>(isolate->jsregexp_static_offsets_vector()); |
- } |
- |
- int* vector_; |
- int offsets_vector_length_; |
- |
- friend class ExternalReference; |
-}; |
- |
- |
} } // namespace v8::internal |
#endif // V8_JSREGEXP_H_ |