blob: 8bc14ebfc22c62895744cae65ebbca2e1f2532cc [file] [log] [blame]
// Copyright 2021 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "src/snapshot/shared-heap-deserializer.h"
#include "src/heap/heap-inl.h"
#include "src/snapshot/shared-heap-serializer.h"
namespace v8 {
namespace internal {
void SharedHeapDeserializer::DeserializeIntoIsolate() {
// Don't deserialize into client Isolates. If there are client Isolates, the
// shared heap object cache should already be populated.
DCHECK_IMPLIES(isolate()->shared_isolate() != nullptr,
!isolate()->shared_heap_object_cache()->empty());
if (isolate()->shared_isolate() != nullptr) return;
DCHECK(isolate()->shared_heap_object_cache()->empty());
HandleScope scope(isolate());
IterateSharedHeapObjectCache(isolate(), this);
DeserializeStringTable();
DeserializeDeferredObjects();
if (should_rehash()) {
// Hash seed was initialized in ReadOnlyDeserializer.
Rehash();
}
}
void SharedHeapDeserializer::DeserializeStringTable() {
// See SharedHeapSerializer::SerializeStringTable.
DCHECK(isolate()->OwnsStringTables());
// Get the string table size.
int string_table_size = source()->GetInt();
// Add each string to the Isolate's string table.
// TODO(leszeks): Consider pre-sizing the string table.
for (int i = 0; i < string_table_size; ++i) {
Handle<String> string = Handle<String>::cast(ReadObject());
StringTableInsertionKey key(
isolate(), string,
DeserializingUserCodeOption::kNotDeserializingUserCode);
Handle<String> result =
isolate()->string_table()->LookupKey(isolate(), &key);
// Since this is startup, there should be no duplicate entries in the
// string table, and the lookup should unconditionally add the given
// string.
DCHECK_EQ(*result, *string);
USE(result);
}
DCHECK_EQ(string_table_size, isolate()->string_table()->NumberOfElements());
}
} // namespace internal
} // namespace v8