| Index: src/handles-inl.h
|
| diff --git a/src/handles-inl.h b/src/handles-inl.h
|
| index 4f5e9fe720e0b68710ee9e2e6dc23709513c6f89..14687e3bd28086ff8d79935511b383e04ea27037 100644
|
| --- a/src/handles-inl.h
|
| +++ b/src/handles-inl.h
|
| @@ -122,31 +122,37 @@ HandleScope::HandleScope(Isolate* isolate) {
|
|
|
|
|
| HandleScope::~HandleScope() {
|
| - CloseScope();
|
| + CloseScope(isolate_, prev_next_, prev_limit_);
|
| }
|
|
|
| -void HandleScope::CloseScope() {
|
| +
|
| +void HandleScope::CloseScope(Isolate* isolate,
|
| + Object** prev_next,
|
| + Object** prev_limit) {
|
| v8::ImplementationUtilities::HandleScopeData* current =
|
| - isolate_->handle_scope_data();
|
| - current->next = prev_next_;
|
| + isolate->handle_scope_data();
|
| +
|
| + current->next = prev_next;
|
| current->level--;
|
| - if (current->limit != prev_limit_) {
|
| - current->limit = prev_limit_;
|
| - DeleteExtensions(isolate_);
|
| + if (current->limit != prev_limit) {
|
| + current->limit = prev_limit;
|
| + DeleteExtensions(isolate);
|
| }
|
| +
|
| #ifdef ENABLE_EXTRA_CHECKS
|
| - ZapRange(prev_next_, prev_limit_);
|
| + ZapRange(prev_next, prev_limit);
|
| #endif
|
| }
|
|
|
|
|
| template <typename T>
|
| Handle<T> HandleScope::CloseAndEscape(Handle<T> handle_value) {
|
| - T* value = *handle_value;
|
| - // Throw away all handles in the current scope.
|
| - CloseScope();
|
| v8::ImplementationUtilities::HandleScopeData* current =
|
| isolate_->handle_scope_data();
|
| +
|
| + T* value = *handle_value;
|
| + // Throw away all handles in the current scope.
|
| + CloseScope(isolate_, prev_next_, prev_limit_);
|
| // Allocate one handle in the parent scope.
|
| ASSERT(current->level > 0);
|
| Handle<T> result(CreateHandle<T>(isolate_, value));
|
| @@ -180,15 +186,14 @@ T** HandleScope::CreateHandle(Isolate* isolate, T* value) {
|
| #ifdef DEBUG
|
| inline NoHandleAllocation::NoHandleAllocation(Isolate* isolate)
|
| : isolate_(isolate) {
|
| - v8::ImplementationUtilities::HandleScopeData* current =
|
| - isolate_->handle_scope_data();
|
| -
|
| active_ = !isolate->optimizing_compiler_thread()->IsOptimizerThread();
|
| if (active_) {
|
| // Shrink the current handle scope to make it impossible to do
|
| // handle allocations without an explicit handle scope.
|
| + v8::ImplementationUtilities::HandleScopeData* current =
|
| + isolate_->handle_scope_data();
|
| + limit_ = current->limit;
|
| current->limit = current->next;
|
| -
|
| level_ = current->level;
|
| current->level = 0;
|
| }
|
| @@ -199,10 +204,12 @@ inline NoHandleAllocation::~NoHandleAllocation() {
|
| if (active_) {
|
| // Restore state in current handle scope to re-enable handle
|
| // allocations.
|
| - v8::ImplementationUtilities::HandleScopeData* data =
|
| + v8::ImplementationUtilities::HandleScopeData* current =
|
| isolate_->handle_scope_data();
|
| - ASSERT_EQ(0, data->level);
|
| - data->level = level_;
|
| + ASSERT_EQ(0, current->level);
|
| + current->level = level_;
|
| + ASSERT_EQ(current->next, current->limit);
|
| + current->limit = limit_;
|
| }
|
| }
|
|
|
|
|