Skip to content

Implement the WIT async keyword #2073

Merged
alexcrichton merged 4 commits intobytecodealliance:mainfrom
alexcrichton:wit-async
Feb 27, 2025
Merged

Implement the WIT async keyword #2073
alexcrichton merged 4 commits intobytecodealliance:mainfrom
alexcrichton:wit-async

Conversation

@alexcrichton
Copy link
Member

This commit is an implementation of WebAssembly/component-model#442 in
this repository, namely:

  • The async identifier is now a keyword in WIT.
  • Functions in WIT can be annotated async.
  • New kebab-names are now recognized to round-trip this attribute
    through the wasm binary format:
    • [async]foo => foo: async func()
    • [async method]foo.bar => resource foo { bar: async func() }
    • [async static]foo.bar => resource foo { bar: static async func() }
  • Various new tests were updated to ensure these names are gated behind
    the component-model-async feature and additionally test some
    validation of these names.
  • The wit-component convention of "name mangling" was updated to use
    [async-lower] instead of [async] for lowered functions (to not
    conflict with the kebab-name otherwise. Additionally in exports
    [async-lift] is used instead of [async] as well as
    [async-lift-stackful] instead of [async-stackful].
  • Support was added to wit-smith to generate async functions.

@alexcrichton
Copy link
Member Author

alexcrichton commented Feb 25, 2025

Note that the first few commits come from #2072, #2070, and #2069, so only the last commit here is the one in question for this PR

This commit fixes fuzzer fallout from bytecodealliance#2065 and related PRs where
previously async destructor imports were being generated but were
actually bound with synchronous destructor imports. Now `wit-component`
is generating an error on async resource destructors so this fixes the
generator to avoid generating such imports for now while there's not
support for lowering them.
This commit is an implementation of WebAssembly/component-model#442 in
this repository, namely:

* The `async` identifier is now a keyword in WIT.
* Functions in WIT can be annotated `async`.
* New kebab-names are now recognized to round-trip this attribute
  through the wasm binary format:
  * `[async]foo` => `foo: async func()`
  * `[async method]foo.bar` => `resource foo { bar: async func() }`
  * `[async static]foo.bar` => `resource foo { bar: static async func() }`
* Various new tests were updated to ensure these names are gated behind
  the component-model-async feature and additionally test some
  validation of these names.
* The `wit-component` convention of "name mangling" was updated to use
  `[async-lower]` instead of `[async]` for lowered functions (to not
  conflict with the kebab-name otherwise. Additionally in exports
  `[async-lift]` is used instead of `[async]` as well as
  `[async-lift-stackful]` instead of `[async-stackful]`.
* Support was added to `wit-smith` to generate `async` functions.
Copy link
Collaborator

@dicej dicej left a comment

Choose a reason for hiding this comment

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

Thanks for doing this!

@alexcrichton alexcrichton added this pull request to the merge queue Feb 27, 2025
Merged via the queue into bytecodealliance:main with commit 4e8c4c3 Feb 27, 2025
31 checks passed
@alexcrichton alexcrichton deleted the wit-async branch February 27, 2025 20:42
duffney pushed a commit to duffney/wasm-tools that referenced this pull request Mar 4, 2025
* Force using `sync` resource-drop during fuzzing

This commit fixes fuzzer fallout from bytecodealliance#2065 and related PRs where
previously async destructor imports were being generated but were
actually bound with synchronous destructor imports. Now `wit-component`
is generating an error on async resource destructors so this fixes the
generator to avoid generating such imports for now while there's not
support for lowering them.

* Implement the WIT `async` keyword

This commit is an implementation of WebAssembly/component-model#442 in
this repository, namely:

* The `async` identifier is now a keyword in WIT.
* Functions in WIT can be annotated `async`.
* New kebab-names are now recognized to round-trip this attribute
  through the wasm binary format:
  * `[async]foo` => `foo: async func()`
  * `[async method]foo.bar` => `resource foo { bar: async func() }`
  * `[async static]foo.bar` => `resource foo { bar: static async func() }`
* Various new tests were updated to ensure these names are gated behind
  the component-model-async feature and additionally test some
  validation of these names.
* The `wit-component` convention of "name mangling" was updated to use
  `[async-lower]` instead of `[async]` for lowered functions (to not
  conflict with the kebab-name otherwise. Additionally in exports
  `[async-lift]` is used instead of `[async]` as well as
  `[async-lift-stackful]` instead of `[async-stackful]`.
* Support was added to `wit-smith` to generate `async` functions.

* Fix `Ord for ComponentNameKind`

* Another `Ord`-related fix
Sign up for free to 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