# Wasm GC Implementation Plan
Milestone plan for implementing the [Wasm GC](https://github.com/WebAssembly/gc) specification.
(borrowed from https://docs.wasmtime.dev/contributing-implementing-wasm-proposals.html)
## 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 [`wat`](https://github.com/bytecodealliance/wasm-tools/tree/main/crates/wat) and [`wast`](https://github.com/bytecodealliance/wasm-tools/tree/main/crates/wast) crates: it's already there!
- [ ] (**in-progress**) Add support to the [`wasmparser`](https://github.com/bytecodealliance/wasm-tools/tree/main/crates/wasmparser) crate.
- [ ] (**in-progress**) Add support to the [`wasmprinter`](https://github.com/bytecodealliance/wasm-tools/tree/main/crates/wasmprinter) crate.
- [ ] (**in-progress**) 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 (this can be done in parallel with adding code to `wasmtime`).
- [ ] Add a `wasmtime::Config::enable_gc` method to the `wasmtime` crate.
- [ ] Add a `--enable-gc` 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](https://docs.wasmtime.dev/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 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/