diff options
Diffstat (limited to 'deps/v8/src/regexp/jsregexp-inl.h')
-rw-r--r-- | deps/v8/src/regexp/jsregexp-inl.h | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/deps/v8/src/regexp/jsregexp-inl.h b/deps/v8/src/regexp/jsregexp-inl.h new file mode 100644 index 0000000000..118f3dba9c --- /dev/null +++ b/deps/v8/src/regexp/jsregexp-inl.h @@ -0,0 +1,83 @@ +// Copyright 2013 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. + + +#ifndef V8_REGEXP_JSREGEXP_INL_H_ +#define V8_REGEXP_JSREGEXP_INL_H_ + +#include "src/allocation.h" +#include "src/handles.h" +#include "src/heap/heap.h" +#include "src/objects.h" +#include "src/regexp/jsregexp.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_REGEXP_JSREGEXP_INL_H_ |