Index: src/snapshot/serialize.cc |
diff --git a/src/snapshot/serialize.cc b/src/snapshot/serialize.cc |
index 7f123a3fbed622040a5d7cc5fab7bd85a1560faa..b31c046e2fe10fe8478b00bcbd6f7c9b8c623043 100644 |
--- a/src/snapshot/serialize.cc |
+++ b/src/snapshot/serialize.cc |
@@ -1854,7 +1854,23 @@ void Serializer::ObjectSerializer::Serialize() { |
if (object_->IsPrototypeInfo()) { |
Object* prototype_users = PrototypeInfo::cast(object_)->prototype_users(); |
if (prototype_users->IsWeakFixedArray()) { |
- WeakFixedArray::cast(prototype_users)->Compact(); |
+ WeakFixedArray* array = WeakFixedArray::cast(prototype_users); |
+ array->Compact<JSObject::PrototypeRegistryCompactionCallback>(); |
+ } |
+ } |
+ // Compaction of a prototype users list can require the registered users |
+ // to update their remembered slots. That doesn't work if those users |
+ // have already been serialized themselves. So if this object is a |
+ // registered user, compact its prototype's user list now. |
+ if (object_->IsMap()) { |
+ Map* map = Map::cast(object_); |
+ if (map->is_prototype_map() && map->prototype_info()->IsPrototypeInfo() && |
+ PrototypeInfo::cast(map->prototype_info())->registry_slot() != |
+ PrototypeInfo::UNREGISTERED) { |
+ JSObject* proto = JSObject::cast(map->prototype()); |
+ PrototypeInfo* info = PrototypeInfo::cast(proto->map()->prototype_info()); |
+ WeakFixedArray* array = WeakFixedArray::cast(info->prototype_users()); |
+ array->Compact<JSObject::PrototypeRegistryCompactionCallback>(); |
} |
} |