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

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

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;
}

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.
  @cppAcquireLoad
  @cppReleaseStore
  original_bytecode_array: Undefined|BytecodeArray;
  // The debug instrumented bytecode array for functions with break points
  // - also pointed to by the shared function info.
  @cppAcquireLoad
  @cppReleaseStore
  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.
  @cppRelaxedLoad @cppRelaxedStore 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.
extern class CoverageInfo extends HeapObject {
  const slot_count: int32;
  slots[slot_count]: CoverageInfoSlot;
}
