Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(986)

Unified Diff: src/snapshot/deserializer.cc

Issue 2790573002: Encode any deoptimizer entry in serialized data. (Closed)
Patch Set: Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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(); \

Powered by Google App Engine
This is Rietveld 408576698