Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion crates/debugger/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ rust-version.workspace = true
workspace = true

[dependencies]
wasmtime = { workspace = true, features = ["debug", "std", "async", "component-model", "gc", "gc-drc"] }
wasmtime = { workspace = true, features = ["debug", "std", "async", "component-model", "gc", "gc-drc", "threads"] }

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's not unconditionally add the threads feature here -- we want to put this behavior under a threads feature on the debugger crate, make that feature depend on wasmtime/threads, and we want to ensure everything builds without the feature as well.

wasmtime-wasi = { workspace = true }
wasmtime-wasi-io = { workspace = true }
tokio = { workspace = true, features = ["rt", "sync", "macros"] }
Expand Down
54 changes: 37 additions & 17 deletions crates/debugger/src/host/api.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,31 @@ use std::pin::Pin;
use std::sync::Arc;
use std::sync::atomic::{AtomicBool, Ordering};
use wasmtime::{
Engine, ExnRef, FrameHandle, Func, Global, Instance, Memory, Module, OwnedRooted, Result,
Table, Tag, Val, component::Resource, component::ResourceTable,
Engine, ExnRef, FrameHandle, Func, Global, Instance, Module, OwnedRooted, Result, Table, Tag,
Val, component::Resource, component::ResourceTable,
};
use wasmtime_wasi::p2::{DynPollable, Pollable, subscribe};

/// A memory exposed through the debugger API.
///
/// The component-level resource is deliberately shared by both kinds of
/// Wasmtime linear memory. Shared memories use their own host API and do not
/// belong to a `Store`, unlike ordinary memories.
#[derive(Clone)]
pub enum Memory {
Unshared(wasmtime::Memory),
Shared(wasmtime::SharedMemory),
}

impl Memory {
fn unique_id(&self) -> u64 {
match self {
Memory::Unshared(memory) => memory.debug_index_in_store(),
Memory::Shared(memory) => memory.debug_index_in_store(),
}
}
}

