Index: src/compiler.h |
diff --git a/src/compiler.h b/src/compiler.h |
index 8e6d295996d049f1c01dde6424c3ba3ae220d819..f53feb954a49c53016d0eece13f3425b117b1619 100644 |
--- a/src/compiler.h |
+++ b/src/compiler.h |
@@ -57,12 +57,8 @@ struct OffsetRange { |
// is constructed based on the resources available at compile-time. |
class CompilationInfo { |
public: |
- CompilationInfo(Handle<Script> script, Zone* zone); |
- CompilationInfo(Handle<SharedFunctionInfo> shared_info, Zone* zone); |
CompilationInfo(Handle<JSFunction> closure, Zone* zone); |
- CompilationInfo(HydrogenCodeStub* stub, Isolate* isolate, Zone* zone); |
- |
- ~CompilationInfo(); |
+ virtual ~CompilationInfo(); |
Isolate* isolate() { |
ASSERT(Isolate::Current() == isolate_); |
@@ -243,6 +239,17 @@ class CompilationInfo { |
deferred_handles_ = deferred_handles; |
} |
+ ZoneList<Handle<Map> >* dependent_maps(DependentCode::DependencyGroup group) { |
+ if (dependent_maps_[group] == NULL) { |
+ dependent_maps_[group] = new(zone_) ZoneList<Handle<Map> >(2, zone_); |
+ } |
+ return dependent_maps_[group]; |
+ } |
+ |
+ void CommitDependentMaps(Handle<Code> code); |
+ |
+ void RollbackDependentMaps(); |
+ |
void SaveHandles() { |
SaveHandle(&closure_); |
SaveHandle(&shared_info_); |
@@ -276,6 +283,26 @@ class CompilationInfo { |
return result; |
} |
+ Handle<Foreign> object_wrapper() { |
+ if (object_wrapper_.is_null()) { |
+ object_wrapper_ = |
+ isolate()->factory()->NewForeign(reinterpret_cast<Address>(this)); |
+ } |
+ return object_wrapper_; |
+ } |
+ |
+ void AbortDueToDependentMap() { |
+ mode_ = DEPENDENT_MAP_ABORT; |
+ } |
+ |
+ bool HasAbortedDueToDependentMap() { |
+ return mode_ == DEPENDENT_MAP_ABORT; |
+ } |
+ |
+ protected: |
+ CompilationInfo(Handle<Script> script, Zone* zone); |
+ CompilationInfo(Handle<SharedFunctionInfo> shared_info, Zone* zone); |
+ CompilationInfo(HydrogenCodeStub* stub, Isolate* isolate, Zone* zone); |
private: |
Isolate* isolate_; |
@@ -289,7 +316,8 @@ class CompilationInfo { |
BASE, |
OPTIMIZE, |
NONOPT, |
- STUB |
+ STUB, |
+ DEPENDENT_MAP_ABORT |
}; |
void Initialize(Isolate* isolate, Mode mode, Zone* zone); |
@@ -369,6 +397,8 @@ class CompilationInfo { |
DeferredHandles* deferred_handles_; |
+ ZoneList<Handle<Map> >* dependent_maps_[DependentCode::kGroupCount]; |
+ |
template<typename T> |
void SaveHandle(Handle<T> *object) { |
if (!object->is_null()) { |
@@ -387,6 +417,8 @@ class CompilationInfo { |
// during graph optimization. |
int opt_count_; |
+ Handle<Foreign> object_wrapper_; |
+ |
DISALLOW_COPY_AND_ASSIGN(CompilationInfo); |
}; |
@@ -407,11 +439,18 @@ class CompilationInfoWithZone: public CompilationInfo { |
: CompilationInfo(closure, &zone_), |
zone_(closure->GetIsolate()), |
zone_scope_(&zone_, DELETE_ON_EXIT) {} |
- explicit CompilationInfoWithZone(HydrogenCodeStub* stub, Isolate* isolate) |
+ CompilationInfoWithZone(HydrogenCodeStub* stub, Isolate* isolate) |
: CompilationInfo(stub, isolate, &zone_), |
zone_(isolate), |
zone_scope_(&zone_, DELETE_ON_EXIT) {} |
+ // Virtual destructor because a CompilationInfoWithZone has to exit the |
+ // zone scope and get rid of dependent maps even when the destructor is |
+ // called when cast as a CompilationInfo. |
+ virtual ~CompilationInfoWithZone() { |
+ RollbackDependentMaps(); |
+ } |
+ |
private: |
Zone zone_; |
ZoneScope zone_scope_; |