13291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org// Copyright 2009 the V8 project authors. All rights reserved.
23291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org// Redistribution and use in source and binary forms, with or without
33291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org// modification, are permitted provided that the following conditions are
43291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org// met:
53291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org//
63291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org//     * Redistributions of source code must retain the above copyright
73291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org//       notice, this list of conditions and the following disclaimer.
83291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org//     * Redistributions in binary form must reproduce the above
93291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org//       copyright notice, this list of conditions and the following
103291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org//       disclaimer in the documentation and/or other materials provided
113291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org//       with the distribution.
123291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org//     * Neither the name of Google Inc. nor the names of its
133291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org//       contributors may be used to endorse or promote products derived
143291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org//       from this software without specific prior written permission.
153291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org//
163291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
173291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
183291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
193291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
203291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
213291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
223291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
233291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
243291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
253291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
263291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
273291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
283291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org#include "v8.h"
293291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org#include "regexp-stack.h"
303291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
3171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace v8 {
3271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace internal {
333291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
34ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgRegExpStackScope::RegExpStackScope(Isolate* isolate)
35ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    : regexp_stack_(isolate->regexp_stack()) {
363291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  // Initialize, if not already initialized.
37ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  regexp_stack_->EnsureCapacity(0);
383291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org}
393291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
403291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
41ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgRegExpStackScope::~RegExpStackScope() {
42ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  ASSERT(Isolate::Current() == regexp_stack_->isolate_);
433291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  // Reset the buffer if it has grown.
44ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  regexp_stack_->Reset();
45ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org}
46ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
47ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
48ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgRegExpStack::RegExpStack()
49ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    : isolate_(NULL) {
50ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org}
51ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
52ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org
53ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgRegExpStack::~RegExpStack() {
5472204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org  thread_local_.Free();
553291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org}
563291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
573291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
583291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgchar* RegExpStack::ArchiveStack(char* to) {
593291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  size_t size = sizeof(thread_local_);
60e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  OS::MemCopy(reinterpret_cast<void*>(to), &thread_local_, size);
613291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  thread_local_ = ThreadLocal();
623291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  return to + size;
633291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org}
643291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
653291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
663291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgchar* RegExpStack::RestoreStack(char* from) {
673291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  size_t size = sizeof(thread_local_);
68e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  OS::MemCopy(&thread_local_, reinterpret_cast<void*>(from), size);
693291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  return from + size;
703291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org}
713291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
723291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
733291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgvoid RegExpStack::Reset() {
743291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  if (thread_local_.memory_size_ > kMinimumStackSize) {
753291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org    DeleteArray(thread_local_.memory_);
763291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org    thread_local_ = ThreadLocal();
773291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  }
783291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org}
793291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
803291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
81c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.orgvoid RegExpStack::ThreadLocal::Free() {
82ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  if (memory_size_ > 0) {
83ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    DeleteArray(memory_);
84ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org    Clear();
85c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org  }
86c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org}
87c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org
88c514574143c1bf74d4fb6e7dccb175fe9ff2f5d3sgjesse@chromium.org
893291210ab99f306b74430ebbc4b7d939629e699fager@chromium.orgAddress RegExpStack::EnsureCapacity(size_t size) {
903291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  if (size > kMaximumStackSize) return NULL;
913291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  if (size < kMinimumStackSize) size = kMinimumStackSize;
923291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  if (thread_local_.memory_size_ < size) {
93c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org    Address new_memory = NewArray<byte>(static_cast<int>(size));
943291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org    if (thread_local_.memory_size_ > 0) {
953291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org      // Copy original memory into top of new memory.
96e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org      OS::MemCopy(
97e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org          reinterpret_cast<void*>(
98e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org              new_memory + size - thread_local_.memory_size_),
99e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org          reinterpret_cast<void*>(thread_local_.memory_),
100e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org          thread_local_.memory_size_);
1013291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org      DeleteArray(thread_local_.memory_);
1023291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org    }
1033291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org    thread_local_.memory_ = new_memory;
1043291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org    thread_local_.memory_size_ = size;
1053291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org    thread_local_.limit_ = new_memory + kStackLimitSlack * kPointerSize;
1063291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  }
1073291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org  return thread_local_.memory_ + thread_local_.memory_size_;
1083291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org}
1093291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
1103291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org
1113291210ab99f306b74430ebbc4b7d939629e699fager@chromium.org}}  // namespace v8::internal
112