Skip to content

Store arguments for async params/results on the stack - #1185

Merged
alexcrichton merged 1 commit into
bytecodealliance:mainfrom
alexcrichton:async-params
Mar 7, 2025
Merged

Store arguments for async params/results on the stack#1185
alexcrichton merged 1 commit into
bytecodealliance:mainfrom
alexcrichton:async-params

Conversation

@alexcrichton

Copy link
Copy Markdown
Member

After #1176 there's no longer any need to store these values on the heap, so store them on the stack instead. This also updates to store params/results in an overlapping allocation which should be reasonable as it's local per-import and results are never written before parameters are read. (and params are never read after results are written).

@alexcrichton
alexcrichton requested a review from dicejMarch 3, 2025 20:40
@alexcrichton
alexcrichton marked this pull request as ready for review March 3, 2025 20:40

@dicejdicej left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM, assuming this passes the wasip3-prototyping tests.

BTW, the phrase "on the stack" is arguably misleading when we may be talking about boxed, self-referential futures generated by the compiler from async functions or blocks. Then "on the stack" may very well mean on the heap, but pedantry aside I understand what you mean.

@alexcrichton
alexcrichton added this pull request to the merge queueMar 7, 2025
@github-merge-queue
github-merge-queueBot removed this pull request from the merge queue due to a conflict with the base branch Mar 7, 2025
After bytecodealliance#1176 there's no longer any need to store these values on the
heap, so store them on the stack instead. This also updates to store
params/results in an overlapping allocation which should be reasonable
as it's local per-import and results are never written before parameters
are read. (and params are never read after results are written).
@alexcrichton
alexcrichton added this pull request to the merge queueMar 7, 2025
Merged via the queue into bytecodealliance:main with commit 88374b4Mar 7, 2025
@alexcrichton
alexcrichton deleted the async-params branch March 7, 2025 23:50
rvolosatovs added a commit to bytecodealliance/wrpc that referenced this pull request Jun 22, 2026
Merge upstream wit-bindgen 0.41.0 into the vendored bindgen subtree.
- Bump wit-bindgen-core 0.40 -> 0.41 (wit-parser stays 0.227).
- Carry upstream's `gen` -> `r#gen` rename of the `InterfaceGenerator` field (and
the `gen` locals in `lib.rs`) so `interface.rs`/`lib.rs` match upstream
verbatim, including at the three `additional_derive_ignore` sites.
- Port upstream feature bytecodealliance/wit-bindgen#1199 (`additional_derives_ignore`): variants and records
named in this kebab-case list are excluded when applying `additional_derives`,
so a type whose payload doesn't implement an added trait (e.g. a resource
handle vs `serde::Deserialize`) keeps the bindings compiling. The macro half
(`crates/wit-bindgen-rust-macro`) merged cleanly; reimplemented the generator
half against wRPC's `Opts` (new `additional_derive_ignore` field + preamble
log) and the three derive sites in `interface.rs` (record/variant/enum), each
gated by `!additional_derive_ignore.contains(&name.to_kebab_case())`.
- Make wRPC's value-codec decoder generation edition-2024-clean: drop the
explicit `ref mut` bindings in the three generated decoder match patterns in
`interface.rs` (the default binding mode yields `&mut` under both editions),
so generated bindings compile under edition 2024 as well as 2021. This is
validated by the dual-edition `verify` carried with the test subcommand below.
- Carry upstream feature bytecodealliance/wit-bindgen#1192 (`wit-bindgen test` subcommand), vendored from
upstream's `crates/test` into a new `wit-bindgen-wrpc-test` crate
(`crates/wit-bindgen-test`) with the guest-Wasm-specific pieces removed. The
CLI gains a `wit-bindgen-wrpc test` subcommand. `lib.rs`/`config.rs` track
upstream verbatim (kept `deny_unknown_fields`); `rust.rs` keeps upstream's
`Edition` enum and dual-edition `verify` (compiling generated bindings under
both 2021 and 2024) but is host-adapted. Dropped as guest-Wasm: the C/WAT
language backends and the custom external-runner (`crates/test/src/{c,wat,
custom}.rs`), the wasmtime runner (`runner.rs`), and in `lib.rs` the wasm32
component compilation/`convert_p1_to_component`, `wasm-compose` composition and
`wasmparser` validation. Codegen tests run the generic `tests/codegen/*.wit`
inputs (replacing the `codegen_tests!` macro harness, so
`crates/wit-bindgen-{rust,go}/tests/codegen.rs` are deleted). Runtime tests
live under `tests/runtime/rust/<name>/` with `runner`+`test` worlds; since wRPC
bindings are `Invoke`/`Serve` RPC stubs rather than guest components, the
`runner` (client) and `test` (server) are linked into one host binary connected
over an in-process TCP transport and run to completion, instead of being
composed in a component runtime. `go.rs` is wRPC-specific (upstream has no Go
backend at this version). bytecodealliance/wit-bindgen#1199's `custom-derives` test is ported here as a
runtime test, behaviorally proving the derives apply (and that `ignoreme` is
excluded), alongside ports of upstream's option tests (skip, with, with-types,
with-option-generate, alternative-bitflags, gated-features, unused-types). The
suite is driven under `cargo test` via `tests/bindgen.rs`, which invokes the
subcommand through `CARGO_BIN_EXE_wit-bindgen-wrpc`.
Non-carries (not applicable to wRPC, dropped from the merge):
- upstream removed Go from its own tree (bytecodealliance/wit-bindgen#1195); wRPC keeps its own
`wit-bindgen-go` generator.
- canonical-ABI / component-async / wasm-export-attribute changes (bytecodealliance/wit-bindgen#1206/bytecodealliance/wit-bindgen#1205
rust 2024 edition export attrs, bytecodealliance/wit-bindgen#1163 64-bit guest adaption, bytecodealliance/wit-bindgen#1185 async stack
args, bytecodealliance/wit-bindgen#1198 p3) do not apply to wRPC's transport-stub generator.
`wit-bindgen-wrpc test` runs 172 codegen tests (86 WITs x rust/go, each rust case
verified under editions 2021 and 2024) and the runtime tests green; the whole
workspace builds; `cargo clippy --workspace` and `cargo doc --workspace` are
clean.
Assisted-by: claude:claude-opus-4-8
Upstream diff: bytecodealliance/wit-bindgen@v0.40.0...v0.41.0
rvolosatovs added a commit to bytecodealliance/wrpc that referenced this pull request Jun 23, 2026
Merge upstream wit-bindgen 0.41.0 into the vendored bindgen subtree.
- Bump wit-bindgen-core 0.40 -> 0.41 (wit-parser stays 0.227).
- Carry upstream's `gen` -> `r#gen` rename of the `InterfaceGenerator` field (and
the `gen` locals in `lib.rs`) so `interface.rs`/`lib.rs` match upstream
verbatim, including at the three `additional_derive_ignore` sites.
- Port upstream feature bytecodealliance/wit-bindgen#1199 (`additional_derives_ignore`): variants and records
named in this kebab-case list are excluded when applying `additional_derives`,
so a type whose payload doesn't implement an added trait (e.g. a resource
handle vs `serde::Deserialize`) keeps the bindings compiling. The macro half
(`crates/wit-bindgen-rust-macro`) merged cleanly; reimplemented the generator
half against wRPC's `Opts` (new `additional_derive_ignore` field + preamble
log) and the three derive sites in `interface.rs` (record/variant/enum), each
gated by `!additional_derive_ignore.contains(&name.to_kebab_case())`.
- Make wRPC's value-codec decoder generation edition-2024-clean: drop the
explicit `ref mut` bindings in the three generated decoder match patterns in
`interface.rs` (the default binding mode yields `&mut` under both editions),
so generated bindings compile under edition 2024 as well as 2021. This is
validated by the dual-edition `verify` carried with the test subcommand below.
- Carry upstream feature bytecodealliance/wit-bindgen#1192 (`wit-bindgen test` subcommand), vendored from
upstream's `crates/test` into a new `wit-bindgen-wrpc-test` crate
(`crates/wit-bindgen-test`) with the guest-Wasm-specific pieces removed. The
CLI gains a `wit-bindgen-wrpc test` subcommand. `lib.rs`/`config.rs` track
upstream verbatim (kept `deny_unknown_fields`); `rust.rs` keeps upstream's
`Edition` enum and dual-edition `verify` (compiling generated bindings under
both 2021 and 2024) but is host-adapted. Dropped as guest-Wasm: the C/WAT
language backends and the custom external-runner (`crates/test/src/{c,wat,
custom}.rs`), the wasmtime runner (`runner.rs`), and in `lib.rs` the wasm32
component compilation/`convert_p1_to_component`, `wasm-compose` composition and
`wasmparser` validation. Codegen tests run the generic `tests/codegen/*.wit`
inputs (replacing the `codegen_tests!` macro harness, so
`crates/wit-bindgen-{rust,go}/tests/codegen.rs` are deleted). Runtime tests
live under `tests/runtime/rust/<name>/` with `runner`+`test` worlds; since wRPC
bindings are `Invoke`/`Serve` RPC stubs rather than guest components, the
`runner` (client) and `test` (server) are linked into one host binary connected
over an in-process TCP transport and run to completion, instead of being
composed in a component runtime. `go.rs` is wRPC-specific (upstream has no Go
backend at this version). bytecodealliance/wit-bindgen#1199's `custom-derives` test is ported here as a
runtime test, behaviorally proving the derives apply (and that `ignoreme` is
excluded), alongside ports of upstream's option tests (skip, with, with-types,
with-option-generate, alternative-bitflags, gated-features, unused-types). The
suite is driven under `cargo test` via `tests/bindgen.rs`, which invokes the
subcommand through `CARGO_BIN_EXE_wit-bindgen-wrpc`.
Non-carries (not applicable to wRPC, dropped from the merge):
- upstream removed Go from its own tree (bytecodealliance/wit-bindgen#1195); wRPC keeps its own
`wit-bindgen-go` generator.
- canonical-ABI / component-async / wasm-export-attribute changes (bytecodealliance/wit-bindgen#1206/bytecodealliance/wit-bindgen#1205
rust 2024 edition export attrs, bytecodealliance/wit-bindgen#1163 64-bit guest adaption, bytecodealliance/wit-bindgen#1185 async stack
args, bytecodealliance/wit-bindgen#1198 p3) do not apply to wRPC's transport-stub generator.
`wit-bindgen-wrpc test` runs 172 codegen tests (86 WITs x rust/go, each rust case
verified under editions 2021 and 2024) and the runtime tests green; the whole
workspace builds; `cargo clippy --workspace` and `cargo doc --workspace` are
clean.
Assisted-by: claude:claude-opus-4-8
Upstream diff: bytecodealliance/wit-bindgen@v0.40.0...v0.41.0
rvolosatovs added a commit to bytecodealliance/wrpc that referenced this pull request Jun 23, 2026
Merge upstream wit-bindgen 0.41.0 into the vendored bindgen subtree.
- Bump wit-bindgen-core 0.40 -> 0.41 (wit-parser stays 0.227).
- Carry upstream's `gen` -> `r#gen` rename of the `InterfaceGenerator` field (and
the `gen` locals in `lib.rs`) so `interface.rs`/`lib.rs` match upstream
verbatim, including at the three `additional_derive_ignore` sites.
- Port upstream feature bytecodealliance/wit-bindgen#1199 (`additional_derives_ignore`): variants and records
named in this kebab-case list are excluded when applying `additional_derives`,
so a type whose payload doesn't implement an added trait (e.g. a resource
handle vs `serde::Deserialize`) keeps the bindings compiling. The macro half
(`crates/wit-bindgen-rust-macro`) merged cleanly; reimplemented the generator
half against wRPC's `Opts` (new `additional_derive_ignore` field + preamble
log) and the three derive sites in `interface.rs` (record/variant/enum), each
gated by `!additional_derive_ignore.contains(&name.to_kebab_case())`.
- Make wRPC's value-codec decoder generation edition-2024-clean: drop the
explicit `ref mut` bindings in the three generated decoder match patterns in
`interface.rs` (the default binding mode yields `&mut` under both editions),
so generated bindings compile under edition 2024 as well as 2021. This is
validated by the dual-edition `verify` carried with the test subcommand below.
- Carry upstream feature bytecodealliance/wit-bindgen#1192 (`wit-bindgen test` subcommand), vendored from
upstream's `crates/test` into a new `wit-bindgen-wrpc-test` crate
(`crates/wit-bindgen-test`) with the guest-Wasm-specific pieces removed. The
CLI gains a `wit-bindgen-wrpc test` subcommand. `lib.rs`/`config.rs` track
upstream verbatim (kept `deny_unknown_fields`); `rust.rs` keeps upstream's
`Edition` enum and dual-edition `verify` (compiling generated bindings under
both 2021 and 2024) but is host-adapted. Dropped as guest-Wasm: the C/WAT
language backends and the custom external-runner (`crates/test/src/{c,wat,
custom}.rs`), the wasmtime runner (`runner.rs`), and in `lib.rs` the wasm32
component compilation/`convert_p1_to_component`, `wasm-compose` composition and
`wasmparser` validation. Codegen tests run the generic `tests/codegen/*.wit`
inputs (replacing the `codegen_tests!` macro harness, so
`crates/wit-bindgen-{rust,go}/tests/codegen.rs` are deleted). Runtime tests
live under `tests/runtime/rust/<name>/` with `runner`+`test` worlds; since wRPC
bindings are `Invoke`/`Serve` RPC stubs rather than guest components, the
`runner` (client) and `test` (server) are linked into one host binary connected
over an in-process TCP transport and run to completion, instead of being
composed in a component runtime. `go.rs` is wRPC-specific (upstream has no Go
backend at this version). bytecodealliance/wit-bindgen#1199's `custom-derives` test is ported here as a
runtime test, behaviorally proving the derives apply (and that `ignoreme` is
excluded), alongside ports of upstream's option tests (skip, with, with-types,
with-option-generate, alternative-bitflags, gated-features, unused-types). The
suite is driven under `cargo test` via `tests/bindgen.rs`, which invokes the
subcommand through `CARGO_BIN_EXE_wit-bindgen-wrpc`.
Non-carries (not applicable to wRPC, dropped from the merge):
- upstream removed Go from its own tree (bytecodealliance/wit-bindgen#1195); wRPC keeps its own
`wit-bindgen-go` generator.
- canonical-ABI / component-async / wasm-export-attribute changes (bytecodealliance/wit-bindgen#1206/bytecodealliance/wit-bindgen#1205
rust 2024 edition export attrs, bytecodealliance/wit-bindgen#1163 64-bit guest adaption, bytecodealliance/wit-bindgen#1185 async stack
args, bytecodealliance/wit-bindgen#1198 p3) do not apply to wRPC's transport-stub generator.
`wit-bindgen-wrpc test` runs 172 codegen tests (86 WITs x rust/go, each rust case
verified under editions 2021 and 2024) and the runtime tests green; the whole
workspace builds; `cargo clippy --workspace` and `cargo doc --workspace` are
clean.
Assisted-by: claude:claude-opus-4-8
Upstream diff: bytecodealliance/wit-bindgen@v0.40.0...v0.41.0
rvolosatovs added a commit to bytecodealliance/wrpc that referenced this pull request Jun 23, 2026
Merge upstream wit-bindgen 0.41.0 into the vendored bindgen subtree.
- Bump wit-bindgen-core 0.40 -> 0.41 (wit-parser stays 0.227).
- Carry upstream's `gen` -> `r#gen` rename of the `InterfaceGenerator` field (and
the `gen` locals in `lib.rs`) so `interface.rs`/`lib.rs` match upstream
verbatim, including at the three `additional_derive_ignore` sites.
- Port upstream feature bytecodealliance/wit-bindgen#1199 (`additional_derives_ignore`): variants and records
named in this kebab-case list are excluded when applying `additional_derives`,
so a type whose payload doesn't implement an added trait (e.g. a resource
handle vs `serde::Deserialize`) keeps the bindings compiling. The macro half
(`crates/wit-bindgen-rust-macro`) merged cleanly; reimplemented the generator
half against wRPC's `Opts` (new `additional_derive_ignore` field + preamble
log) and the three derive sites in `interface.rs` (record/variant/enum), each
gated by `!additional_derive_ignore.contains(&name.to_kebab_case())`.
- Make wRPC's value-codec decoder generation edition-2024-clean: drop the
explicit `ref mut` bindings in the three generated decoder match patterns in
`interface.rs` (the default binding mode yields `&mut` under both editions),
so generated bindings compile under edition 2024 as well as 2021. This is
validated by the dual-edition `verify` carried with the test subcommand below.
- Carry upstream feature bytecodealliance/wit-bindgen#1192 (`wit-bindgen test` subcommand), vendored from
upstream's `crates/test` into a new `wit-bindgen-wrpc-test` crate
(`crates/wit-bindgen-test`) with the guest-Wasm-specific pieces removed. The
CLI gains a `wit-bindgen-wrpc test` subcommand. `lib.rs`/`config.rs` track
upstream verbatim (kept `deny_unknown_fields`); `rust.rs` keeps upstream's
`Edition` enum and dual-edition `verify` (compiling generated bindings under
both 2021 and 2024) but is host-adapted. Dropped as guest-Wasm: the C/WAT
language backends and the custom external-runner (`crates/test/src/{c,wat,
custom}.rs`), the wasmtime runner (`runner.rs`), and in `lib.rs` the wasm32
component compilation/`convert_p1_to_component`, `wasm-compose` composition and
`wasmparser` validation. Codegen tests run the generic `tests/codegen/*.wit`
inputs (replacing the `codegen_tests!` macro harness, so
`crates/wit-bindgen-{rust,go}/tests/codegen.rs` are deleted). Runtime tests
live under `tests/runtime/rust/<name>/` with `runner`+`test` worlds; since wRPC
bindings are `Invoke`/`Serve` RPC stubs rather than guest components, the
`runner` (client) and `test` (server) are linked into one host binary connected
over an in-process TCP transport and run to completion, instead of being
composed in a component runtime. `go.rs` is wRPC-specific (upstream has no Go
backend at this version). bytecodealliance/wit-bindgen#1199's `custom-derives` test is ported here as a
runtime test, behaviorally proving the derives apply (and that `ignoreme` is
excluded), alongside ports of upstream's option tests (skip, with, with-types,
with-option-generate, alternative-bitflags, gated-features, unused-types). The
suite is driven under `cargo test` via `tests/bindgen.rs`, which invokes the
subcommand through `CARGO_BIN_EXE_wit-bindgen-wrpc`.
Non-carries (not applicable to wRPC, dropped from the merge):
- upstream removed Go from its own tree (bytecodealliance/wit-bindgen#1195); wRPC keeps its own
`wit-bindgen-go` generator.
- canonical-ABI / component-async / wasm-export-attribute changes (bytecodealliance/wit-bindgen#1206/bytecodealliance/wit-bindgen#1205
rust 2024 edition export attrs, bytecodealliance/wit-bindgen#1163 64-bit guest adaption, bytecodealliance/wit-bindgen#1185 async stack
args, bytecodealliance/wit-bindgen#1198 p3) do not apply to wRPC's transport-stub generator.
`wit-bindgen-wrpc test` runs 172 codegen tests (86 WITs x rust/go, each rust case
verified under editions 2021 and 2024) and the runtime tests green; the whole
workspace builds; `cargo clippy --workspace` and `cargo doc --workspace` are
clean.
Assisted-by: claude:claude-opus-4-8
Upstream diff: bytecodealliance/wit-bindgen@v0.40.0...v0.41.0
rvolosatovs added a commit to bytecodealliance/wrpc that referenced this pull request Jun 23, 2026
Merge upstream wit-bindgen 0.41.0 into the vendored bindgen subtree.
- Bump wit-bindgen-core 0.40 -> 0.41 (wit-parser stays 0.227).
- Carry upstream's `gen` -> `r#gen` rename of the `InterfaceGenerator` field (and
the `gen` locals in `lib.rs`) so `interface.rs`/`lib.rs` match upstream
verbatim, including at the three `additional_derive_ignore` sites.
- Port upstream feature bytecodealliance/wit-bindgen#1199 (`additional_derives_ignore`): variants and records
named in this kebab-case list are excluded when applying `additional_derives`,
so a type whose payload doesn't implement an added trait (e.g. a resource
handle vs `serde::Deserialize`) keeps the bindings compiling. The macro half
(`crates/wit-bindgen-rust-macro`) merged cleanly; reimplemented the generator
half against wRPC's `Opts` (new `additional_derive_ignore` field + preamble
log) and the three derive sites in `interface.rs` (record/variant/enum), each
gated by `!additional_derive_ignore.contains(&name.to_kebab_case())`.
- Make wRPC's value-codec decoder generation edition-2024-clean: drop the
explicit `ref mut` bindings in the three generated decoder match patterns in
`interface.rs` (the default binding mode yields `&mut` under both editions),
so generated bindings compile under edition 2024 as well as 2021. This is
validated by the dual-edition `verify` carried with the test subcommand below.
- Carry upstream feature bytecodealliance/wit-bindgen#1192 (`wit-bindgen test` subcommand), vendored from
upstream's `crates/test` into a new `wit-bindgen-wrpc-test` crate
(`crates/wit-bindgen-test`) with the guest-Wasm-specific pieces removed. The
CLI gains a `wit-bindgen-wrpc test` subcommand. `lib.rs`/`config.rs` track
upstream verbatim (kept `deny_unknown_fields`); `rust.rs` keeps upstream's
`Edition` enum and dual-edition `verify` (compiling generated bindings under
both 2021 and 2024) but is host-adapted. Dropped as guest-Wasm: the C/WAT
language backends and the custom external-runner (`crates/test/src/{c,wat,
custom}.rs`), the wasmtime runner (`runner.rs`), and in `lib.rs` the wasm32
component compilation/`convert_p1_to_component`, `wasm-compose` composition and
`wasmparser` validation. Codegen tests run the generic `tests/codegen/*.wit`
inputs (replacing the `codegen_tests!` macro harness, so
`crates/wit-bindgen-{rust,go}/tests/codegen.rs` are deleted). Runtime tests
live under `tests/runtime/rust/<name>/` with `runner`+`test` worlds; since wRPC
bindings are `Invoke`/`Serve` RPC stubs rather than guest components, the
`runner` (client) and `test` (server) are linked into one host binary connected
over an in-process TCP transport and run to completion, instead of being
composed in a component runtime. `go.rs` is wRPC-specific (upstream has no Go
backend at this version). bytecodealliance/wit-bindgen#1199's `custom-derives` test is ported here as a
runtime test, behaviorally proving the derives apply (and that `ignoreme` is
excluded), alongside ports of upstream's option tests (skip, with, with-types,
with-option-generate, alternative-bitflags, gated-features, unused-types). The
suite is driven under `cargo test` via `tests/bindgen.rs`, which invokes the
subcommand through `CARGO_BIN_EXE_wit-bindgen-wrpc`.
Non-carries (not applicable to wRPC, dropped from the merge):
- upstream removed Go from its own tree (bytecodealliance/wit-bindgen#1195); wRPC keeps its own
`wit-bindgen-go` generator.
- canonical-ABI / component-async / wasm-export-attribute changes (bytecodealliance/wit-bindgen#1206/bytecodealliance/wit-bindgen#1205
rust 2024 edition export attrs, bytecodealliance/wit-bindgen#1163 64-bit guest adaption, bytecodealliance/wit-bindgen#1185 async stack
args, bytecodealliance/wit-bindgen#1198 p3) do not apply to wRPC's transport-stub generator.
`wit-bindgen-wrpc test` runs 172 codegen tests (86 WITs x rust/go, each rust case
verified under editions 2021 and 2024) and the runtime tests green; the whole
workspace builds; `cargo clippy --workspace` and `cargo doc --workspace` are
clean.
Assisted-by: claude:claude-opus-4-8
Upstream diff: bytecodealliance/wit-bindgen@v0.40.0...v0.41.0
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@alexcrichton@dicej