# Implementing WebAssembly Proposals ## Adding New Support for a Wasm Proposal The following checkboxes enumerate the steps required to add support for a new WebAssembly proposal to Wasmtime. They can be completed over the course of multiple pull requests. * Add support to the [`wasmparser`](https://github.com/bytecodealliance/wasm-tools/tree/main/crates/wasmparser) crate. * Add support to the [`wat`](https://github.com/bytecodealliance/wasm-tools/tree/main/crates/wat) and [`wast`](https://github.com/bytecodealliance/wasm-tools/tree/main/crates/wast) crates. * Add support to the [`wasmprinter`](https://github.com/bytecodealliance/wasm-tools/tree/main/crates/wasmprinter) crate. * Add support to the [`wasm-encoder`](https://github.com/bytecodealliance/wasm-tools/tree/main/crates/wasm-encoder) crate. * Add support to the [`wasm-smith`](https://github.com/bytecodealliance/wasm-tools/tree/main/crates/wasm-smith) crate. * Add a `wasmtime::Config::enable_foo_bar` method to the `wasmtime` crate. * Add a `--enable-foo-bar` command line flag to the `wasmtime` binary. * Enable the spec tests in [`build.rs`](https://github.com/bytecodealliance/wasmtime/blob/c7cd70fcec3eee66c9d7b5aa6fb4580d5a802218/build.rs#L41-L52) but [mark them as ignored](https://github.com/bytecodealliance/wasmtime/blob/c7cd70fcec3eee66c9d7b5aa6fb4580d5a802218/build.rs#L196) for now. * Stop ignoring individual spec tests and get them passing one by one. * Enable the proposal in [the fuzz targets](./contributing-fuzzing.html). * Add examples from the spec tests to [the relevant corpora](https://github.com/bytecodealliance/wasmtime-libfuzzer-corpus). > The `wast2json` tool from [WABT] is useful for this. * Write a custom fuzz target, oracle, and/or test case generator for fuzzing this proposal in particular. > For example, we wrote a [custom > generator](https://github.com/bytecodealliance/wasmtime/blob/c7cd70fcec3eee66c9d7b5aa6fb4580d5a802218/crates/fuzzing/src/generators/table_ops.rs), > [oracle](https://github.com/bytecodealliance/wasmtime/blob/c7cd70fcec3eee66c9d7b5aa6fb4580d5a802218/crates/fuzzing/src/oracles.rs#L417-L467), > and [fuzz > target](https://github.com/bytecodealliance/wasmtime/blob/c7cd70fcec3eee66c9d7b5aa6fb4580d5a802218/fuzz/fuzz_targets/table_ops.rs) > for exercising `table.{get,set}` instructions and their interaction with > GC while implementing the reference types proposal. * Expose the proposal's new functionality in the `wasmtime` crate's API. > For example, the bulk memory operations proposal introduced a `table.copy` > instruction, and we exposed its functionality as the `wasmtime::Table::copy` > method. * Expose the proposal's new functionality in the C API. > This may require extensions to the standard C API, and if so, should be > defined in > [`wasmtime.h`](https://github.com/bytecodealliance/wasmtime/blob/c7cd70fcec3eee66c9d7b5aa6fb4580d5a802218/crates/c-api/include/wasmtime.h) > and prefixed with `wasmtime_`. * Use the C API to expose the proposal's new functionality in the other language embedding APIs: * [Python](https://github.com/bytecodealliance/wasmtime-py/) * [Go](https://github.com/bytecodealliance/wasmtime-go/) * [.NET](https://github.com/bytecodealliance/wasmtime-dotnet/) * Document support for the proposal in `wasmtime/docs/stability-wasm-proposals-support.md`. ## Enabling Support for a Proposal by Default These are the standards that must be met to enable support for a proposal by default in Wasmtime, and can be used as a review checklist. * The proposal must be in phase 4, or greater, of [the WebAssembly standardization process][phases]. * All spec tests must be passing in Wasmtime. * No open questions, design concerns, or serious known bugs. * Has been fuzzed for at least a week minimum. * We are confident that the fuzzers are fully exercising the proposal's functionality. > For example, it would *not* have been enough to simply enable reference > types in the `compile` fuzz target to enable that proposal by > default. Compiling a module that uses reference types but not instantiating > it nor running any of its functions doesn't exercise any of the GC > implementation and does not run the inline fast paths for `table` operations > emitted by the JIT. Exercising these things was the motivation for writing > the custom fuzz target for `table.{get,set}` instructions. * The proposal's functionality is exposed in the `wasmtime` crate's API. * The proposal's functionality is exposed in the C API. * The proposal's functionality is exposed in at least one of the other languages' APIs. [phases]: https://github.com/WebAssembly/meetings/blob/master/process/phases.md [WABT]: https://github.com/WebAssembly/wabt/