Index: src/compiler.h |
diff --git a/src/compiler.h b/src/compiler.h |
index 26c0ac43c1b33d5ea25c942544cd3cbb882a0b86..135904860eaea42e4790182d113bcd173b29bd2c 100644 |
--- a/src/compiler.h |
+++ b/src/compiler.h |
@@ -45,6 +45,8 @@ class CompilationInfo BASE_EMBEDDED { |
CompilationInfo(Handle<SharedFunctionInfo> shared_info, Zone* zone); |
CompilationInfo(Handle<JSFunction> closure, Zone* zone); |
+ ~CompilationInfo(); |
+ |
Isolate* isolate() { |
ASSERT(Isolate::Current() == isolate_); |
return isolate_; |
@@ -173,6 +175,11 @@ class CompilationInfo BASE_EMBEDDED { |
// current compilation pipeline. |
void AbortOptimization(); |
+ void set_deferred_handles(DeferredHandles* deferred_handles) { |
+ ASSERT(deferred_handles_ == NULL); |
+ deferred_handles_ = deferred_handles; |
+ } |
+ |
private: |
Isolate* isolate_; |
@@ -259,6 +266,8 @@ class CompilationInfo BASE_EMBEDDED { |
// CompilationInfo allocates. |
Zone* zone_; |
+ DeferredHandles* deferred_handles_; |
+ |
DISALLOW_COPY_AND_ASSIGN(CompilationInfo); |
}; |
@@ -286,6 +295,23 @@ class CompilationInfoWithZone: public CompilationInfo { |
}; |
+// A wrapper around a CompilationInfo that detaches the Handles from |
+// the underlying DeferredHandleScope and stores them in info_ on |
+// destruction. |
+class CompilationHandleScope BASE_EMBEDDED { |
+ public: |
+ explicit CompilationHandleScope(CompilationInfo* info) |
+ : deferred_(info->isolate()), info_(info) {} |
+ ~CompilationHandleScope() { |
+ info_->set_deferred_handles(deferred_.Detach()); |
+ } |
+ |
+ private: |
+ DeferredHandleScope deferred_; |
+ CompilationInfo* info_; |
+}; |
+ |
+ |
// The V8 compiler |
// |
// General strategy: Source code is translated into an anonymous function w/o |