Skip to content

Conversation

@alexcrichton
Copy link
Member

This commit is the start of the modernization of the implementation of
interface types in wasmtime. This has a long way to go, and like the
previous iteration, chunks of it are already destined to get thrown
away.

The current state of affairs is that the implementation of interface
types in wasmtime feels very "bolted on" because, well, it was! The
wasmtime-interface-types crate is not well integrated with the
wasmtime API crate. Additionally it implements an older version of the
interface types proposal dating back to when it was still based on
WebIDL bindings. The goals of this PR are to integrate interface types
into the wasmtime API crate as well as update the implementation to
the current proposal, which is more instruction/adapter based.

Support here is built on top of the tools in the wasm-interface-types
repository which contain various pieces of functionality like parsing
the text format, parsing the binary format, stringifying the binary
format, and validating the binary format. These tools are intended to be
developed standalone from Wasmtime itself to encourage other users (like
wasm-bindgen, a generator for interface types).

This should also fix a number of integration issues around the interface
types demos we have (eventually) since wasm-bindgen is targeting the
wasm-interface-types family of crates rather than the older WebIDL
bindings proposals.

The current status of this commit/PR is that it is a step in the right
direction but incomplete. I started this work a few months ago when I
had some more time and have been occasionally rebasing it on the current
wasmtime master branch. Only a few simple instructions are supported
(and it's all via an interpreter, nothing compiled), and "hard" things
like strings have yet to be done.

What is implemented, however, falls into categories like:

  • API integration into the wasmtime crate is sorted out
    • The ValType type is enhanced with interface types.
    • The Val type is enhanced with interface types values.
    • The Config type has a gate for the interface types proposal like
      it does all other proposals.
  • The wasmtime-interface-types crate is deleted and all users are
    migrated to the wasmtime crate exclusively.
  • The test harness has been enhanced with an invented *.wast syntax to
    cover interface types. I basically add things like s8.const foo as
    well as updated the parser to be able to parse @interface
    directives. Again this is sort of an invented format, but the
    intention is that we can easily write *.wast tests the same way for
    interface types how we do for the core spec.

I don't think we want to land this as-is because of how little of
interface types it implements. Additionally there's parallel work that's
been happening in Cranelift to jit interface types stubs which we may
wish to sync up with as well. In any case the main purpose of this
commit is to add fuel to the interface types discussion and hopefully
give us something concrete to work with as well.

This commit is the start of the modernization of the implementation of
interface types in wasmtime. This has a long way to go, and like the
previous iteration, chunks of it are already destined to get thrown
away.

The current state of affairs is that the implementation of interface
types in wasmtime feels very "bolted on" because, well, it was! The
`wasmtime-interface-types` crate is not well integrated with the
`wasmtime` API crate. Additionally it implements an older version of the
interface types proposal dating back to when it was still based on
WebIDL bindings. The goals of this PR are to integrate interface types
into the `wasmtime` API crate as well as update the implementation to
the current proposal, which is more instruction/adapter based.

Support here is built on top of the tools in the [wasm-interface-types]
repository which contain various pieces of functionality like parsing
the text format, parsing the binary format, stringifying the binary
format, and validating the binary format. These tools are intended to be
developed standalone from Wasmtime itself to encourage other users (like
`wasm-bindgen`, a generator for interface types).

This should also fix a number of integration issues around the interface
types demos we have (eventually) since wasm-bindgen is targeting the
wasm-interface-types family of crates rather than the older WebIDL
bindings proposals.

The current status of this commit/PR is that it is a step in the right
direction but incomplete. I started this work a few months ago when I
had some more time and have been occasionally rebasing it on the current
`wasmtime` master branch. Only a few simple instructions are supported
(and it's all via an interpreter, nothing compiled), and "hard" things
like strings have yet to be done.

What is implemented, however, falls into categories like:

* API integration into the `wasmtime` crate is sorted out
  * The `ValType` type is enhanced with interface types.
  * The `Val` type is enhanced with interface types values.
  * The `Config` type has a gate for the interface types proposal like
    it does all other proposals.
* The `wasmtime-interface-types` crate is deleted and all users are
  migrated to the `wasmtime` crate exclusively.
* The test harness has been enhanced with an invented `*.wast` syntax to
  cover interface types. I basically add things like `s8.const foo` as
  well as updated the parser to be able to parse `@interface`
  directives. Again this is sort of an invented format, but the
  intention is that we can easily write `*.wast` tests the same way for
  interface types how we do for the core spec.

I don't think we want to land this as-is because of how little of
interface types it implements. Additionally there's parallel work that's
been happening in Cranelift to jit interface types stubs which we may
wish to sync up with as well. In any case the main purpose of this
commit is to add fuel to the interface types discussion and hopefully
give us something concrete to work with as well.

[wasm-interface-types]: https://github.com/bytecodealliance/wasm-interface-types
@alexcrichton
Copy link
Member Author

Some major TODO items that need to be implemented are:

  • Adapters on imported functions
  • Strings and their instructions
  • Filling out the rest of the instructions

@github-actions github-actions bot added wasmtime:api Related to the API of the `wasmtime` crate itself fuzzing Issues related to our fuzzing infrastructure labels Mar 11, 2020
@bytecodealliance bytecodealliance deleted a comment from github-actions bot Mar 12, 2020
@bytecodealliance bytecodealliance deleted a comment from github-actions bot Mar 12, 2020
@github-actions
Copy link

Subscribe to Label Action

This issue or pull request has been labeled: "fuzzing", "wasmtime:api"

Users Subscribed to "fuzzing"
Users Subscribed to "wasmtime:api"

To subscribe or unsubscribe from this label, edit the .github/subscribe-to-label.json configuration file.

Learn more.

@alexcrichton alexcrichton changed the base branch from master to main June 25, 2020 18:46
@alexcrichton
Copy link
Member Author

I'm gonna go ahead and close this since this is unlikely to be how interface types looks in the future. Especially with the upcoming rebase on module linking interface types is going to look quite different than what is in this PR.

@alexcrichton alexcrichton deleted the wasm-interface-types-update branch August 5, 2020 15:02
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

fuzzing Issues related to our fuzzing infrastructure wasmtime:api Related to the API of the `wasmtime` crate itself

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant