// Copyright 2017 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_OBJECT_DESERIALIZER_H_
#define V8_SNAPSHOT_OBJECT_DESERIALIZER_H_

#include "src/snapshot/deserializer.h"

namespace v8 {
namespace internal {

class SerializedCodeData;
class SharedFunctionInfo;
class WasmCompiledModule;

// Deserializes the object graph rooted at a given object.
class ObjectDeserializer final : public Deserializer {
 public:
  static MaybeHandle<SharedFunctionInfo> DeserializeSharedFunctionInfo(
      Isolate* isolate, const SerializedCodeData* data, Handle<String> source);

  static MaybeHandle<WasmCompiledModule> DeserializeWasmCompiledModule(
      Isolate* isolate, const SerializedCodeData* data,
      Vector<const byte> wire_bytes);

 private:
  explicit ObjectDeserializer(const SerializedCodeData* data)
      : Deserializer(data, true) {}

  // Deserialize an object graph. Fail gracefully.
  MaybeHandle<HeapObject> Deserialize(Isolate* isolate);

  void FlushICacheForNewCodeObjectsAndRecordEmbeddedObjects();
  void CommitPostProcessedObjects();
};

}  // namespace internal
}  // namespace v8

#endif  // V8_SNAPSHOT_OBJECT_DESERIALIZER_H_
