// Copyright 2016 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_WASM_DEBUG_H_
#define V8_WASM_DEBUG_H_

#include "src/handles.h"
#include "src/objects.h"

namespace v8 {
namespace internal {
namespace wasm {

class WasmDebugInfo : public FixedArray {
 public:
  static Handle<WasmDebugInfo> New(Handle<JSObject> wasm);

  static bool IsDebugInfo(Object* object);
  static WasmDebugInfo* cast(Object* object);

  JSObject* wasm_object();

  bool SetBreakPoint(int byte_offset);

  // Disassemble the specified function from this module.
  static Handle<String> DisassembleFunction(Handle<WasmDebugInfo> debug_info,
                                            int func_index);

  // Get the offset table for the specified function.
  // Returns an array with three entries per instruction: byte offset, line and
  // column.
  static Handle<FixedArray> GetFunctionOffsetTable(
      Handle<WasmDebugInfo> debug_info, int func_index);
};

}  // namespace wasm
}  // namespace internal
}  // namespace v8

#endif  // V8_WASM_DEBUG_H_
