Index: src/handles.cc |
diff --git a/src/handles.cc b/src/handles.cc |
index def1604ac7438c5769a0cb6287fd009dee54758d..9e4f664dd1f6e4d583fef76c301b1d3c61e503cf 100644 |
--- a/src/handles.cc |
+++ b/src/handles.cc |
@@ -958,4 +958,54 @@ int Utf8Length(Handle<String> str) { |
return len; |
} |
+ |
+DeferredHandleScope::DeferredHandleScope(Isolate* isolate) |
+ : impl_(isolate->handle_scope_implementer()) { |
+ impl_->BeginDeferredScope(); |
+ Object** new_next = impl_->GetSpareOrNewBlock(); |
+ Object** new_limit = &new_next[kHandleBlockSize]; |
+ impl_->blocks()->Add(new_next); |
+ |
+ v8::ImplementationUtilities::HandleScopeData* data = |
+ impl_->isolate()->handle_scope_data(); |
+#ifdef DEBUG |
+ prev_level_ = data->level; |
+#endif |
+ data->level++; |
+ prev_limit_ = data->limit; |
+ prev_next_ = data->next; |
+ data->next = new_next; |
+ data->limit = new_limit; |
+} |
+ |
Erik Corry
2012/06/27 10:28:15
Missing newline.
sanjoy
2012/06/27 11:17:09
Fixed.
|
+DeferredHandleScope::~DeferredHandleScope() { |
+ impl_->isolate()->handle_scope_data()->level--; |
+ ASSERT(handles_detached_); |
+ ASSERT(impl_->isolate()->handle_scope_data()->level == prev_level_); |
+} |
+ |
+ |
+DeferredHandles* DeferredHandleScope::Detach() { |
+ DeferredHandles* deferred = impl_->Detach(prev_limit_); |
+ v8::ImplementationUtilities::HandleScopeData* data = |
+ impl_->isolate()->handle_scope_data(); |
+ data->next = prev_next_; |
+ data->limit = prev_limit_; |
+#ifdef DEBUG |
+ handles_detached_ = true; |
+#endif |
+ return deferred; |
+} |
+ |
+ |
+CompilationHandleScope::CompilationHandleScope(CompilationInfo* info) |
Erik Corry
2012/06/27 10:28:15
This should also go somewhere else (perhaps inline
sanjoy
2012/06/27 11:17:09
Moved to compiler.h
|
+ : deferred_(info->isolate()), info_(info) { |
+} |
+ |
+ |
+CompilationHandleScope::~CompilationHandleScope() { |
+ info_->set_deferred_handles(deferred_.Detach()); |
+} |
+ |
+ |
} } // namespace v8::internal |