Implement the post-return attribute (#4297)
This commit implements the `post-return` feature of the canonical ABI in the component model. This attribute is an optionally-specified function which is to be executed after the return value has been processed by the caller to optionally clean-up the return value. This enables, for example, returning an allocated string and the host then knows how to clean it up to prevent memory leaks in the original module. The API exposed in this PR changes the prior `TypedFunc::call` API in behavior but not in its signature. Previously the `TypedFunc::call` method would set the `may_enter` flag on the way out, but now that operation is deferred until a new `TypedFunc::post_return` method is called. This means that once a method on an instance is invoked then nothing else can be done on the instance until the `post_return` method is called. Note that the method must be called irrespective of whether the `post-return` canonical ABI option was specified or not. Internally wasm will be invoked if necessary. This is a pretty wonky and unergonomic API to work with. For now I couldn't think of a better alternative that improved on the ergonomics. In the theory that the raw Wasmtime bindings for a component may not be used all that heavily (instead `wit-bindgen` would largely be used) I'm hoping that this isn't too much of an issue in the future. cc #4185
This commit is contained in:
@@ -54,6 +54,7 @@ impl ComponentCompiler for Compiler {
|
||||
let CanonicalOptions {
|
||||
memory,
|
||||
realloc,
|
||||
post_return,
|
||||
string_encoding,
|
||||
} = lowering.options;
|
||||
|
||||
@@ -94,6 +95,11 @@ impl ComponentCompiler for Compiler {
|
||||
None => builder.ins().iconst(pointer_type, 0),
|
||||
});
|
||||
|
||||
// A post-return option is only valid on `canon.lift`'d functions so no
|
||||
// valid component should have this specified for a lowering which this
|
||||
// trampoline compiler is interested in.
|
||||
assert!(post_return.is_none());
|
||||
|
||||
// string_encoding: StringEncoding
|
||||
host_sig.params.push(ir::AbiParam::new(ir::types::I8));
|
||||
callee_args.push(
|
||||
|
||||
Reference in New Issue
Block a user