// Copyright 2019 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.

@generateCppClass
@generatePrint
extern class BreakPoint extends Struct {
  id: Smi;
  condition: String;
}

@generateCppClass
@generatePrint
extern class BreakPointInfo extends Struct {
  // The position in the source for the break position.
  source_position: Smi;
  // List of related JavaScript break points.
  break_points: FixedArray|BreakPoint|Undefined;
}

bitfield struct DebugInfoFlags extends uint31 {
  has_break_info: bool: 1 bit;
  prepared_for_debug_execution: bool: 1 bit;
  has_coverage_info: bool: 1 bit;
  break_at_entry: bool: 1 bit;
  can_break_at_entry: bool: 1 bit;
  debug_execution_mode: bool: 1 bit;
}

bitfield struct DebuggerHints extends uint31 {
  side_effect_state: int32: 2 bit;
  debug_is_blackboxed: bool: 1 bit;
  computed_debug_is_blackboxed: bool: 1 bit;
  debugging_id: int32: 20 bit;
}

@generateCppClass
@generatePrint
extern class DebugInfo extends Struct {
  shared: SharedFunctionInfo;
  // Bit field containing various information collected for debugging.
  debugger_hints: SmiTagged<DebuggerHints>;
  // Script field from shared function info.
  script: Undefined|Script;
  // The original uninstrumented bytecode array for functions with break
  // points - the instrumented bytecode is held in the shared function info.
  original_bytecode_array: Undefined|BytecodeArray;
  // The debug instrumented bytecode array for functions with break points
  // - also pointed to by the shared function info.
  debug_bytecode_array: Undefined|BytecodeArray;
  // Fixed array holding status information for each active break point.
  break_points: FixedArray;
  // A bitfield that lists uses of the current instance.
  flags: SmiTagged<DebugInfoFlags>;
  coverage_info: CoverageInfo|Undefined;
}

@export
struct CoverageInfoSlot {
  start_source_position: int32;
  end_source_position: int32;
  block_count: int32;
  padding: int32;  // Padding to make the index count 4.
}

// CoverageInfo's visitor is included in DATA_ONLY_VISITOR_ID_LIST, so it must
// not contain any HeapObject fields.
@generateCppClass
extern class CoverageInfo extends HeapObject {
  const slot_count: int32;
  slots[slot_count]: CoverageInfoSlot;
}

@generateCppClass
@generatePrint
extern class WasmValue extends Struct {
  // TODO(7748): Name and comment are outdated.
  // The type, should map to ValueType::Kind values in value-type.h.
  value_type: SmiTagged<WasmValueType>;
  // Holds the actual value. For example, if this holds a Wasm i32, this will
  // be of length 4, for s128, it will have length 16. These values are
  // represented by the respective C++ types, and memcpy-ed in.
  // When value_type is a externref, it holds the object that externref points
  // to.
  bytes_or_ref: Object|ByteArray;
}
