Index: src/isolate.cc |
=================================================================== |
--- src/isolate.cc (revision 11803) |
+++ src/isolate.cc (working copy) |
@@ -1547,6 +1547,11 @@ |
thread_data_table_->RemoveAllThreads(this); |
} |
+ if (serialize_partial_snapshot_cache_ != NULL) { |
+ delete[] serialize_partial_snapshot_cache_; |
+ serialize_partial_snapshot_cache_ = NULL; |
+ } |
+ |
if (!IsDefaultIsolate()) { |
delete this; |
} |
@@ -1595,6 +1600,26 @@ |
} |
+void Isolate::PushToPartialSnapshotCache(Object* obj) { |
+ int length = serialize_partial_snapshot_cache_length(); |
+ int capacity = serialize_partial_snapshot_cache_capacity(); |
+ |
+ if (length >= capacity) { |
+ int new_capacity = (capacity + 10) * 1.2; |
+ Object** new_array = new Object*[new_capacity]; |
+ for (int i = 0; i < length; i++) { |
+ new_array[i] = serialize_partial_snapshot_cache()[i]; |
+ } |
+ if (capacity != 0) delete[] serialize_partial_snapshot_cache(); |
+ set_serialize_partial_snapshot_cache(new_array); |
+ set_serialize_partial_snapshot_cache_capacity(new_capacity); |
+ } |
+ |
+ serialize_partial_snapshot_cache()[length] = obj; |
+ set_serialize_partial_snapshot_cache_length(length + 1); |
+} |
+ |
+ |
void Isolate::SetIsolateThreadLocals(Isolate* isolate, |
PerIsolateThreadData* data) { |
Thread::SetThreadLocal(isolate_key_, isolate); |
@@ -1812,6 +1837,11 @@ |
return false; |
} |
+ if (create_heap_objects) { |
+ // Terminate the cache array with the sentinel so we can iterate. |
+ PushToPartialSnapshotCache(heap_.undefined_value()); |
+ } |
+ |
InitializeThreadLocal(); |
bootstrapper_->Initialize(create_heap_objects); |
@@ -1838,7 +1868,7 @@ |
#endif |
// If we are deserializing, read the state into the now-empty heap. |
- if (des != NULL) { |
+ if (!create_heap_objects) { |
des->Deserialize(); |
} |
stub_cache_->Initialize(); |
@@ -1853,7 +1883,7 @@ |
heap_.SetStackLimits(); |
// Quiet the heap NaN if needed on target platform. |
- if (des != NULL) Assembler::QuietNaN(heap_.nan_value()); |
+ if (create_heap_objects) Assembler::QuietNaN(heap_.nan_value()); |
deoptimizer_data_ = new DeoptimizerData; |
runtime_profiler_ = new RuntimeProfiler(this); |
@@ -1861,7 +1891,7 @@ |
// If we are deserializing, log non-function code objects and compiled |
// functions found in the snapshot. |
- if (des != NULL && (FLAG_log_code || FLAG_ll_prof)) { |
+ if (create_heap_objects && (FLAG_log_code || FLAG_ll_prof)) { |
HandleScope scope; |
LOG(this, LogCodeObjects()); |
LOG(this, LogCompiledFunctions()); |