/// Representation of one debuggee: a store with debugged code inside,
/// under the control of the debugger.
pub struct Debuggee {
Expand Down Expand Up @@ -446,7 +466,7 @@ impl wit::HostModule for ResourceTable {

impl wit::HostMemory for ResourceTable {
async fn size_bytes(&mut self, self_: Resource<Memory>, d: Resource<Debuggee>) -> Result<u64> {
let memory = *self.get(&self_)?;
let memory = self.get(&self_)?.clone();
let d = debugger(self, &d)?;
d.memory_size_bytes(memory).await
}
Expand All @@ -456,7 +476,7 @@ impl wit::HostMemory for ResourceTable {
self_: Resource<Memory>,
d: Resource<Debuggee>,
) -> Result<u64> {
let memory = *self.get(&self_)?;
let memory = self.get(&self_)?.clone();
let d = debugger(self, &d)?;
d.memory_page_size(memory).await
}
Expand All @@ -467,7 +487,7 @@ impl wit::HostMemory for ResourceTable {
d: Resource<Debuggee>,
delta_bytes: u64,
) -> Result<u64> {
let memory = *self.get(&self_)?;
let memory = self.get(&self_)?.clone();
let d = debugger(self, &d)?;
d.memory_grow(memory, delta_bytes).await
}
Expand All @@ -479,7 +499,7 @@ impl wit::HostMemory for ResourceTable {
addr: u64,
len: u64,
) -> Result<Vec<u8>> {
let memory = *self.get(&self_)?;
let memory = self.get(&self_)?.clone();
let d = debugger(self, &d)?;
Ok(d.memory_read_bytes(memory, addr, len)
.await?
Expand All @@ -493,7 +513,7 @@ impl wit::HostMemory for ResourceTable {
addr: u64,
bytes: Vec<u8>,
) -> Result<()> {
let memory = *self.get(&self_)?;
let memory = self.get(&self_)?.clone();
let d = debugger(self, &d)?;
d.memory_write_bytes(memory, addr, bytes)
.await?
Expand All @@ -507,7 +527,7 @@ impl wit::HostMemory for ResourceTable {
d: Resource<Debuggee>,
addr: u64,
) -> Result<u8> {
let memory = *self.get(&self_)?;
let memory = self.get(&self_)?.clone();
let d = debugger(self, &d)?;
Ok(d.memory_read_u8(memory, addr)
.await?
Expand All @@ -520,7 +540,7 @@ impl wit::HostMemory for ResourceTable {
d: Resource<Debuggee>,
addr: u64,
) -> Result<u16> {
let memory = *self.get(&self_)?;
let memory = self.get(&self_)?.clone();
let d = debugger(self, &d)?;
Ok(d.memory_read_u16(memory, addr)
.await?
Expand All @@ -533,7 +553,7 @@ impl wit::HostMemory for ResourceTable {
d: Resource<Debuggee>,
addr: u64,
) -> Result<u32> {
let memory = *self.get(&self_)?;
let memory = self.get(&self_)?.clone();
let d = debugger(self, &d)?;
Ok(d.memory_read_u32(memory, addr)
.await?
Expand All @@ -546,7 +566,7 @@ impl wit::HostMemory for ResourceTable {
d: Resource<Debuggee>,
addr: u64,
) -> Result<u64> {
let memory = *self.get(&self_)?;
let memory = self.get(&self_)?.clone();
let d = debugger(self, &d)?;
Ok(d.memory_read_u64(memory, addr)
.await?
Expand All @@ -560,7 +580,7 @@ impl wit::HostMemory for ResourceTable {
addr: u64,
value: u8,
) -> Result<()> {
let memory = *self.get(&self_)?;
let memory = self.get(&self_)?.clone();
let d = debugger(self, &d)?;
d.memory_write_u8(memory, addr, value)
.await?
Expand All @@ -575,7 +595,7 @@ impl wit::HostMemory for ResourceTable {
addr: u64,
value: u16,
) -> Result<()> {
let memory = *self.get(&self_)?;
let memory = self.get(&self_)?.clone();
let d = debugger(self, &d)?;
d.memory_write_u16(memory, addr, value)
.await?
Expand All @@ -590,7 +610,7 @@ impl wit::HostMemory for ResourceTable {
addr: u64,
value: u32,
) -> Result<()> {
let memory = *self.get(&self_)?;
let memory = self.get(&self_)?.clone();
let d = debugger(self, &d)?;
d.memory_write_u32(memory, addr, value)
.await?
Expand All @@ -605,7 +625,7 @@ impl wit::HostMemory for ResourceTable {
addr: u64,
value: u64,
) -> Result<()> {
let memory = *self.get(&self_)?;
let memory = self.get(&self_)?.clone();
let d = debugger(self, &d)?;
d.memory_write_u64(memory, addr, value)
.await?
Expand All @@ -614,12 +634,12 @@ impl wit::HostMemory for ResourceTable {
}

async fn clone(&mut self, self_: Resource<Memory>) -> Result<Resource<Memory>> {
let memory = *self.get(&self_)?;
let memory = self.get(&self_)?.clone();
Ok(self.push(memory)?)
}

async fn unique_id(&mut self, self_: Resource<Memory>) -> Result<u64> {
Ok(self.get(&self_)?.debug_index_in_store())
Ok(self.get(&self_)?.unique_id())
}

async fn drop(&mut self, rep: Resource<Memory>) -> Result<()> {
Expand Down
2 changes: 1 addition & 1 deletion crates/debugger/src/host/bindings.rs
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ wasmtime::component::bindgen!({
"bytecodealliance:wasmtime/debuggee.module": wasmtime::Module,
"bytecodealliance:wasmtime/debuggee.table": wasmtime::Table,
"bytecodealliance:wasmtime/debuggee.global": wasmtime::Global,
"bytecodealliance:wasmtime/debuggee.memory": wasmtime::Memory,
"bytecodealliance:wasmtime/debuggee.memory": super::api::Memory,
"bytecodealliance:wasmtime/debuggee.wasm-tag": wasmtime::Tag,
"bytecodealliance:wasmtime/debuggee.wasm-func": wasmtime::Func,
"bytecodealliance:wasmtime/debuggee.wasm-exception": super::api::WasmException,
Expand Down
Loading
Loading