All notable changes to this project will be documented in this file.
The format is loosely based on Keep a Changelog,
and this project adheres to Semantic Versioning.
Additionally we have an Internal
section for changes that are of interest to developers.
Dates in this file are formattes as YYYY-MM-DD
.
- Fixed a bug when translating double negations in expression contexts. #1293
- Add new
Linker
APIs. #1281Linker::instance
: conveniently add exports from an instance to a linker.Linker::alias_module
: alias module definitions via another name.Linker::allow_shadowing
: enable to shadow previous definitions without errors.
- Add
hash-collections
andprefer-btree-collections
crate features to thewasmi
crate. #1265- This allows for more fine grained control over Wasmi dependencies to further decrease compile times.
- Add lowering of compare instructions and fused branch+compare instructions. #1243
- This improved performance for certain workloads and reduced the total Wasmi instruction count significantly.
- Fixed a bug in translation of fused
cmp+branch
instructions with huge offsets.- This was fixed as a side product in #1243.
- Removed the
no-hash-maps
crate feature. #1265 - Removed some minor
wasmi
crate dependencies. #1266 #1267- This should improve compile times of the
wasmi
crate slightly.
- This should improve compile times of the
- Modernize fuzzer and significantly improve fuzzing test coverage.
- Modernize Wasmi
.wast
directives runner. #1279- Overall this significantly improved readability and maintainability
of the Wasmi
.wast
directives runner.
- Overall this significantly improved readability and maintainability
of the Wasmi
- Add
no-hash-maps
crate feature to Wasmi CLI and enable it by default. #1225
- Rename various instructions and add
ShiftAmount
abstraction. #1221 - Use Rust's
ControlFlow
utility. #1223 - Use
get_memory
inload
andstore
execution handlers. #1224
-
Added a new
extra-checks
crate feature to thewasmi
crate. #1217- This improves unreachability checks in when
debug-assertions
orextra-checks
are enabled. - If
extra-checks
are disabled, some technically unnecessary runtime checks are no longer performed. - Use
extra-checks
if your focus is on safety, disable if your focus is on performance.
- This improves unreachability checks in when
- Fixed a bug in local preservation when translating Wasm
loop
control flow. #1218
- Fixed a bug in
select
translation constant propagation. #1213
- Added support for Wasm
multi-memory
proposal. #1191 - Added
Store::call_hook
API. #1144- Contributed by emiltayl.
- Updated WASI dependencies. #1140
- This fixes some long-standing bugs in the
wasmi_wasi
crate.
- This fixes some long-standing bugs in the
- This release includes all fixes that have been backported to
v0.36.1
,v0.36.2
andv0.36.5
.
- Add new Wasmi bytecode. #1152
- This was a major undertaking with lots of sub-issues and PRs.
- The Wasmi bytecode definitions now reside in their own
wasmi_ir
crate. - Most of the definitions are sourced from a single Rust macro to reduce maintenance friction.
- Remove unnecessary
iextend
instructions. #1147 - Changed encoding for Wasmi
call_indirect
instructions. #1156- The new encoding improves performance and reduces the number of function local constants.
- Changed encoding for Wasmi
select
instructions. #1157- The new encoding is more straight-forward and aims to simplify the Wasmi executor and translator.
- Changed encoding for Wasmi
br_table
instruction. #1158- The new encoding improves performance and memory consumption for certain use cases.
- Minor improvements to Wasmi bytecode.
- Fixed a bug with
table.get
translation whenindex
is a preserved register. #commit-b4e78d
- Fixed a bug in local preservation when translating Wasm
loop
control flow. #1218
- Fixed a bug in
select
translation constant propagation. #1213
- Fix miri reported UB in
FuncRef
andExternRef
conversions. #1201 - Fix bug in
table.init
from importedglobal.get
values. #1192
- Changed some
inline
annotations in the Wasmi executor. #commit-b4e78d- This change had minor positive effects on the performance of commonly executed Wasmi instructions.
- Fixed
ref.is_null
translation constant propagation issue. #1189 - Fixed invalid overwrite of preserved local register. #1177
- Removed faulty
br_table
optimization. - Fix a few
clippy
warnings.
- Added support for the official Wasm C-API. (#1009)
- This allows to use Wasmi from any program that can interface with C code.
- The
wasmi_c_api_impl
crate allows to use Wasmi via the Wasm C-API from Rust code.
- Added
Instance::new
API. (#1134)- This was mainly needed to support the Wasm C-API.
- The new API offers a more low-level way for Wasm module instantiation that may be more efficient for certain use cases.
- Added
Clone
implementation forModule
. (#1130)- This was mainly needed to support the Wasm C-API.
- The store fuel API now returns
Error
instead ofFuelError
. (#1131)- This was needed to support the Wasm C-API.
- The
FuelError
is still accessible via theError::kind
method.
- Fixed a dead-lock that prevented users from compiling Wasm modules in host functions
called from Wasmi's executor. (#1122)
- This was a very long-standing bug in the Wasmi interpreter and it is now finally closed.
- Note that this regressed performance of call-intense workloads by roughly 5-10%. Future work is under way to hopefully fix these regressions.
- Before this fix, users had to use a work-around using resumable function calls to cirumvent this issue which is no longer necessary, fortunately.
- Add
CodeMap::alloc_funcs
API and use it when compiling Wasm modules. (#1125)- This significantly improved performance for lazily compiling
Wasm modules (e.g. via
Module::new
) by up to 23%.
- This significantly improved performance for lazily compiling
Wasm modules (e.g. via
- Allows Wasmi CLI to be installed with locked dependencies. (#1096)
- This can be done as follows:
cargo install --locked wasmi_cli
- This can be done as follows:
- Allow Wasm module instantiation in host functions called from Wasmi's executor. (#1116)
- Limit number of parameter and result types in
FuncType
to 1000, each. (#1116)
- Significantly improved and Wasmi's CI and made it a lot faster.
- Refactored and cleaned-up call based and Rust sourced Wasmi benchmarks.
- Added
Error
trait impls for all Wasmi error types impleemntingDisplay
. (#1089)- Contributed by kajacx.
- Fixed compilation for Rust versions <1.78. (#1093)
- Fixed nightly
clippy
warning aboutmap_err
. (#1094)
- Added support for Wasm custom sections processing. (#1085)
- It is now possible to query name and data of Wasm custom sections of a
Module
. - Use the new
Config::ignore_custom_sections
flag to disable this functionality.
- It is now possible to query name and data of Wasm custom sections of a
- Added
Config::ignore_custom_sections
flag to disable processing custom sections if this is unwanted. (#1085) - Add
Memory::{data_ptr, data_size, size}
methods. (#1082) - Added a Wasmi usage guide documentation. (#1072)
- Optimized the Wasmi executor in various ways.
- In summary the Wasmi executor now more optimally caches the currently used Wasm instance and optimizes access to instance related data. In particular access to the default linear memory bytes as well as the value of the global variable at index 0 (often used as shadow stack pointer) are more efficient.
- The following PRs are part of this effort:
- Changed
Memory::grow
signature to mirror Wasmtime'sMemory::grow
method. (#1082)
- Removed
Memory::current_pages
method. (#1082)- Users should use the new
Memory::size
method instead.
- Users should use the new
- Fix overlapping reuse of local preservation slots. (#1057)
- Thanks again to kaiavintr for reporting the bug.
- Refine and generalize the fix for v0.32.1. (#1054)
- Fixes a miscompilation when merging two copy instructions where the result of the first copy is also the input to the second copy and vice versa. (#1052)
- Thanks to kaiavintr for reporting the bug.
Note:
- This release is the culmination of months of research, development and QA with a new execution engine utilizing register-based IR at its core boosting both startup and execution performance to new levels for the Wasmi interpreter.
- This release is accompanied with an article that presents some of the highlights.
- Added a new execution engine based on register-based bytecode. (#729)
- The register-based Wasmi
Engine
executes roughly 80-100% faster and compiles roughly 30% slower according to benchmarks conducted so far.
- The register-based Wasmi
- Added
Module::new_unchecked
API. (#829)- This allows to compile a Wasm module without Wasm validation which can be useful when users know that their inputs are valid Wasm binaries.
- This improves Wasm compilation performance for faster startup times by roughly 10-20%.
- Added Wasm compilation modes. (#844)
- When using
Module::new
Wasmi eagerly compiles Wasm bytecode into Wasmi bytecode which is optimized for efficient execution. However, this compilation can become very costly especially for large Wasm binaries. - The solution to this problem is to introduce new compilation modes, namely:
CompilationMode::Eager
: Eager compilation, what Wasmi did so far. (default)CompilationMode::LazyTranslation
: Eager Wasm validation and lazy Wasm translation.CompilationMode::Lazy
: Lazy Wasm validation and translation.
- Benchmarks concluded that
CompilationMode::LazyTanslation
: Usually improves startup performance by a factor of 2 to 3.CompilationMode::Lazy
: Usually improves startup performance by a factor of up to 27.
- Note that
CompilationMode::Lazy
can lead to partially validated Wasm modules which can introduce non-determinism when using different Wasm implementations. Therefore users should know what they are doing when usingCompilationMode::Lazy
if this is a concern. - Enable lazy Wasm compilation with:
let mut config = wasmi::Config::default(); config.compilation_mode(wasmi::CompilationMode::Lazy);
- When
CompilationMode::Lazy
orCompilationMode::LazyTranslation
and fuel metering is enabled the first function access that triggers compilation (and validation) will charge fuel respective to the number of bytes of the Wasm function body. (#876)
- When using
- Added non-streaming Wasm module compilation. (#1035)
- So far Wasmi only offered a streaming Wasm module compilation API, however most users
probably never really needed that. So starting from this version both
Module::new
andModule::new_unchecked
are now non-streaming with insane performance improvements of up to 80% in certain configurations. - For streaming Wasm module users we added
Module::new_streaming
andModule::new_streaming_unchecked
APIs.
- So far Wasmi only offered a streaming Wasm module compilation API, however most users
probably never really needed that. So starting from this version both
- Added
Module::validate
API. (#840)- This allows to quickly check if a Wasm binary is valid according to a Wasmi
Engine
config. - Note that this does not translate the Wasm and thus
Module::new
orModule::new_unchecked
might still fail due to translation errors.
- This allows to quickly check if a Wasm binary is valid according to a Wasmi
- CLI: Added
--compilation-mode
argument to enable lazy Wasm compilation. (#849) - Added
--verbose
mode to Wasmi CLI by @tjpalmer. (#957)- By default Wasmi CLI no longer prints messages during execution.
- Added
Memory::new_static
constructor by @Ddystopia. (#939)- This allows to construct a Wasm
Memory
from a static byte array which is especially handy for certain embedded use cases.
- This allows to construct a Wasm
- Added
LinkerBuilder
type. (#989)- Using
LinkerBuilder
to create newLinker
s with the same set of host functions is a lot more efficient than creating thoseLinker
s the original way. However, the initialLinkerBuilder
construction will be as inefficient as building up aLinker
previously.
- Using
- Added
EnforcedLimits
configuration option toConfig
. (#985)- Some users want to run Wasm binaries in a specially restricted or limited mode.
For example this mode limits the amount of functions, globals, tables etc. can be defined
in a single Wasm module.
With this change they can enable this new strict mode using
In future updates we might relax this to make
let mut config = wasmi::Config::default(); config.enforced_limits(wasmi::EnforcedLimits::strict());
EnforcedLimits
fully customizable.
- Some users want to run Wasm binaries in a specially restricted or limited mode.
For example this mode limits the amount of functions, globals, tables etc. can be defined
in a single Wasm module.
With this change they can enable this new strict mode using
- Added
EngineWeak
constructed viaEngine::weak
. (#1003)- This properly mirrors the Wasmtime API and allows users to store weak references to the
Engine
.
- This properly mirrors the Wasmtime API and allows users to store weak references to the
- Added
no-hash-maps
crate feature to thewasmi
crate. (#1007)- This tells the
wasmi
crate to avoid using hash based data structures which can be beneficial for running Wasmi in some embedded environments such aswasm32-unknown-unknown
that do not support random sources and thus are incapable to spawn hash maps that are resilient to malicious actors. - Note that Wasmi has always avoided using hash map based data structures prior to this change so not enabling this new crate feature kind of acts as an optimization.
- This tells the
- Added
Default
implementation forStore<T> where T: Default
. (#1031)- This mostly serves as a convenient way to create a minimal Wasmi setup.
- Added
WasmTy
implementations forf32
andf64
Rust primitives. (#1031)- This is convenience for
Linker::func_wrap
calls that take those primitives as arguments. Before this change users had to useF32
andF64
instead which is a bit cumbersome.
- This is convenience for
- Minimum Rust version set to 1.77. (#961)
- CLI: Enabled Wasm
tail-calls
andextend-const
proposals by default. (#849)- We expect those Wasm proposals to be stabilized very soon so we feel safe to enable them by default already.
- Improved
Debug
andDisplay
impls for NaNs of Wasmf32
andf64
values.- They now show
nan:0x{bytes}
where{bytes}
is their respective raw bytes.
- They now show
- Implement
Sync
forResumableInvocation
andTypedResumableInvocation
. (#870) - Properly mirror Wasmtime's fuel API. (#1002)
- Renamed some Wasmi items to improve its Wasmtime mirroring. (#1011)
- Improved Wasmtime API mirror for Store fuel. (#1002)
- Enabled
Config::tail_call
andConfig::extended_const
by default. (#1031)- Those Wasm proposals have been moved to phase 4 for many months now.
- Removed the stack-machine bytecode based Wasmi
Engine
backend. (#818)- The new register-based bytecode based Wasmi
Engine
is more promising and the Wasmi team does not want to maintain two different engine backends.
- The new register-based bytecode based Wasmi
- Removed
FuelConsumptionMode
fromConfig
. (#877)FuelConsumptionMode
was required to differentiate between lazy and eager fuel consumption. This was necessary due to how lazy fuel consumption was implemented in that it would pre-charge for instruction execution were the exact amount of required fuel was not possible to determine at compilation time. Examples arememory.grow
andtable.copy
instructions. The linked PR improved lazy fuel consumption to no longer pre-charge and instead pre-check if the operation is going to succeed and only charge fuel in that case.
- Added execution fuzzing and differential fuzzing.
- Updated CI jobs to use
dtolnay/rust-toolchain
instead ofactions-rs
because the latter was deprecated. (#842)
- Added
ResourceLimiter
API known from Wasmtime. (#737)- This API allows to limit growable Wasm resources such as Wasm tables and linear memories.
- Special thanks to Graydon Hoare for contributing this feature!
- Fixed a bug were
Module::len_globals
internal API returned length of linear memories instead. (#741)
- Removed
intx
crate dependency. (#727)- The dependence on the
intx
crate was accidental and not really required at any time.
- The dependence on the
- Optimized
f64.const
instructions forf64
constant values that can losslessly be encoded as 32-bitf32
value. (#746)
- We now publish and record graphs of benchmarks over time. (#740)
- This allows Wasmi developers to better inspect performance changes over longer periods of time.
- Updated dev. dependencies:
criterion 0.4.0
->0.5.0
wast 0.52.0
->0.62.0
- Optimized Wasmi bytecode memory consumption. (#718)
- This reduced the memory consumption of Wasmi bytecode by organizing the instructions into so-called instruction words, effectively reducing the amount of bytes required per Wasmi instruction 16 bytes to 8 bytes. There was an experiment with 4 bytes but experiments confirmed that 8 bytes per instruction word was the sweetspot for Wasmi execution and translation performance.
- This did not affect execution performance too much but we saw performance improvements for translation from Wasm to Wasmi bytecode by roughly 15-20%.
- Optimized
call
andreturn_call
for Wasm module internal calls. (#724)- Wasmi bytecode now differentiates between calls to Wasm module internal functions and imported functions which allows the Wasmi bytecode executor to perform the common internal calls more efficiently.
- This led to an execution performance improvement across the board but especially for call intense workloads of up to 30% in some test cases.
- Added support for
extended-const
Wasm proposal. (#707) - Added fuel consumption modes. (#706)
- This allows eager and lazy fuel consumption modes to be used which
mainly affects bulk operations such as
table.copy
andmemory.grow
. Eager fuel consumption always consumes fuel before a bulk operation for the total amount independent of success or failure of the operation whereras lazy fuel consumption only consumes fuel for successful executions.
- This allows eager and lazy fuel consumption modes to be used which
mainly affects bulk operations such as
- Normalize fuel costs of all instructions. (#705)
- With this change most instructions cost roughly 1 fuel upon execution. This is more similar to how Wasmtime deals with fuel metered instruction costs. Before this change Wasmi tried to have fuel costs that more closely mirror the computation intensity of the respective instruction according to benchmarks.
- Added support for the
tail-call
Wasm proposal. (#683) - Added support for
Linker
defined host functions. (#692)- Apparently this PR introduced some performance wins for the Wasm target according to our tests. This information shall be taken with a grain of salt since we are not sure why those performance improvement occured since the PR's functionality is orthogonal to Wasm engine performance.
- Required precursor refactoring PR: #681
- The
wasmi_wasi
crate now more closely mirrors thewasmtime_wasi
crate API. (#700)
- Refactor the Wasmi Wasm engine to handle Wasm calls and returns in its core. (#694)
- This improved performance of Wasm function calls significantly at the cost of host function call performance.
- Also this seemed to have impacts Wasm target performance quite positively, too.
- The
Store
now handles Wasm functions and host functions separately. (#686)- This allows to store Wasm functions into the
StoreInner
type which was an important step towards the major refactoring in (#694) - It was expected that host function call performance would degrade by this PR but our tests actually showed that the opposite was true and Wasm target performance was improved overall.
- This allows to store Wasm functions into the
- Introduce
ValueStackPtr
abstraction for the Wasmi engine core. (#688)- This change significantly improved performance especially on the Wasm target according to our tests.
- Optimize
memory.{load,store}
when reading or writing single bytes. (#689)- The performance wins were more modest than we hoped but still measurable.
- Use
StoreContextMut<T>
instead ofimpl AsContextMut
in the Wasmi engine core. (#685)- This is a simple refactoring with the goal to make the Rust compiler have a simpler job at
optimizing certain functions in the engine's inner workings since
StoreContextMut
provides more information to the compiler.
- This is a simple refactoring with the goal to make the Rust compiler have a simpler job at
optimizing certain functions in the engine's inner workings since
- Added support for fuel metering in the Wasmi CLI. (#679)
- Users can now specify an amount of fuel via
--fuel N
to commit for the execution. Upon success the Wasmi CLI will display the total amount of consumed and remaining fuel.
- Users can now specify an amount of fuel via
- Fixed a bug that Wasmi CLI did not preserve the WASI exit status. (#677)
- Thanks to YAMAMOTO Takashi @yamt for reporting the issue.
- The Wasmi CLI now properly displays exported functions if
--invoke x
was provided andx
was not found. (#678) - Applied minor fixes to
Config
docs. (#673)
- Defer charging fuel for costly bulk
memory
and bulktable
operations. (#676)- Note that the check to assert that enough fuel is provided for these costly operation is still happening before the actual computation and only the charging is deferred to after a successful run. The reason behind this is that all the affected operations fail fast and therefore should not cost lots of fuel in case of failure.
- Fixed a bug where resuming a resumable function from a host function with more outputs than
inputs could lead to incorrect behavior or runtime panics. (#671)
- Thanks to Pierre Krieger (tomaka) for reporting and crafting an initial minimal test case.
- Wasmi CLI: Add WASI support. (#597)
- Big shoutout to Onigbinde Oluwamuyiwa Elijah for contributing this to Wasmi!
- Add built-in support for fuel metering. (#653)
- This allows to control the runtime of Wasm executions in a deterministic fasion effectively avoiding the halting problem by charging for executed instructions. Not using the feature will not affect the execution efficiency of Wasmi for users.
- Add
Pages::checked_sub
method. (#660) - Add
Func::new
constructor. (#662)- This allows to create
Func
instances from closures without statically known types.
- This allows to create
- Update to
wasmparser-nostd
version0.100.1
. (#666)
- Clean up and reorganization of the
wasmi_cli
crate. (#655) - Refactoring of internal host call API. (#664)
- Added
Config::floats
option to enable or disable Wasm float operators during Wasm validation. Trap::downcast_mut
andTrap::downcast
methods. (#650)- This helps users to downcast into
T: HostError
.
- This helps users to downcast into
- Added
WasmType
impls forFuncRef
andExternRef
types. (#642)- This allows
FuncRef
andExternRef
instances to be used inTypedFunc
parameters and results.
- This allows
- Removed from
From
impls fromwasmparser-nostd
types to Wasmi types.- For example
From<wasmparser::FuncType> for wasmi::FuncType
got removed.
- For example
- Update the
wasmparser-nostd
dependency from version0.91.0
to0.99.0
. (#640) - The
Trap
type is no longerClone
. (#650)
- Resolved plenty of technical debt and improved structure of the Wasmi crate.
- Added support for the
bulk-memory
Wasm proposal. (#628) - Added support for the
reference-types
Wasm proposal. (#635) - Added
ValueType::{is_ref, is_num
} methods. (#635) - Added
Value::{i32, i64, f32, f64, externref, funcref}
accessor methods toValue
.
- Fix a bug with
Table
andMemory
imports not respecting the current size. (#635)- This sometimes led to the problem that valid
Table
andMemory
imports could incorrectly be rejected for having an invalid size for the subtype check. - This has been fixed as part of the
reference-types
Wasm proposal implementation.
- This sometimes led to the problem that valid
- Use more references in places to provide the compiler with more optimization opportunities. (#634)
- This led to a speed-up across the board for Wasm targets of about 15-20%.
- Move the
Value
type fromwasmi_core
to Wasmi. (#636)- This change was necessary in order to support the
reference-types
Wasm proposal.
- This change was necessary in order to support the
- There has been some consequences from implementing the
reference-types
Wasm proposal which are listed below:- The
Value
type no longer implementsCopy
andPartialEq
. - The
From<&Value> for UntypedValue
impl has been removed. - Remove some
From
impls forValue
. - Moved some
Display
impls for types likeFuncType
andValue
to thewasmi_cli
crate. - Remove the
try_into
API from theValue
type.- Users should use the new accessor methods as in the Wasmtime API.
- The
- Update
wast
dependency from version0.44
to0.52
. (#632) - Update the Wasm spec testsuite to the most recent commit:
3a04b2cf9
- Improve error reporting for the internal Wasm spec testsuite runner.
- It will now show proper span information in many more cases.
Note: This is the Wasmtime API Compatibility update.
- Add
Module::get_export
method. (#617)
- Removed
ModuleError
export from crate root. (#618)- Now
ModuleError
is exported fromcrate::errors
just like all the other error types.
- Now
- Refactor and cleanup traits underlying to
IntoFunc
. (#620)- This is only the first step in moving closer to the Wasmtime API traits.
- Mirror Wasmtime API more closely. (#615, #616)
- Renamed
Caller::host_data
method toCaller::data
. - Renamed
Caller::host_data_mut
method toCaller::data_mut
. - Add
Extern::ty
method and theExternType
type. - Rename
ExportItem
toExportType
:- Rename the
ExportItem::kind
method toty
and returnExternType
instead ofExportItemKind
. - Remove the no longer used
ExportItemKind
entirely.
- Rename the
- The
ExportsIter
now yields items of the new typeExport
instead of pairs of(&str, Extern)
. - Rename
ModuleImport
toImportType
.- Rename
ImportType::item_type
toty
. - Rename
ImportType::field
toname
. - Properly forward
&str
lifetimes inImportType::{module, name}
. - Replace
ModuleImportType
byExternType
.
- Rename
- Add new convenience methods to
Instance
:Instance::get_func
Instance::get_typed_func
Instance::get_global
Instance::get_table
Instance::get_memory
- Rename getters for querying types of runtime objects:
Func::func_type
=>Func::ty
Global::global_type
=>Global::ty
Table::table_type
=>Table::ty
Memory::memory_type
=>Memory::ty
Value::value_type
=>Value::ty
- Remove
Global::value_type
getter.- Use
global.ty().content()
instead.
- Use
- Remove
Global::is_mutable
getter.- Use
global.ty().mutability().is_mut()
instead.
- Use
- Rename
Mutability::Mutable
toVar
. - Add
Mutability::is_mut
getter.- While this API is not included in Wasmtime it is a useful convenience method.
- Rename
TableType::initial
method tominimum
. - Rename
Table::len
method tosize
. Table
andTableType
now operate onu32
instead ofusize
just like in Wasmtime.- This affects
Table::{new, size, set, get, grow}
methods andTableType::{new, minimum, maximum}
methods and their users.
- This affects
- Renamed
- Add missing
TypedFunc::call_resumable
API. (#605)- So far resumable calls were only available for the
Func
type. However, there was no technical reason why it was not implemented forTypedFunc
so this mirrored API now exists. - This also cleans up rough edges with the
Func::call_resumable
API.
- So far resumable calls were only available for the
- Clean up the
wasmi_core
crate API. (#607, #608, #609)- This removes plenty of traits from the public interface of the crate which greatly simplifies the API surface for users.
- The
UntypedValue
type gained some new methods to replace functionality that was provided in parts by the removed traits.
- The Wasmi crate now follows the Wasmtime API a bit more closely. (#613)
StoreContext
new methods:fn engine(&self) -> &Engine
fn data(&self) -> &T
StoreContextMut
new methods:fn engine(&self) -> &Engine
fn data(&self) -> &T
fn data_mut(&mut self) -> &mut T
- Renamed
Store::state
method toStore::data
. - Renamed
Store::state_mut
method toStore::data_mut
. - Renamed
Store::into_state
method toStore::into_data
.
- The
Store
andEngine
types are better decoupled from their generic parts. (#610, #611)- This might reduce binary bloat and may have positive effects on the performance. In fact we measured significant performance improvements on the Wasm target.
- Add support for resumable function calls. (#598)
- This feature allows to resume a function call upon encountering a host trap.
- Add support for concurrently running function executions using a single Wasmi engine.
- This feature also allows to call Wasm functions from host functions. (#590)
- Add initial naive WASI support for Wasmi using the new
wasmi_wasi
crate. (#557)- Special thanks to Onigbinde Oluwamuyiwa Elijah for carrying the WASI support efforts!
- Also thanks to Yuyi Wang for testing and improving initial WASI support. (#592, #571, #568)
- Note: There is ongoing work to integrate WASI support in
wasmi_cli
so that the Wasmi CLI will then be able to execute arbitrarywasm-wasi
files out of the box in the future.
- Add
Module::imports
that allows to query Wasm module imports. (#573, #583)
- Fix a bug that imported linear memories and tables were initialized twice upon instantiation. (#593)
- The Wasmi CLI now properly hints for file path arguments. (#596)
- The
wasmi::Trap
type is now more similar to Wasmtime'sTrap
type. (#559) - The
wasmi::Store
type is nowSend
andSync
as intended. (#566) - The Wasmi CLI now prints exported functions names if the function name CLI argument is missing. (#579)
- Improve feedback when running a Wasm module without exported function using Wasmi CLI. (#584)
- Contribution documentation about fuzz testing. (#529)
- Removed some deprecated functions in the
wasmi_core
crate. (#545)
- Fixed a critical performance regression introduced in Rust 1.65. (#518)
- While the PR's main job was to clean up some code it was found out that it also fixes a critical performance regression introduced in Rust 1.65.
- You can read more about this performance regression in this thread.
- Fixed handling of edge cases with respect to Wasm linear memory. (#449)
- This allows for Wasmi to properly setup and use linear memory instances of up to 4GB.
- Optimize and improve Wasm instantiation. (#531)
- Optimize
global.get
of immutable non-imported globals. (#533)- Also added a benchmark test for this. (#532)
- Implemented miscellaneous improvements to our CI system.
- #539 (and more)
- Miscellaneous clean ups in
wasmi_core
and Wasmi's executor.
- Fixed a potential undefined behavior as reported by the
miri
tool with respect to its experimental stacked borrows. (#524)
- Optimized Wasm to Wasmi translation phase by removing unnecessary Wasm
validation type checks. (#527)
- Speedups were in the range of 15%.
Linker::instantiate
now takes&self
instead of&mut self
. (#512)- This allows users to easily predefine a linker and reused its definitions as shared resource.
- Fixed a bug were
Caller::new
was public. (#514)- It is now a private method as it was meant to be.
- Optimized
TypedFunc::call
at slight cost ofFunc::call
. (#522)- For many parameters and return values the measured improvements are in the range of 25%. Note that this is only significant for a large amount of host to Wasm calls of small functions.
- Added new benchmarks and cleaned up benchmarking code in general.
- Add
miri
testing to Wasmi CI (#523)
- Optimize for common cases for branch and return instructions.
(#493)
- This led to up to 10% performance improvement according to our benchmarks in some cases.
- Removed extraneous
S: impl AsContext
generic parameter fromFunc::typed
method. - Make
IntoFunc
,WasmType
andWasmRet
traits publicly available. - Add missing impl for
WasmRet
forResult<T, Trap> where T: WasmType
.- Without this impl it was impossible to provide closures to
Func::wrap
that returnedResult<T, Trap>
whereT: WasmType
, onlyResult<(), Trap>
orResult<(T,), Trap>
was possible before.
- Without this impl it was impossible to provide closures to
- Added
wasmi_arena
crate which defines all internally used arena data structures. (#502) - Update to
clap 4.0
inwasmi_cli
. (#498) - Many more improvements to our internal benchmarking CI. (#494, #501, #506, #509)
- Added Contibution Guidelines and Code of Conduct to the repository. (#485)
- Optimized instruction dispatch in the Wasmi interpreter.
(#478, #482)
- This yielded combined speed-ups of ~20% across the board.
- As a side effect we also refactored the way we compute branching offsets at Wasm module compilation time which improved performance of Wasm module compilation by roughly 5%.
- Our CI now also benchmarks Wasmi when ran inside Wasmtime as Wasm.
(#483, #487)
- This allows us to optimize Wasmi towards Wasm performance more easily in the future.
- Added
Memory::data_and_store_mut
API inspired by Wasmtime's API. (#448)
- Updated
wasmparser-nostd
dependency from0.90.0
to0.91.0
.- This improved performance of Wasm module compilation by ~10%.
- Updated
wasmi_core
from0.3.0
to0.4.0
. - Optimized execution of several Wasm float to int conversion instructions. (#439)
- We measured a performance improvement of 6000% or in other words those instructions are now 60 times faster than before.
- This allowed us to remove the big
num-rational
dependency fromwasmi_core
for some nice speed-ups in compilation time of Wasmi itself.
- Optimized
global.get
andglobal.set
Wasm instruction execution. (#427)- This improved performance of those instructions by up to 17%.
- Optimized Wasm value stack emulation. (#459)
- This improved performance of compute intense workloads by up to 23%.
- Added automated continuous benchmarking to Wasmi. (#422)
- This allows us to have a more consistent overview over the performance of Wasmi.
- Updated
criterion
benchmarking framework to version0.4.0
. - Reuse allocations during Wasm validation and translation:
- Enabled more useful
clippy
lints for Wasmi andwasmi_core
. (#438) - Reorganized the Wasmi workspace. (#466)
- Update
wasmparser-nostd
dependency from version0.83.0
->0.90.0
. Link:- This significantly improved Wasmi's Wasm parsing, validation and Wasm to Wasmi bytecode translation performance.
- Transition to the new
wasmparser::VisitOperator
API. Link- This again significantly improved Wasmi's Wasm parsing, validation and Wasm to Wasmi bytecode translation performance by avoiding many unnecessary unpredictable branches in the process.
- Fixed bugs found during fuzzing the translation phase of Wasmi. Link
- Fix
Read
trait implementation forno_std
compilations. Link
- Update to
wasmi_core
version0.3.0
. - Changed API of
wasmi::Config
in order to better reflect the API ofwasmtime::Config
. - Refactor
Trap
type to be of pointer size which resulted in significant performance wins across the board especially for call intense work loads. Link
- Removed support for virtual memory based Wasm linear memory.
We decided to remove support since benchmarks showed that our current
implementation actually regresses performance compared to our naive
Vec
based implementation. Link
- The
wasmi::Engine
now caches the bytes of the default linear memory for performance wins inmemory.store
andmemory.load
intense work loads. Link - The Wasmi engine internals have been reorganized and modernised to improve performance on function call intense work loads. This resulted in performance improvements across the board. Link
- The Wasm to Wasmi bytecode translation now properly reuses heap allocations across function translation units which improved translation performance by roughly 10%. Link
- Optimized the Wasmi engine Wasm value stack implementation for significant performance wins across the board. Link
- Shrunk size of some internal identifier types for minor performance wins. Link
- Added initial naive fuzz testing for Wasm parsing, validation and Wasm to Wasmi bytecode translation. Link
-
Added support for the following Wasm proposals:
- Import and export of mutable globals
- Non-trapping float-to-int conversions
- Sign-extension operators
- Multi-value
We plan to support more Wasm proposals in the future.
-
Wasmi has been entirely redesigned and reimplemented. This work resulted in an entirely new API that is heavily inspired by the Wasmtime API, a brand new Wasm execution engine that performs roughly 30-40% better than the previous engine according to our benchmarks, the support of many Wasm proposals and Wasm parsing and validation using the battle tested
wasmparser
crate by the BytecodeAlliance.The new Wasmi design allows to reuse the Wasm execution engine resources instead of spinning up a new Wasm execution engine for every function call.
Note: If you plan to use Wasmi it is of critical importance to compile Wasmi using the following Cargo
profile
settings:[profile.release] lto = "fat" codegen-units = 1
If you do not use these profile settings you might risk regressing performance of Wasmi by up to 400%. You can read more about this issue here.
- Removed support for resuming function execution. We may consider to add this feature back into the new engine. If you are a user of Wasmi and want this feature please feel free to open an issue and provide us with your use case.
- Support allocating 4GB of memory (#452)
Note: Yanked because of missing wasmi_core
bump.
Note: This is the last major release of the legacy Wasmi engine.
Future releases are using the new Wasm execution engines
that are currently in development.
We may consider to publish new major versions of this Wasm engine
as wasmi-legacy
crate.
- Update dependency:
wasmi-validation v0.4.2 -> v0.5.0
- Wasmi now depends on the
wasmi_core
crate. - Deprecated
RuntimeValue::decode_{f32,f64}
methods.- Reason: These methods expose details about the
F32
andF64
types. TheRuntimeValue
type providesfrom_bits
methods for similar purposes. - Replacement: Replace those deprecated methods with
F{32,64}::from_bits().into()
respectively.
- Reason: These methods expose details about the
- Refactor traps in Wasmi: PR
- This change also renames
TrapKind
toTrapCode
. - The Wasmi crate now properly reuses the
TrapCode
definitions from thewasmi_core
crate.
- This change also renames
- Updated dependency:
parity-wasm v0.42 -> v0.45
memory_units v0.3.0 -> v0.4.0
- Rename
RuntimeValue
toValue
internally. - Now uses
wat
crate dependency instead ofwabt
for reading.wat
files in tests. - Updated dev-dependencies:
assert_matches: v1.1 -> v1.5
rand 0.4.2 -> 0.8.2
- Fix some
clippy
warnings.
- Make Wasmi traps more conformant with the Wasm specification. (#300)
- Fixed a bug in
{f32, f64}_copysign
implementations. (#293) - Fixed a bug in
{f32, f64}_{min, max}
implementations. (#295)
- Optimized Wasm to host calls. (#291)
- In some artificial benchmarks we saw improvements of up to 42%!
- Introduce a more efficient
LittleEndianConvert
trait. (#290)
- Refactor and clean up benchmarking code and added more benchmarks.
- Apply some clippy suggestions with respect ot
#[must_use]
. (#288) - Improve Rust code formatting of imports.
- Improve debug impl of
ValueStack
so that only the live parts are printed.
- Support for virtual memory usage on Windows 64-bit platforms.
- Technically we now support the same set of platforms as the
region
crate does: https://github.com/darfink/region-rs#platforms
- Technically we now support the same set of platforms as the
- The Wasmi and
wasmi-validation
crates now both use Rust edition 2021. - The
README
now better teaches how to test and benchmark the crate. - Updated
num-rational
from version0.2.2
->0.4.0
.
- Deprecated
MemoryInstance::get
method.- Users are recommended to use
MemoryInstance::get_value
orMemoryInstance::get_into
methods instead.
- Users are recommended to use
- Removed support for virtual memory on 32-bit platforms.
- Note that the existing support was supposedly not more efficient than the
Vec
based fallback implementation anyways due to technical design.
- Note that the existing support was supposedly not more efficient than the
- Removed the
core
crate feature that previously has been required forno_std
builds.- Now users only have to specify
--no-default-features
for ano_std
build.
- Now users only have to specify
- Fully deploy GitHub Actions CI and remove deprecated Travis based CI. Added CI jobs for:
- Testing on Linux, MacOS and Windows
- Checking docs and dead links in docs.
- Audit crate dependencies for vulnerabilities.
- Check Wasm builds.
- File test coverage reports to codecov.io.
- Added possibility to forward
reduced_stack_buffers
crate feature toparity-wasm
crate.
- Added a default
rustfmt.toml
configuration file. - Fixed some warnings associated to Rust edition 2021.
- Note: The crate itself remains in Rust edition 2018.
- Updated
parity-wasm
from verion0.41
to0.42
. - Bumped
wasmi-validation
from version0.3.1
to0.4.0
.