| 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(); \
|
|
|