xref: /wasmtime-44.0.1/crates/debugger/src/host.rs (revision 856fb272)
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