wiggle: choose between &mut self and &self (#5428)
Previously, all Wiggle-generated traits were generated with `&mut self` signatures. With the addition of the `mutable` configuration option to `from_witx!` and `wasmtime_integration!`, one can disable this, emitting instead traits that use `&self` (i.e., `mutable: false`). This change is helpful for implementing wasi-threads: WASI implementations with interior mutability will now be able to communitcate this to their Wiggle-generated code. The other side of this change is the `get_cx` closure passed to Wiggle's generated `add_to_linker` function. When `mutability` is set to `true` (default), the `get_cx` function takes a `&mut` data structure from the store and returns a corresponding `&mut` reference, usually to a field of the passed-in structure. When `mutability: false`, the `get_cx` closure will still take a `&mut` data structure but now will return a `&` reference.
This commit is contained in:
@@ -12,10 +12,13 @@ pub struct CodegenSettings {
|
||||
pub errors: ErrorTransform,
|
||||
pub async_: AsyncConf,
|
||||
pub wasmtime: bool,
|
||||
// Disabling this feature makes it possible to remove all of the tracing
|
||||
// code emitted in the Wiggle-generated code; this can be helpful while
|
||||
// inspecting the code (e.g., with `cargo expand`).
|
||||
/// Disabling this feature makes it possible to remove all of the tracing
|
||||
/// code emitted in the Wiggle-generated code; this can be helpful while
|
||||
/// inspecting the code (e.g., with `cargo expand`).
|
||||
pub tracing: TracingConf,
|
||||
/// Determine whether the context structure will use `&mut self` (true) or
|
||||
/// simply `&self`.
|
||||
pub mutable: bool,
|
||||
}
|
||||
impl CodegenSettings {
|
||||
pub fn new(
|
||||
@@ -24,6 +27,7 @@ impl CodegenSettings {
|
||||
doc: &Document,
|
||||
wasmtime: bool,
|
||||
tracing: &TracingConf,
|
||||
mutable: bool,
|
||||
) -> Result<Self, Error> {
|
||||
let errors = ErrorTransform::new(error_conf, doc)?;
|
||||
Ok(Self {
|
||||
@@ -31,6 +35,7 @@ impl CodegenSettings {
|
||||
async_: async_.clone(),
|
||||
wasmtime,
|
||||
tracing: tracing.clone(),
|
||||
mutable,
|
||||
})
|
||||
}
|
||||
pub fn get_async(&self, module: &Module, func: &InterfaceFunc) -> Asyncness {
|
||||
|
||||
Reference in New Issue
Block a user