// Copyright 2018 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. #ifndef V8_SNAPSHOT_ROOTS_SERIALIZER_H_ #define V8_SNAPSHOT_ROOTS_SERIALIZER_H_ #include <bitset> #include "src/objects/visitors.h" #include "src/snapshot/serializer.h" namespace v8 { namespace internal { class HeapObject; class Object; class Isolate; enum class RootIndex : uint16_t; // Base class for serializer that iterate over roots. Also maintains a cache // that can be used to share non-root objects with other serializers. class RootsSerializer : public Serializer { public: // The serializer expects that all roots before |first_root_to_be_serialized| // are already serialized. RootsSerializer(Isolate* isolate, Snapshot::SerializerFlags flags, RootIndex first_root_to_be_serialized); RootsSerializer(const RootsSerializer&) = delete; RootsSerializer& operator=(const RootsSerializer&) = delete; bool can_be_rehashed() const { return can_be_rehashed_; } bool root_has_been_serialized(RootIndex root_index) const { return root_has_been_serialized_.test(static_cast<size_t>(root_index)); } bool IsRootAndHasBeenSerialized(HeapObject obj) const { RootIndex root_index; return root_index_map()->Lookup(obj, &root_index) && root_has_been_serialized(root_index); } protected: void CheckRehashability(HeapObject obj); // Serializes |object| if not previously seen and returns its cache index. int SerializeInObjectCache(Handle<HeapObject> object); private: void VisitRootPointers(Root root, const char* description, FullObjectSlot start, FullObjectSlot end) override; void Synchronize(VisitorSynchronization::SyncTag tag) override; const RootIndex first_root_to_be_serialized_; std::bitset<RootsTable::kEntriesCount> root_has_been_serialized_; ObjectCacheIndexMap object_cache_index_map_; // Indicates whether we only serialized hash tables that we can rehash. // TODO(yangguo): generalize rehashing, and remove this flag. bool can_be_rehashed_; }; } // namespace internal } // namespace v8 #endif // V8_SNAPSHOT_ROOTS_SERIALIZER_H_