// 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_CODEGEN_CODE_COMMENTS_H_
#define V8_CODEGEN_CODE_COMMENTS_H_

#include <ostream>
#include <string>
#include <vector>

#include "include/v8-internal.h"
#include "src/base/macros.h"

namespace v8 {
namespace internal {

class Assembler;

// InstructionStream comments section layout:
// byte count              content
// ------------------------------------------------------------------------
// 4                       size as uint32_t (only for a check)
// [Inline array of CodeCommentEntry in increasing pc_offset order]
// ┌ 4                     pc_offset of entry as uint32_t
// ├ 4                     length of the comment including terminating '\0'
// └ <variable length>     characters of the comment including terminating '\0'

struct CodeCommentEntry {
  uint32_t pc_offset;
  std::string comment;
  uint32_t comment_length() const;
  uint32_t size() const;
};

class CodeCommentsWriter {
 public:
  V8_EXPORT_PRIVATE void Add(uint32_t pc_offset, std::string comment);
  void Emit(Assembler* assm);
  size_t entry_count() const;
  uint32_t section_size() const;

 private:
  uint32_t byte_count_ = 0;
  std::vector<CodeCommentEntry> comments_;
};

class V8_EXPORT_PRIVATE CodeCommentsIterator {
 public:
  CodeCommentsIterator(Address code_comments_start,
                       uint32_t code_comments_size);
  uint32_t size() const;
  const char* GetComment() const;
  uint32_t GetCommentSize() const;
  uint32_t GetPCOffset() const;
  void Next();
  bool HasCurrent() const;

 private:
  Address code_comments_start_;
  uint32_t code_comments_size_;
  Address current_entry_;
};

}  // namespace internal
}  // namespace v8

#endif  // V8_CODEGEN_CODE_COMMENTS_H_
