Line data Source code
1 : // Copyright 2009 the V8 project authors. All rights reserved.
2 : // Use of this source code is governed by a BSD-style license that can be
3 : // found in the LICENSE file.
4 :
5 : #include "src/regexp/regexp-stack.h"
6 :
7 : #include "src/isolate.h"
8 :
9 : namespace v8 {
10 : namespace internal {
11 :
12 700462 : RegExpStackScope::RegExpStackScope(Isolate* isolate)
13 700462 : : regexp_stack_(isolate->regexp_stack()) {
14 : // Initialize, if not already initialized.
15 700462 : regexp_stack_->EnsureCapacity(0);
16 700462 : }
17 :
18 :
19 700462 : RegExpStackScope::~RegExpStackScope() {
20 : // Reset the buffer if it has grown.
21 700462 : regexp_stack_->Reset();
22 700462 : }
23 :
24 :
25 60744 : RegExpStack::RegExpStack()
26 60744 : : isolate_(NULL) {
27 60744 : }
28 :
29 :
30 59259 : RegExpStack::~RegExpStack() {
31 59259 : thread_local_.Free();
32 59259 : }
33 :
34 :
35 22597 : char* RegExpStack::ArchiveStack(char* to) {
36 : size_t size = sizeof(thread_local_);
37 22597 : MemCopy(reinterpret_cast<void*>(to), &thread_local_, size);
38 22597 : thread_local_ = ThreadLocal();
39 22597 : return to + size;
40 : }
41 :
42 :
43 22597 : char* RegExpStack::RestoreStack(char* from) {
44 : size_t size = sizeof(thread_local_);
45 22597 : MemCopy(&thread_local_, reinterpret_cast<void*>(from), size);
46 22597 : return from + size;
47 : }
48 :
49 :
50 700462 : void RegExpStack::Reset() {
51 700462 : if (thread_local_.memory_size_ > kMinimumStackSize) {
52 139 : DeleteArray(thread_local_.memory_);
53 139 : thread_local_ = ThreadLocal();
54 : }
55 700462 : }
56 :
57 :
58 66122 : void RegExpStack::ThreadLocal::Free() {
59 66122 : if (memory_size_ > 0) {
60 5167 : DeleteArray(memory_);
61 : Clear();
62 : }
63 66122 : }
64 :
65 :
66 700967 : Address RegExpStack::EnsureCapacity(size_t size) {
67 700967 : if (size > kMaximumStackSize) return NULL;
68 700960 : if (size < kMinimumStackSize) size = kMinimumStackSize;
69 700960 : if (thread_local_.memory_size_ < size) {
70 6630 : Address new_memory = NewArray<byte>(static_cast<int>(size));
71 6630 : if (thread_local_.memory_size_ > 0) {
72 : // Copy original memory into top of new memory.
73 498 : MemCopy(reinterpret_cast<void*>(new_memory + size -
74 498 : thread_local_.memory_size_),
75 : reinterpret_cast<void*>(thread_local_.memory_),
76 498 : thread_local_.memory_size_);
77 498 : DeleteArray(thread_local_.memory_);
78 : }
79 6630 : thread_local_.memory_ = new_memory;
80 6630 : thread_local_.memory_size_ = size;
81 6630 : thread_local_.limit_ = new_memory + kStackLimitSlack * kPointerSize;
82 : }
83 700960 : return thread_local_.memory_ + thread_local_.memory_size_;
84 : }
85 :
86 :
87 : } // namespace internal
88 : } // namespace v8
|