// 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_BUILTIN_SERIALIZER_H_
#define V8_SNAPSHOT_BUILTIN_SERIALIZER_H_

#include "src/interpreter/interpreter.h"
#include "src/snapshot/builtin-serializer-allocator.h"
#include "src/snapshot/builtin-snapshot-utils.h"
#include "src/snapshot/serializer.h"

namespace v8 {
namespace internal {

class StartupSerializer;

// Responsible for serializing builtin and bytecode handler objects during
// startup snapshot creation into a dedicated area of the snapshot.
// See snapshot.h for documentation of the snapshot layout.
class BuiltinSerializer : public Serializer<BuiltinSerializerAllocator> {
  using BSU = BuiltinSnapshotUtils;

 public:
  BuiltinSerializer(Isolate* isolate, StartupSerializer* startup_serializer);
  ~BuiltinSerializer() override;

  void SerializeBuiltinsAndHandlers();

 private:
  void VisitRootPointers(Root root, Object** start, Object** end) override;

  void SerializeBuiltin(Code* code);
  void SerializeHandler(Code* code);
  void SerializeObject(HeapObject* o, HowToCode how_to_code,
                       WhereToPoint where_to_point, int skip) override;

  void SetBuiltinOffset(int builtin_id, uint32_t offset);
  void SetHandlerOffset(interpreter::Bytecode bytecode,
                        interpreter::OperandScale operand_scale,
                        uint32_t offset);

  // The startup serializer is needed for access to the partial snapshot cache,
  // which is used to serialize things like embedded constants.
  StartupSerializer* startup_serializer_;

  // Stores the starting offset, within the serialized data, of each code
  // object. This is later packed into the builtin snapshot, and used by the
  // builtin deserializer to deserialize individual builtins and bytecode
  // handlers.
  //
  // Indices [kFirstBuiltinIndex, kFirstBuiltinIndex + kNumberOfBuiltins[:
  //     Builtin offsets.
  // Indices [kFirstHandlerIndex, kFirstHandlerIndex + kNumberOfHandlers[:
  //     Bytecode handler offsets.
  uint32_t code_offsets_[BuiltinSnapshotUtils::kNumberOfCodeObjects];

  DISALLOW_COPY_AND_ASSIGN(BuiltinSerializer);
};

}  // namespace internal
}  // namespace v8

#endif  // V8_SNAPSHOT_BUILTIN_SERIALIZER_H_
