# Changelog
All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [Unreleased]
### Changed
- Fixed table addressing for 64-bit tables.
- Added `validation` option to `ParserConfig` to enable/disable wasmparser validation.
### Breaking Changes
- `instantiate` / `start` / `start_func` no longer fall back to `_start` if the module has no start section. Call the `_start` function explicitly if you want to run it.
- Removed the parser's `optimize_remove_nop` option and accessors.
- Changed public `Instruction` variants and the `.twasm` format. Existing archives must be regenerated.
- `TableType` limits now use `u64`. Use `TableType::new` or `TableType::new64` instead of struct literals.
## [0.9.1] - 2026-06-29
### Added
- Added blocking reentrant Wasm calls from host functions through `FuncContext::call` and `FuncContext::call_untyped`.
### Fixed
- Direct `Function::call` and `Function::call_resumable` calls during an active invocation now trap instead of corrupting the active call/value stacks. While this is technically a breaking change, it prevents stack corruption and is a necessary safety fix. Use `FuncContext::call` or `FuncContext::call_untyped` for reentrant calls instead.
## [0.9.0] - 2026-05-05
**All Commits**: https://github.com/explodingcamera/tinywasm/compare/v0.8.0...v0.9.0
This release is a major runtime and API rework. It adds support for several newer WebAssembly proposals, introduces the new `Engine` configuration API, rewrites large parts of execution and validation, and changes the internal `twasm` archive format. Benchmarks in the repository currently show roughly 30-90% improvement over 0.8.0 depending on workload and execution mode.
### Added
- Support for the `custom_page_sizes` proposal ([#22](https://github.com/explodingcamera/tinywasm/pull/22) by [@danielstuart14](https://github.com/danielstuart14))
- Support for the `tail_call`, `memory64`, `simd`, `relaxed_simd`, `wide_arithmetic`, and `extended_const` proposals ([#37](https://github.com/explodingcamera/tinywasm/pull/37), [#38](https://github.com/explodingcamera/tinywasm/pull/38), [#39](https://github.com/explodingcamera/tinywasm/pull/39))
- New `Engine` API (`tinywasm::Engine` and `engine::Config`) for runtime configuration
- Resumable execution APIs: `call_resumable`, `resume_with_fuel`, `resume_with_time_budget`, and `ExecProgress`
- Host-function fuel APIs: `FuncContext::charge_fuel` and `FuncContext::remaining_fuel`
- `engine::Config` support for fuel policy, stack sizing, memory backend selection, and trap-on-OOM behavior
- New feature flags: `canonicalize-nans`, `simd-x86`, `guest-debug`, `debug`, and `parallel-parser`
- Top-level parser re-exports behind the `parser` feature: `parse_bytes`, `parse_file`, and `parse_stream`
- Completely new `tinywasm` cli
### Changed
- `Store::new` now takes an `Engine`, use `Store::default()` for default settings.
- `ModuleInstance::func` now validates exact Wasm signatures at lookup time and fails immediately on mismatches.
- Stack and call-stack limits can now be defined with `engine::Config`
- Module-internal by-index inspection APIs are now gated behind `guest-debug`
- `Debug` implementations are now gated behind `debug`.
- MSRV increased to 1.95 and the crate now uses Rust 2024.
- `Error`, `Trap`, and `LinkingError` are now `#[non_exhaustive]`.
- `HostFunction::new`, `HostFunction::func`, and `HostFunction::typed` now require `&mut Store`, and `Imports::link_module` now takes a `ModuleInstance` instead of a raw module instance id.
- Cargo features were renamed from `tinywasm-parser` to `parser` and from `logging` to `log`.
- `Error::ParseError` was renamed to `Error::Parser`, and `Error::Twasm` was added.
- `FuncHandle` and `FuncHandleTyped` were renamed to `Function` and `FunctionTyped`, and module export lookups moved from `exported_*` to `func_untyped`, `func`, and `memory`.
- The `twasm` archive format is now based on postcard (backwards-incompatible with previous versions) (thanks [@dragonnn](https://github.com/dragonnn)).
- The interpreter was refactored around more superinstruction fusion, lower-overhead dispatch, typed-stack locals, jump-oriented lowering, and optional parallel parsing.
### Removed
- Cargo feature `simd` was removed.
- `RefNull` was removed and replaced with `FuncRef` and `ExternRef`.
- `tinywasm::interpreter` is no longer a public module.
- `InterpreterRuntime` and `TinyWasmValue` are no longer public API.
- `FuncHandle::name` was removed.
- Mutable `ModuleInstance` export lookup variants `memory_mut`, `table_mut`, `global_mut`, and `extern_item_mut` were removed.
### Fixed
- Fixed archive **no_std** support, which was broken in the previous release, and added tests to ensure it stays working.
- `ModuleInstance::memory` and `FuncContext::memory` now take a non-mut reference to self ([#41](https://github.com/explodingcamera/tinywasm/pull/41)).
- Untyped host functions now check return values correctly ([#27](https://github.com/explodingcamera/tinywasm/pull/27)) by [@WhaleKit](https://github.com/WhaleKit).
- `MemoryRefMut::copy_within(src, dst, len)` now follows its documented argument order.
- Imported tables created with `Extern::table(ty, init)` now honor the provided init value.
- Fixed unchecked memory offsets causing issues on 32-bit platforms.
### Migration Notes
- Replace `Store::new()` with `Store::default()` for default settings, or `Store::new(Engine::new(config))` for custom runtime configuration.
- Rename the cargo features `tinywasm-parser` to `parser` and `logging` to `log`.
- Rename `FuncHandle` to `Function` and `FuncHandleTyped` to `FunctionTyped`.
- Rename module export lookups from `exported_*` methods to `func`, `func_untyped`, and `memory`.
- Regenerate any pre-existing `twasm` archives, the format is not backwards compatible with earlier releases.
## [0.8.0] - 2024-08-29
**All Commits**: https://github.com/explodingcamera/tinywasm/compare/v0.7.0...v0.8.0
### Added
- Full support for Multi-Memory proposal
- Improved support for WebAssembly 2.0 features
### Changed
- Extern tables now correctly update their type after growing
- Increased MSRV to 1.80.0
- Simplify and optimize the interpreter loop
- Use a separate stack and locals for 32, 64 and 128 bit values and references (#21)
- Updated to latest `wasmparser` version
- Removed benchmarks comparing TinyWasm to other WebAssembly runtimes to reduce build dependencies
- Memory and Data Instances are no longer reference counted
## [0.7.0] - 2024-05-15
**All Commits**: https://github.com/explodingcamera/tinywasm/compare/v0.6.0...v0.7.0
### Changed
- Remove all unsafe code
- Refactor interpreter loop
- Optimize Call-frames
- Remove unnecessary reference counter data from store
## [0.6.1] - 2024-05-10
**All Commits**: https://github.com/explodingcamera/tinywasm/compare/v0.6.0...v0.6.1
### Changed
- Switched back to the original `wasmparser` crate, which recently added support for `no_std`
- Performance improvements
- Updated dependencies
## [0.6.0] - 2024-03-27
**All Commits**: https://github.com/explodingcamera/tinywasm/compare/v0.5.0...v0.6.0
### Added
- `Imports` and `Module` are now cloneable (#9)
### Changed
- Improved documentation and added more tests
- Tests can now be run on more targets (#11)
- Nightly version has been updated to fix broken builds in some cases (#12)
- Add `aarch64-apple-darwin` and `armv7-unknown-linux-gnueabihf` targets to CI (#12)
### Removed
- Removed the `EndFunc` instruction, as it was already covered by the `Return` instruction\
This also fixes a weird bug that only occurred on certain nightly versions of Rust
## [0.5.0] - 2024-03-01
**All Commits**: https://github.com/explodingcamera/tinywasm/compare/v0.4.0...v0.5.0
### Added
- Added this `CHANGELOG.md` file to the project
- Added merged instructions for improved performance and reduced bytecode size
### Changed
- Now using a custom `wasmparser` fork
- Switched to a visitor pattern for parsing WebAssembly modules
- Reduced the overhead of control flow instructions
- Reduced the size of bytecode instructions
- Fixed issues on the latest nightly Rust compiler
- Simplified a lot of the internal macros
### Removed
- Removed duplicate internal code
## [0.4.0] - 2024-02-04
**All Commits**: https://github.com/explodingcamera/tinywasm/compare/v0.3.0...v0.4.0
### Added
- Added benchmarks for comparison with other WebAssembly runtimes
- Added support for pre-processing WebAssembly modules into tinywasm bytecode
- Improved examples and documentation
- Implemented the bulk memory operations proposal
### Changed
- Overall performance improvements
## [0.3.0] - 2024-01-26
**All Commits**: https://github.com/explodingcamera/tinywasm/compare/v0.2.0...v0.3.0
- Better trap handling
- Implement linker
- Element instantiation
- Table Operations
- FuncRefs
- Typesafe host functions
- Host function context
- Spec compliance improvements
- Wasm 2.0 testsuite
- Usage examples
- End-to-end tests
- Lots of bug fixes
- Full `no_std` support
## [0.2.0] - 2024-01-11
**All Commits**: https://github.com/explodingcamera/tinywasm/compare/v0.1.0...v0.2.0
- Support for `br_table`
- Memory trapping improvements
- Implicit function label scopes
- else Instructions
- All Memory instructions
- Imports
- Basic linking
- Globals
- Fix function addr resolution
- Reference Instructions
|