11#ifndef ARK_VM_DEBUGGER_HPP
12#define ARK_VM_DEBUGGER_HPP
71 Debugger(
const ExecutionContext& context,
const std::vector<std::filesystem::path>& libenv,
const std::vector<std::string>& symbols,
const std::vector<Value>& constants);
82 Debugger(
const std::vector<std::filesystem::path>& libenv,
const std::string& path_to_prompt_file, std::ostream& os,
const std::vector<std::string>& symbols,
const std::vector<Value>& constants);
107 void registerInstruction(uint8_t inst, uint8_t padding, uint16_t arg, std::size_t ip, std::size_t pp)
noexcept;
109 [[nodiscard]] ARK_ALWAYS_INLINE
bool isRunning() const noexcept
137 using Args_t = std::vector<std::pair<std::string, std::string>>;
149 Command(
const std::initializer_list<std::string> list_of_names, std::string desc,
Action_t&& do_this) :
157 [[nodiscard]] std::optional<Args_t>
getArgs(
const std::string& line, std::ostream& os)
const;
159 [[nodiscard]] std::optional<std::size_t>
argAsCount(
const std::string& line, std::size_t idx, std::ostream& os)
const;
180 [[nodiscard]] std::optional<Command>
matchCommand(
const std::string& line)
const;
188 void showLocals(
const ScopeView& scope,
VM& vm, std::optional<std::size_t> limit = std::nullopt)
const;
199 [[nodiscard]] std::optional<CompiledPrompt>
compile(
const std::string& code, std::size_t start_page_at_offset)
const;
Common code for the compiler.
Keeping track of the internal data needed by the VM.
Default value type handled by the virtual machine.
The ArkScript virtual machine, executing ArkScript bytecode.
void run(VM &vm, ExecutionContext &context, bool from_breakpoint)
Start the debugger shell.
std::string m_code
Code added while inside the debugger.
std::vector< std::unique_ptr< SavedState > > m_states
void showStack(VM &vm, const ExecutionContext &context, std::size_t count) const
std::optional< Command > matchCommand(const std::string &line) const
void showLocals(VM &vm, ExecutionContext &context, std::size_t count) const
std::deque< TracedInstruction > m_previous_insts
std::optional< std::string > prompt(std::size_t ip, std::size_t pp, VM &vm, ExecutionContext &context)
void resetContextToSavedState(ExecutionContext &context)
Reset a VM context to the last state saved by the debugger.
Debugger(const ExecutionContext &context, const std::vector< std::filesystem::path > &libenv, const std::vector< std::string > &symbols, const std::vector< Value > &constants)
Create a new Debugger object.
void registerInstruction(uint8_t inst, uint8_t padding, uint16_t arg, std::size_t ip, std::size_t pp) noexcept
std::unique_ptr< std::istream > m_prompt_stream
std::vector< std::string > m_symbols
void showScopes(VM &vm, ExecutionContext &context, std::size_t count) const
ARK_ALWAYS_INLINE bool shouldQuitVM() const noexcept
std::vector< Command > m_commands
void showContext(const VM &vm, const ExecutionContext &context) const
void saveState(const ExecutionContext &context)
Save the current VM state, to get back to it once the debugger is done running.
std::vector< std::filesystem::path > m_libenv
std::vector< Value > m_constants
void showPreviousInstructions(const VM &vm, std::size_t count) const
std::optional< CompiledPrompt > compile(const std::string &code, std::size_t start_page_at_offset) const
Take care of compiling new code using the existing data tables.
ARK_ALWAYS_INLINE bool isRunning() const noexcept
A class to handle the VM scope more efficiently.
std::vector< Value > constants
std::vector< std::string > symbols
std::vector< bytecode_t > pages
ExecutionContext * ctx_ptr
std::vector< std::pair< std::string, std::string > > Args_t
std::optional< std::size_t > argAsCount(const std::string &line, std::size_t idx, std::ostream &os) const
Command(const std::initializer_list< std::string > list_of_names, std::string desc, Action_t &&do_this)
std::vector< std::string > names
std::function< bool(const std::string &, const CommandArgs &)> Action_t
Command(StartsWith start, std::vector< std::pair< std::string, std::string > > arguments, std::string desc, Action_t &&do_this)
Command(std::string name, std::string desc, Action_t &&do_this)
std::optional< Args_t > getArgs(const std::string &line, std::ostream &os) const
std::vector< ScopeView > locals
std::vector< std::shared_ptr< ClosureScope > > closure_scopes