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        &register_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 &register_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 &register_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