commit ad24cdae728fc34b23e74a22543702de3ae477d1 Author: yangguo@chromium.org Date: Mon Sep 29 07:53:22 2014 +0000 Do not serialize non-lazy compiled function literals. ... and some small refactorings. R=mvstanton@chromium.org Review URL: https://codereview.chromium.org/594513002 git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@24266 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 diff --git a/src/serialize.cc b/src/serialize.cc index a2dde9b..9d59b6f 100644 --- node/deps/v8/src/serialize.cc +++ node/deps/v8/src/serialize.cc @@ -1846,7 +1846,7 @@ ScriptData* CodeSerializer::Serialize(Isolate* isolate, SnapshotByteSink* sink = FLAG_trace_code_serializer ? static_cast(&debug_sink) : static_cast(&list_sink); - CodeSerializer cs(isolate, sink, *source); + CodeSerializer cs(isolate, sink, *source, info->code()); DisallowHeapAllocation no_gc; Object** location = Handle::cast(info).location(); cs.VisitPointer(location); @@ -1867,31 +1867,25 @@ ScriptData* CodeSerializer::Serialize(Isolate* isolate, void CodeSerializer::SerializeObject(Object* o, HowToCode how_to_code, WhereToPoint where_to_point, int skip) { - CHECK(o->IsHeapObject()); HeapObject* heap_object = HeapObject::cast(o); - // The code-caches link to context-specific code objects, which - // the startup and context serializes cannot currently handle. - DCHECK(!heap_object->IsMap() || - Map::cast(heap_object)->code_cache() == - heap_object->GetHeap()->empty_fixed_array()); - int root_index; if ((root_index = RootIndex(heap_object, how_to_code)) != kInvalidRootIndex) { PutRoot(root_index, heap_object, how_to_code, where_to_point, skip); return; } - // TODO(yangguo) wire up global object. - // TODO(yangguo) We cannot deal with different hash seeds yet. - DCHECK(!heap_object->IsHashTable()); - if (address_mapper_.IsMapped(heap_object)) { SerializeReferenceToPreviousObject(heap_object, how_to_code, where_to_point, skip); return; } + if (skip != 0) { + sink_->Put(kSkip, "SkipFromSerializeObject"); + sink_->PutInt(skip, "SkipDistanceFromSerializeObject"); + } + if (heap_object->IsCode()) { Code* code_object = Code::cast(heap_object); switch (code_object->kind()) { @@ -1901,34 +1895,42 @@ void CodeSerializer::SerializeObject(Object* o, HowToCode how_to_code, case Code::NUMBER_OF_KINDS: // Pseudo enum value. CHECK(false); case Code::BUILTIN: - SerializeBuiltin(code_object, how_to_code, where_to_point, skip); + SerializeBuiltin(code_object, how_to_code, where_to_point); return; case Code::STUB: - SerializeCodeStub(code_object, how_to_code, where_to_point, skip); + SerializeCodeStub(code_object, how_to_code, where_to_point); return; #define IC_KIND_CASE(KIND) case Code::KIND: IC_KIND_LIST(IC_KIND_CASE) #undef IC_KIND_CASE + SerializeHeapObject(code_object, how_to_code, where_to_point); + return; // TODO(yangguo): add special handling to canonicalize ICs. case Code::FUNCTION: - SerializeHeapObject(code_object, how_to_code, where_to_point, skip); + SerializeHeapObject(code_object, how_to_code, where_to_point); return; } } if (heap_object == source_) { - SerializeSourceObject(how_to_code, where_to_point, skip); + SerializeSourceObject(how_to_code, where_to_point); return; } - SerializeHeapObject(heap_object, how_to_code, where_to_point, skip); + // Past this point we should not see any (context-specific) maps anymore. + CHECK(!heap_object->IsMap()); + // There should be no references to the global object embedded. + CHECK(!heap_object->IsJSGlobalProxy() && !heap_object->IsGlobalObject()); + // There should be no hash table embedded. They would require rehashing. + CHECK(!heap_object->IsHashTable()); + + SerializeHeapObject(heap_object, how_to_code, where_to_point); } void CodeSerializer::SerializeHeapObject(HeapObject* heap_object, HowToCode how_to_code, - WhereToPoint where_to_point, - int skip) { + WhereToPoint where_to_point) { if (heap_object->IsScript()) { // The wrapper cache uses a Foreign object to point to a global handle. // However, the object visitor expects foreign objects to point to external @@ -1936,11 +1946,6 @@ void CodeSerializer::SerializeHeapObject(HeapObject* heap_object, Script::cast(heap_object)->ClearWrapperCache(); } - if (skip != 0) { - sink_->Put(kSkip, "SkipFromSerializeObject"); - sink_->PutInt(skip, "SkipDistanceFromSerializeObject"); - } - if (FLAG_trace_code_serializer) { PrintF("Encoding heap object: "); heap_object->ShortPrint(); @@ -1955,12 +1960,7 @@ void CodeSerializer::SerializeHeapObject(HeapObject* heap_object, void CodeSerializer::SerializeBuiltin(Code* builtin, HowToCode how_to_code, - WhereToPoint where_to_point, int skip) { - if (skip != 0) { - sink_->Put(kSkip, "SkipFromSerializeBuiltin"); - sink_->PutInt(skip, "SkipDistanceFromSerializeBuiltin"); - } - + WhereToPoint where_to_point) { DCHECK((how_to_code == kPlain && where_to_point == kStartOfObject) || (how_to_code == kPlain && where_to_point == kInnerPointer) || (how_to_code == kFromCode && where_to_point == kInnerPointer)); @@ -1979,18 +1979,13 @@ void CodeSerializer::SerializeBuiltin(Code* builtin, HowToCode how_to_code, void CodeSerializer::SerializeCodeStub(Code* stub, HowToCode how_to_code, - WhereToPoint where_to_point, int skip) { + WhereToPoint where_to_point) { DCHECK((how_to_code == kPlain && where_to_point == kStartOfObject) || (how_to_code == kPlain && where_to_point == kInnerPointer) || (how_to_code == kFromCode && where_to_point == kInnerPointer)); uint32_t stub_key = stub->stub_key(); DCHECK(CodeStub::MajorKeyFromKey(stub_key) != CodeStub::NoCache); - if (skip != 0) { - sink_->Put(kSkip, "SkipFromSerializeCodeStub"); - sink_->PutInt(skip, "SkipDistanceFromSerializeCodeStub"); - } - int index = AddCodeStubKey(stub_key) + kCodeStubsBaseIndex; if (FLAG_trace_code_serializer) { @@ -2017,16 +2012,8 @@ int CodeSerializer::AddCodeStubKey(uint32_t stub_key) { void CodeSerializer::SerializeSourceObject(HowToCode how_to_code, - WhereToPoint where_to_point, - int skip) { - if (skip != 0) { - sink_->Put(kSkip, "SkipFromSerializeSourceObject"); - sink_->PutInt(skip, "SkipDistanceFromSerializeSourceObject"); - } - - if (FLAG_trace_code_serializer) { - PrintF("Encoding source object\n"); - } + WhereToPoint where_to_point) { + if (FLAG_trace_code_serializer) PrintF("Encoding source object\n"); DCHECK(how_to_code == kPlain && where_to_point == kStartOfObject); sink_->Put(kAttachedReference + how_to_code + where_to_point, "Source"); diff --git a/src/serialize.h b/src/serialize.h index b6ad82c..616f8f1 100644 --- node/deps/v8/src/serialize.h +++ node/deps/v8/src/serialize.h @@ -577,19 +577,10 @@ class StartupSerializer : public Serializer { class CodeSerializer : public Serializer { public: - CodeSerializer(Isolate* isolate, SnapshotByteSink* sink, String* source) - : Serializer(isolate, sink), source_(source) { - set_root_index_wave_front(Heap::kStrongRootListLength); - InitializeCodeAddressMap(); - } - static ScriptData* Serialize(Isolate* isolate, Handle info, Handle source); - virtual void SerializeObject(Object* o, HowToCode how_to_code, - WhereToPoint where_to_point, int skip); - static Handle Deserialize(Isolate* isolate, ScriptData* data, Handle source); @@ -605,18 +596,29 @@ class CodeSerializer : public Serializer { List* stub_keys() { return &stub_keys_; } private: + CodeSerializer(Isolate* isolate, SnapshotByteSink* sink, String* source, + Code* main_code) + : Serializer(isolate, sink), source_(source), main_code_(main_code) { + set_root_index_wave_front(Heap::kStrongRootListLength); + InitializeCodeAddressMap(); + } + + virtual void SerializeObject(Object* o, HowToCode how_to_code, + WhereToPoint where_to_point, int skip); + void SerializeBuiltin(Code* builtin, HowToCode how_to_code, - WhereToPoint where_to_point, int skip); + WhereToPoint where_to_point); void SerializeCodeStub(Code* stub, HowToCode how_to_code, - WhereToPoint where_to_point, int skip); - void SerializeSourceObject(HowToCode how_to_code, WhereToPoint where_to_point, - int skip); + WhereToPoint where_to_point); + void SerializeSourceObject(HowToCode how_to_code, + WhereToPoint where_to_point); void SerializeHeapObject(HeapObject* heap_object, HowToCode how_to_code, - WhereToPoint where_to_point, int skip); + WhereToPoint where_to_point); int AddCodeStubKey(uint32_t stub_key); DisallowHeapAllocation no_gc_; String* source_; + Code* main_code_; List stub_keys_; DISALLOW_COPY_AND_ASSIGN(CodeSerializer); };