Index: src/jsregexp-inl.h |
diff --git a/src/jsregexp-inl.h b/src/jsregexp-inl.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..3ef07d8c5406ed2c02c620778acbae710bc0f5b2 |
--- /dev/null |
+++ b/src/jsregexp-inl.h |
@@ -0,0 +1,106 @@ |
+// Copyright 2013 the V8 project authors. All rights reserved. |
+// Redistribution and use in source and binary forms, with or without |
+// modification, are permitted provided that the following conditions are |
+// met: |
+// |
+// * Redistributions of source code must retain the above copyright |
+// notice, this list of conditions and the following disclaimer. |
+// * Redistributions in binary form must reproduce the above |
+// copyright notice, this list of conditions and the following |
+// disclaimer in the documentation and/or other materials provided |
+// with the distribution. |
+// * Neither the name of Google Inc. nor the names of its |
+// contributors may be used to endorse or promote products derived |
+// from this software without specific prior written permission. |
+// |
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
+ |
+ |
+#ifndef V8_JSREGEXP_INL_H_ |
+#define V8_JSREGEXP_INL_H_ |
+ |
+#include "allocation.h" |
+#include "handles.h" |
+#include "heap.h" |
+#include "jsregexp.h" |
+#include "objects.h" |
+ |
+namespace v8 { |
+namespace internal { |
+ |
+ |
+RegExpImpl::GlobalCache::~GlobalCache() { |
+ // Deallocate the register array if we allocated it in the constructor |
+ // (as opposed to using the existing jsregexp_static_offsets_vector). |
+ if (register_array_size_ > Isolate::kJSRegexpStaticOffsetsVectorSize) { |
+ DeleteArray(register_array_); |
+ } |
+} |
+ |
+ |
+int32_t* RegExpImpl::GlobalCache::FetchNext() { |
+ current_match_index_++; |
+ if (current_match_index_ >= num_matches_) { |
+ // Current batch of results exhausted. |
+ // Fail if last batch was not even fully filled. |
+ if (num_matches_ < max_matches_) { |
+ num_matches_ = 0; // Signal failed match. |
+ return NULL; |
+ } |
+ |
+ int32_t* last_match = |
+ ®ister_array_[(current_match_index_ - 1) * registers_per_match_]; |
+ int last_end_index = last_match[1]; |
+ |
+ if (regexp_->TypeTag() == JSRegExp::ATOM) { |
+ num_matches_ = RegExpImpl::AtomExecRaw(regexp_, |
+ subject_, |
+ last_end_index, |
+ register_array_, |
+ register_array_size_); |
+ } else { |
+ int last_start_index = last_match[0]; |
+ if (last_start_index == last_end_index) last_end_index++; |
+ if (last_end_index > subject_->length()) { |
+ num_matches_ = 0; // Signal failed match. |
+ return NULL; |
+ } |
+ num_matches_ = RegExpImpl::IrregexpExecRaw(regexp_, |
+ subject_, |
+ last_end_index, |
+ register_array_, |
+ register_array_size_); |
+ } |
+ |
+ if (num_matches_ <= 0) return NULL; |
+ current_match_index_ = 0; |
+ return register_array_; |
+ } else { |
+ return ®ister_array_[current_match_index_ * registers_per_match_]; |
+ } |
+} |
+ |
+ |
+int32_t* RegExpImpl::GlobalCache::LastSuccessfulMatch() { |
+ int index = current_match_index_ * registers_per_match_; |
+ if (num_matches_ == 0) { |
+ // After a failed match we shift back by one result. |
+ index -= registers_per_match_; |
+ } |
+ return ®ister_array_[index]; |
+} |
+ |
+ |
+} } // namespace v8::internal |
+ |
+#endif // V8_JSREGEXP_INL_H_ |