Index: src/serialize.cc |
diff --git a/src/serialize.cc b/src/serialize.cc |
index 848055e76a962d23575e8e995eb0e7c7e45bdbfe..b5b5f54d65fb5e591a6be778779f7b9e3cd2785b 100644 |
--- a/src/serialize.cc |
+++ b/src/serialize.cc |
@@ -338,23 +338,26 @@ ExternalReferenceTable::ExternalReferenceTable(Isolate* isolate) { |
} |
-ExternalReferenceEncoder::ExternalReferenceEncoder(Isolate* isolate) |
- : map_(HashMap::PointersMatch) { |
+ExternalReferenceEncoder::ExternalReferenceEncoder(Isolate* isolate) { |
+ map_ = isolate->external_reference_map(); |
+ if (map_ != NULL) return; |
+ map_ = new HashMap(HashMap::PointersMatch); |
ExternalReferenceTable* table = ExternalReferenceTable::instance(isolate); |
for (int i = 0; i < table->size(); ++i) { |
Address addr = table->address(i); |
if (addr == ExternalReferenceTable::NotAvailable()) continue; |
// We expect no duplicate external references entries in the table. |
- DCHECK_NULL(map_.Lookup(addr, Hash(addr), false)); |
- map_.Lookup(addr, Hash(addr), true)->value = reinterpret_cast<void*>(i); |
+ DCHECK_NULL(map_->Lookup(addr, Hash(addr), false)); |
+ map_->Lookup(addr, Hash(addr), true)->value = reinterpret_cast<void*>(i); |
} |
+ isolate->set_external_reference_map(map_); |
} |
uint32_t ExternalReferenceEncoder::Encode(Address address) const { |
DCHECK_NOT_NULL(address); |
HashMap::Entry* entry = |
- const_cast<HashMap&>(map_).Lookup(address, Hash(address), false); |
+ const_cast<HashMap*>(map_)->Lookup(address, Hash(address), false); |
DCHECK_NOT_NULL(entry); |
return static_cast<uint32_t>(reinterpret_cast<intptr_t>(entry->value)); |
} |
@@ -363,14 +366,17 @@ uint32_t ExternalReferenceEncoder::Encode(Address address) const { |
const char* ExternalReferenceEncoder::NameOfAddress(Isolate* isolate, |
Address address) const { |
HashMap::Entry* entry = |
- const_cast<HashMap&>(map_).Lookup(address, Hash(address), false); |
+ const_cast<HashMap*>(map_)->Lookup(address, Hash(address), false); |
if (entry == NULL) return "<unknown>"; |
uint32_t i = static_cast<uint32_t>(reinterpret_cast<intptr_t>(entry->value)); |
return ExternalReferenceTable::instance(isolate)->name(i); |
} |
-RootIndexMap::RootIndexMap(Isolate* isolate) : map_(HashMap::PointersMatch) { |
+RootIndexMap::RootIndexMap(Isolate* isolate) { |
+ map_ = isolate->root_index_map(); |
+ if (map_ != NULL) return; |
+ map_ = new HashMap(HashMap::PointersMatch); |
Object** root_array = isolate->heap()->roots_array_start(); |
for (uint32_t i = 0; i < Heap::kStrongRootListLength; i++) { |
Heap::RootListIndex root_index = static_cast<Heap::RootListIndex>(i); |
@@ -380,15 +386,16 @@ RootIndexMap::RootIndexMap(Isolate* isolate) : map_(HashMap::PointersMatch) { |
if (root->IsHeapObject() && |
isolate->heap()->RootCanBeTreatedAsConstant(root_index)) { |
HeapObject* heap_object = HeapObject::cast(root); |
- HashMap::Entry* entry = LookupEntry(&map_, heap_object, false); |
+ HashMap::Entry* entry = LookupEntry(map_, heap_object, false); |
if (entry != NULL) { |
// Some are initialized to a previous value in the root list. |
DCHECK_LT(GetValue(entry), i); |
} else { |
- SetValue(LookupEntry(&map_, heap_object, true), i); |
+ SetValue(LookupEntry(map_, heap_object, true), i); |
} |
} |
} |
+ isolate->set_root_index_map(map_); |
} |
@@ -1202,7 +1209,7 @@ void Deserializer::ReadData(Object** current, Object** limit, int source_space, |
Serializer::Serializer(Isolate* isolate, SnapshotByteSink* sink) |
: isolate_(isolate), |
sink_(sink), |
- external_reference_encoder_(new ExternalReferenceEncoder(isolate)), |
+ external_reference_encoder_(isolate), |
root_index_map_(isolate), |
code_address_map_(NULL), |
large_objects_total_size_(0), |
@@ -1218,7 +1225,6 @@ Serializer::Serializer(Isolate* isolate, SnapshotByteSink* sink) |
Serializer::~Serializer() { |
- delete external_reference_encoder_; |
if (code_address_map_ != NULL) delete code_address_map_; |
} |