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