Index: src/snapshot/serialize.cc |
diff --git a/src/snapshot/serialize.cc b/src/snapshot/serialize.cc |
index fe9765064c8284404d0f948e09de6253e227ab7b..81e071c0fb05809d6b905fe8c5373bbb8e6bc5e6 100644 |
--- a/src/snapshot/serialize.cc |
+++ b/src/snapshot/serialize.cc |
@@ -1926,7 +1926,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>(); |
} |
} |
@@ -1936,7 +1952,8 @@ void Serializer::ObjectSerializer::Serialize() { |
Script::cast(object_)->set_line_ends(undefined); |
Object* shared_list = Script::cast(object_)->shared_function_infos(); |
if (shared_list->IsWeakFixedArray()) { |
- WeakFixedArray::cast(shared_list)->Compact(); |
+ WeakFixedArray::cast(shared_list) |
+ ->Compact<WeakFixedArray::NullCallback>(); |
} |
} |