1133a0ef4SChris Fallin //! Host implementation for the debugger world.
2133a0ef4SChris Fallin
3133a0ef4SChris Fallin use wasmtime::{
4133a0ef4SChris Fallin Result,
5133a0ef4SChris Fallin component::{Resource, ResourceTable},
6133a0ef4SChris Fallin };
7133a0ef4SChris Fallin
8133a0ef4SChris Fallin mod api;
9133a0ef4SChris Fallin mod bindings;
10133a0ef4SChris Fallin mod opaque;
11133a0ef4SChris Fallin
12133a0ef4SChris Fallin pub use api::Debuggee;
13133a0ef4SChris Fallin pub use bindings::DebugMain as DebuggerComponent;
14133a0ef4SChris Fallin pub use bindings::bytecodealliance::wasmtime::debuggee as wit;
15133a0ef4SChris Fallin use opaque::OpaqueDebugger;
16133a0ef4SChris Fallin
17133a0ef4SChris Fallin /// Register a debuggee in a resource table.
add_debuggee<T: Send + 'static>( table: &mut ResourceTable, debuggee: crate::Debuggee<T>, ) -> Result<Resource<Debuggee>>18133a0ef4SChris Fallin pub fn add_debuggee<T: Send + 'static>(
19133a0ef4SChris Fallin table: &mut ResourceTable,
20133a0ef4SChris Fallin debuggee: crate::Debuggee<T>,
21133a0ef4SChris Fallin ) -> Result<Resource<Debuggee>> {
22133a0ef4SChris Fallin let engine = debuggee.engine().clone();
23133a0ef4SChris Fallin let interrupt_pending = debuggee.interrupt_pending().clone();
24133a0ef4SChris Fallin let inner: Option<Box<dyn OpaqueDebugger + Send + 'static>> = Some(Box::new(debuggee));
25133a0ef4SChris Fallin Ok(table.push(Debuggee {
26133a0ef4SChris Fallin inner,
27133a0ef4SChris Fallin engine,
28133a0ef4SChris Fallin interrupt_pending,
29133a0ef4SChris Fallin })?)
30133a0ef4SChris Fallin }
31133a0ef4SChris Fallin
32*856fb272SChris Fallin impl bindings::DebugMainImports for ResourceTable {
print_debugger_info(&mut self, message: String) -> wasmtime::Result<()>33*856fb272SChris Fallin async fn print_debugger_info(&mut self, message: String) -> wasmtime::Result<()> {
34*856fb272SChris Fallin eprintln!("Debugger: {message}");
35*856fb272SChris Fallin Ok(())
36*856fb272SChris Fallin }
37*856fb272SChris Fallin }
38*856fb272SChris Fallin
39133a0ef4SChris Fallin /// Add the debugger world's host functions to a [`wasmtime::component::Linker`].
add_to_linker<T: Send + 'static>( linker: &mut wasmtime::component::Linker<T>, f: fn(&mut T) -> &mut ResourceTable, ) -> wasmtime::Result<()>40133a0ef4SChris Fallin pub fn add_to_linker<T: Send + 'static>(
41133a0ef4SChris Fallin linker: &mut wasmtime::component::Linker<T>,
42133a0ef4SChris Fallin f: fn(&mut T) -> &mut ResourceTable,
43133a0ef4SChris Fallin ) -> wasmtime::Result<()> {
44*856fb272SChris Fallin wit::add_to_linker::<_, wasmtime::component::HasSelf<ResourceTable>>(linker, f)?;
45*856fb272SChris Fallin bindings::DebugMain::add_to_linker_imports::<_, wasmtime::component::HasSelf<ResourceTable>>(
46*856fb272SChris Fallin linker, f,
47*856fb272SChris Fallin )?;
48*856fb272SChris Fallin Ok(())
49133a0ef4SChris Fallin }
50