Stream: git-wasmtime

Topic: wasmtime / PR #11328 Redesign function configuration in `...


view this post on Zulip Wasmtime GitHub notifications bot (Jul 26 2025 at 21:08):

alexcrichton opened PR #11328 from alexcrichton:refactor-bindgen to bytecodealliance:main:

This commit is a redesign of how function-level configuration works in
Wasmtime's bindgen! macro. The main goal of this redesign is to
better support WASIp3 and component model async functions. Prior to this
redesign there was a mish mash of mechanisms to configure behavior of
imports/exports:

Overall the previous state of configuration in bindgen! was clearly a
hodgepodge of systems that organically grew over time. In my personal
opinion it was in dire need of a refresh to take into account how
component-model-async ended up being implemented as well as
consolidating the one-off systems amongst all of these configuration
keys. A major motivation of this redesign, for example, was to inherit
behavior from WIT files by default. An async function in WIT should
not require concurrent_* keys to be configured, but rather it should
generate correct bindings by default.

In this commit, all of the above keys were removed. All keys have been
replaced with imports and exports configuration keys. Each behaves
the same way and looks like so:

bindgen!({
    // ...
    imports: {
        // enable tracing for just this function
        "my:local/interface/func": tracing,

        // enable verbose tracing for just this function
        "my:local/interface/other-func": tracing | verbose_tracing,

        // this is blocking in WIT, but generate async bindings for
        // it
        "my:local/interface/[method]io.block": async,

        // like above, but use "concurrent" bindings which have
        // access to the store.
        "my:local/interface/[method]io.block-again": async | store,

        // everything else is, by default, trappable
        default: trappable,
    },
});

Effectively all the function-level configuration items are now bitflags.
These bitflags are by default inherited from the WIT files itself (e.g.
async functions are async | store by default). Further configuration
is then layered on top at the desires of the embedder. Supported keys are:

The way this then works is all modeled is that for any WIT function
being generated there are a set of flags associated with that function.
To calculate the flags the algorithm looks like:

  1. Find the first matching rule in the imports or exports map
    depending on if the function is imported or exported. If there is no
    matching rule then use the default rule if present. This is the
    initial set of flags for the function (or empty if nothing was
    found).

  2. If ignore_wit is present, return the flags from step 1. Otherwise
    add in async | store if the function is async in WIT.

The resulting set of flags are then used to control how everything is
generated. For example the same split traits of today are still
generated and it's controlled based on the flags. Note though that the
previous HostConcurrent trait was renamed to HostWithStore to make
space for synchronous functions in this trait in the future too.

The end result of all these changes is that configuring imports/exports
now uses the exact same selection system as the with replacement map,
meaning there's only one system of selecting functions instead of 3.
WIT-level async is now respected by default meaning that bindings work
by default without further need to configure anything (unless more
functionality is desired).

One final minor change made here as well is that auto-generated
instantiate methods are now always synchronous and an
instantiate_async method is unconditionally generated for async mode.
This means that bindings always generate both functions and it's up to
the embedder to choose the appropriate one.

Closes https://github.com/bytecodealliance/wasmtime/issues/11246
Closes https://github.com/bytecodealliance/wasmtime/issues/11247

view this post on Zulip Wasmtime GitHub notifications bot (Jul 26 2025 at 21:08):

alexcrichton requested wasmtime-wasi-reviewers for a review on PR #11328.

view this post on Zulip Wasmtime GitHub notifications bot (Jul 26 2025 at 21:08):

alexcrichton requested pchickey for a review on PR #11328.

view this post on Zulip Wasmtime GitHub notifications bot (Jul 26 2025 at 21:08):

alexcrichton requested wasmtime-core-reviewers for a review on PR #11328.

view this post on Zulip Wasmtime GitHub notifications bot (Jul 26 2025 at 21:08):

alexcrichton requested wasmtime-default-reviewers for a review on PR #11328.

view this post on Zulip Wasmtime GitHub notifications bot (Jul 28 2025 at 15:30):

alexcrichton updated PR #11328.

view this post on Zulip Wasmtime GitHub notifications bot (Jul 28 2025 at 15:31):

alexcrichton commented on PR #11328:

One other large-ish change now here, *WithStore is always generated no matter what. That'll make the generated docs slightly more confusing but I think it's worth the tradeoff of enabling bindings to always assume the trait is there.

view this post on Zulip Wasmtime GitHub notifications bot (Jul 28 2025 at 17:04):

pchickey submitted PR review:

Thanks, this is a nice improvement!

view this post on Zulip Wasmtime GitHub notifications bot (Jul 28 2025 at 17:05):

pchickey submitted PR review:

Thanks, this is a nice improvement! In the future I'd probably like it to be tracing or tracing(verbose) instead of another keyword for verbose_tracing, but its not necessary to do that now.

view this post on Zulip Wasmtime GitHub notifications bot (Jul 28 2025 at 17:14):

dicej submitted PR review.

view this post on Zulip Wasmtime GitHub notifications bot (Jul 28 2025 at 17:14):

dicej created PR review comment:

Why is this one commented out?

view this post on Zulip Wasmtime GitHub notifications bot (Jul 28 2025 at 17:14):

dicej created PR review comment:

Did you intend to keep this comment-ed out code fragment?

view this post on Zulip Wasmtime GitHub notifications bot (Jul 28 2025 at 17:14):

dicej created PR review comment:

        // it's otherwise not necessary to implement it manually.

view this post on Zulip Wasmtime GitHub notifications bot (Jul 28 2025 at 18:06):

alexcrichton submitted PR review.

view this post on Zulip Wasmtime GitHub notifications bot (Jul 28 2025 at 18:06):

alexcrichton created PR review comment:

Oops, meant to come back and dig in, but it's just unused so needed to be deleted.

view this post on Zulip Wasmtime GitHub notifications bot (Jul 28 2025 at 18:06):

alexcrichton updated PR #11328.

view this post on Zulip Wasmtime GitHub notifications bot (Jul 28 2025 at 18:06):

alexcrichton submitted PR review.

view this post on Zulip Wasmtime GitHub notifications bot (Jul 28 2025 at 18:06):

alexcrichton created PR review comment:

Oops nah just a forgotten deletion.

view this post on Zulip Wasmtime GitHub notifications bot (Jul 28 2025 at 18:06):

alexcrichton has enabled auto merge for PR #11328.

view this post on Zulip Wasmtime GitHub notifications bot (Jul 28 2025 at 18:55):

alexcrichton merged PR #11328.


Last updated: Dec 06 2025 at 06:05 UTC