mirror of
https://github.com/tiennm99/FBcount.git
synced 2026-05-18 21:25:23 +00:00
239 lines
9.9 KiB
Diff
239 lines
9.9 KiB
Diff
commit ad24cdae728fc34b23e74a22543702de3ae477d1
|
|
Author: yangguo@chromium.org <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<SnapshotByteSink*>(&debug_sink)
|
|
: static_cast<SnapshotByteSink*>(&list_sink);
|
|
- CodeSerializer cs(isolate, sink, *source);
|
|
+ CodeSerializer cs(isolate, sink, *source, info->code());
|
|
DisallowHeapAllocation no_gc;
|
|
Object** location = Handle<Object>::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<SharedFunctionInfo> info,
|
|
Handle<String> source);
|
|
|
|
- virtual void SerializeObject(Object* o, HowToCode how_to_code,
|
|
- WhereToPoint where_to_point, int skip);
|
|
-
|
|
static Handle<SharedFunctionInfo> Deserialize(Isolate* isolate,
|
|
ScriptData* data,
|
|
Handle<String> source);
|
|
@@ -605,18 +596,29 @@ class CodeSerializer : public Serializer {
|
|
List<uint32_t>* 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<uint32_t> stub_keys_;
|
|
DISALLOW_COPY_AND_ASSIGN(CodeSerializer);
|
|
};
|