Index: src/snapshot/serialize.cc |
diff --git a/src/snapshot/serialize.cc b/src/snapshot/serialize.cc |
index c819a11ea762e7cc6cc77819670023b374cc8fa6..652d67a03bedaf878e126a51817390e217616c60 100644 |
--- a/src/snapshot/serialize.cc |
+++ b/src/snapshot/serialize.cc |
@@ -575,7 +575,7 @@ void Deserializer::Deserialize(Isolate* isolate) { |
} |
isolate_->heap()->set_native_contexts_list( |
- isolate_->heap()->undefined_value()); |
+ isolate_->heap()->code_stub_context()); |
// The allocation site list is build during root iteration, but if no sites |
// were encountered then it needs to be initialized to undefined. |
@@ -592,6 +592,13 @@ void Deserializer::Deserialize(Isolate* isolate) { |
} |
} |
+ for (int i = 0; i < CodeStubNatives::GetBuiltinsCount(); i++) { |
+ Object* source = isolate_->heap()->code_stub_natives_source_cache()->get(i); |
+ if (!source->IsUndefined()) { |
+ ExternalOneByteString::cast(source)->update_data_cache(); |
+ } |
+ } |
+ |
FlushICacheForNewCodeObjects(); |
// Issue code events for newly deserialized code objects. |
@@ -1185,6 +1192,19 @@ bool Deserializer::ReadData(Object** current, Object** limit, int source_space, |
break; |
} |
+ case kCodeStubNativesStringResource: { |
+ DCHECK(!isolate_->heap()->deserialization_complete()); |
+ int index = source_.Get(); |
Yang
2015/07/08 08:32:54
This duplicate code could be refactored into a hel
danno
2015/07/08 20:25:59
Done.
|
+ Vector<const char> source_vector = |
+ CodeStubNatives::GetScriptSource(index); |
+ NativesExternalStringResource* resource = |
+ new NativesExternalStringResource(source_vector.start(), |
+ source_vector.length()); |
+ Object* resource_obj = reinterpret_cast<Object*>(resource); |
+ UnalignedCopy(current++, &resource_obj); |
+ break; |
+ } |
+ |
// Deserialize raw data of variable length. |
case kVariableRawData: { |
int size_in_bytes = source_.GetInt(); |
@@ -1419,6 +1439,12 @@ void PartialSerializer::Serialize(Object** o) { |
Context* context = Context::cast(*o); |
global_object_ = context->global_object(); |
back_reference_map()->AddGlobalProxy(context->global_proxy()); |
+ if (context->IsNativeContext()) { |
+ context->set(Context::NEXT_CONTEXT_LINK, |
Yang
2015/07/08 08:32:54
Some comment here would be great.
danno
2015/07/08 20:25:59
Done.
|
+ isolate_->heap()->undefined_value()); |
+ DCHECK(!context->global_object()->IsUndefined()); |
+ DCHECK(!context->builtins()->IsUndefined()); |
+ } |
} |
VisitPointer(o); |
SerializeDeferredObjects(); |
@@ -1623,7 +1649,16 @@ bool Serializer::SerializeKnownObject(HeapObject* obj, HowToCode how_to_code, |
void StartupSerializer::SerializeObject(HeapObject* obj, HowToCode how_to_code, |
WhereToPoint where_to_point, int skip) { |
- DCHECK(!obj->IsJSFunction()); |
+#if DEBUG |
+ // Make sure that all contexts are derived from the code-stub context |
Yang
2015/07/08 08:32:54
... all *functions* are derived ...
danno
2015/07/08 20:25:59
Done.
|
+ if (obj->IsJSFunction()) { |
+ Context* current = JSFunction::cast(obj)->context(); |
Yang
2015/07/08 08:32:54
Can you replace this with
DCHECK(!obj->IsJSFuncti
danno
2015/07/08 20:25:59
Done.
|
+ while (current != isolate()->heap()->code_stub_context()) { |
+ current = current->previous(); |
+ } |
+ DCHECK_EQ(isolate()->heap()->code_stub_context(), current); |
+ } |
+#endif |
int root_index = root_index_map_.Lookup(obj); |
// We can only encode roots as such if it has already been serialized. |
@@ -2146,6 +2181,23 @@ void Serializer::ObjectSerializer::VisitExternalOneByteString( |
} |
} |
} |
+ for (int i = 0; i < CodeStubNatives::GetBuiltinsCount(); i++) { |
Yang
2015/07/08 08:32:54
Could you refactor this duplicate code into a help
danno
2015/07/08 20:25:59
Done.
|
+ Object* source = |
+ serializer_->isolate()->heap()->code_stub_natives_source_cache()->get( |
+ i); |
+ if (!source->IsUndefined()) { |
+ ExternalOneByteString* string = ExternalOneByteString::cast(source); |
+ typedef v8::String::ExternalOneByteStringResource Resource; |
+ const Resource* resource = string->resource(); |
+ if (resource == *resource_pointer) { |
+ sink_->Put(kCodeStubNativesStringResource, |
+ "CodeStubNativesStringResource"); |
+ sink_->PutSection(i, "CodeStubNativesStringResourceEnd"); |
+ bytes_processed_so_far_ += sizeof(resource); |
+ return; |
+ } |
+ } |
+ } |
// One of the strings in the natives cache should match the resource. We |
// don't expect any other kinds of external strings here. |
UNREACHABLE(); |