Index: src/snapshot/deserializer.cc |
diff --git a/src/snapshot/deserializer.cc b/src/snapshot/deserializer.cc |
index b74b10b7eff9108d8c2c05cebd1b746f1b6caaf7..8d6ba3c69089ddfc3b3670a8a2a4dde20abbec99 100644 |
--- a/src/snapshot/deserializer.cc |
+++ b/src/snapshot/deserializer.cc |
@@ -462,6 +462,32 @@ void Deserializer::ReadObject(int space_number, Object** write_back) { |
#endif // DEBUG |
} |
+Address Deserializer::DecodeExternalReference(uint32_t reference_id) { |
+ if (!(reference_id & ExternalReferenceTable::kSpecialIdMask)) |
+ return external_reference_table_->address(reference_id); |
+ const uint32_t special_flags = |
+ reference_id & ExternalReferenceTable::kSpecialIdMask; |
+ Deoptimizer::BailoutType deopt_type; |
+ switch (special_flags) { |
+ case ExternalReferenceTable::kEagerDeoptFlag: |
+ deopt_type = Deoptimizer::EAGER; |
+ break; |
+ case ExternalReferenceTable::kLazyDeoptFlag: |
+ deopt_type = Deoptimizer::LAZY; |
+ break; |
+ case ExternalReferenceTable::kSoftDeoptFlag: |
+ deopt_type = Deoptimizer::SOFT; |
+ break; |
+ default: |
+ CHECK(false); |
+ return nullptr; |
+ } |
+ int entry_id = reference_id & ~ExternalReferenceTable::kSpecialIdMask; |
+ max_deopt_entry_ids_[deopt_type] = |
+ std::max(max_deopt_entry_ids_[deopt_type], entry_id); |
+ return Deoptimizer::GetDeoptimizationEntry( |
+ isolate_, entry_id, deopt_type, Deoptimizer::CALCULATE_ENTRY_ADDRESS); |
+} |
// We know the space requirements before deserialization and can |
// pre-allocate that reserved space. During deserialization, all we need |
// to do is to bump up the pointer for each space in the reserved |
@@ -568,7 +594,7 @@ bool Deserializer::ReadData(Object** current, Object** limit, int source_space, |
current = reinterpret_cast<Object**>( \ |
reinterpret_cast<Address>(current) + skip); \ |
uint32_t reference_id = static_cast<uint32_t>(source_.GetInt()); \ |
- Address address = external_reference_table_->address(reference_id); \ |
+ Address address = DecodeExternalReference(reference_id); \ |
new_object = reinterpret_cast<Object*>(address); \ |
} else if (where == kAttachedReference) { \ |
int index = source_.GetInt(); \ |