12f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org// Copyright 2013 the V8 project authors. All rights reserved. 23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// Use of this source code is governed by a BSD-style license that can be 33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// found in the LICENSE file. 42f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org 52f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org 62f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org#ifndef V8_JSREGEXP_INL_H_ 72f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org#define V8_JSREGEXP_INL_H_ 82f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org 9196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/allocation.h" 10196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/handles.h" 11196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/heap.h" 12196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/jsregexp.h" 13196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/objects.h" 142f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org 152f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.orgnamespace v8 { 162f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.orgnamespace internal { 172f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org 182f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org 192f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.orgRegExpImpl::GlobalCache::~GlobalCache() { 202f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org // Deallocate the register array if we allocated it in the constructor 212f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org // (as opposed to using the existing jsregexp_static_offsets_vector). 222f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org if (register_array_size_ > Isolate::kJSRegexpStaticOffsetsVectorSize) { 232f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org DeleteArray(register_array_); 242f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org } 252f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org} 262f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org 272f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org 282f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.orgint32_t* RegExpImpl::GlobalCache::FetchNext() { 292f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org current_match_index_++; 302f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org if (current_match_index_ >= num_matches_) { 312f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org // Current batch of results exhausted. 322f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org // Fail if last batch was not even fully filled. 332f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org if (num_matches_ < max_matches_) { 342f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org num_matches_ = 0; // Signal failed match. 352f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org return NULL; 362f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org } 372f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org 382f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org int32_t* last_match = 392f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org ®ister_array_[(current_match_index_ - 1) * registers_per_match_]; 402f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org int last_end_index = last_match[1]; 412f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org 422f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org if (regexp_->TypeTag() == JSRegExp::ATOM) { 432f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org num_matches_ = RegExpImpl::AtomExecRaw(regexp_, 442f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org subject_, 452f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org last_end_index, 462f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org register_array_, 472f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org register_array_size_); 482f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org } else { 492f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org int last_start_index = last_match[0]; 502f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org if (last_start_index == last_end_index) last_end_index++; 512f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org if (last_end_index > subject_->length()) { 522f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org num_matches_ = 0; // Signal failed match. 532f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org return NULL; 542f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org } 552f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org num_matches_ = RegExpImpl::IrregexpExecRaw(regexp_, 562f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org subject_, 572f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org last_end_index, 582f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org register_array_, 592f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org register_array_size_); 602f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org } 612f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org 622f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org if (num_matches_ <= 0) return NULL; 632f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org current_match_index_ = 0; 642f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org return register_array_; 652f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org } else { 662f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org return ®ister_array_[current_match_index_ * registers_per_match_]; 672f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org } 682f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org} 692f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org 702f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org 712f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.orgint32_t* RegExpImpl::GlobalCache::LastSuccessfulMatch() { 722f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org int index = current_match_index_ * registers_per_match_; 732f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org if (num_matches_ == 0) { 742f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org // After a failed match we shift back by one result. 752f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org index -= registers_per_match_; 762f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org } 772f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org return ®ister_array_[index]; 782f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org} 792f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org 802f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org 812f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org} } // namespace v8::internal 822f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org 832f0efdebb142c00de6950453b4c2df20ceb8df6emmassi@chromium.org#endif // V8_JSREGEXP_INL_H_ 84