Released YYYY-MM-DD.
- TODO (or remove section if none)
- TODO (or remove section if none)
- TODO (or remove section if none)
- TODO (or remove section if none)
- TODO (or remove section if none)
- TODO (or remove section if none)
Released 2020-02-03.
- Added support for typed
select
instructions.
Released 2019-09-10.
-
Added support for multi-value Wasm!
-
Added
ModuleExports::get_exported_{func, table, memory, global}
helper functions to get an export by the id of the thing that it is exporting (if any). -
Added fuzz testing with libFuzzer and
cargo fuzz
.
-
No longer using the "derive" feature from
failure
, which should result in slimmer dependency graphs and faster builds. -
Module::emit_wasm
is no longer fallible. It never actually did ever return anErr
and now the type signature reflects that.
Released 2019-08-13.
walrus::Module::write_graphviz_dot
: You can now render a whole Wasm module as a GraphViz Dot file (previously you could only do one function at a time) and it will also show the relationships between all the various Wasm structures (previously it only showed the relationships between instructions).
-
The intermediate representation for instructions (
walrus::ir::*
) has been overhauled.Expr
has been renamed toInstr
, and an operator no longer points to its operands as nested children in the AST. Instead of representing every instruction as a node in an AST, now there is a tree of instruction sequences. An instruction sequence is a vector ofInstr
s that relate to each other implicitly via their effect on the stack. A nestedblock ... end
,loop ... end
, orif ... else ... end
form new nested instruction sequences. -
The
Visitor
andVisitorMut
traits and traversing the IR has also been overhauled:-
Visitors are no longer recursive, and should never recursively call
self.visit_foo()
from insideself.visit_bar()
. Not in the default provided trait methods and not in any user-written overrides of those trait methods. -
There are now traversal functions which take a visitor, a
LocalFunction
, and a startInstrSeqId
, and then perform some kind of traversal over the function's IR from the given start sequence. These traversal functions are not recursive, and are implemented with explicit work lists and while loops. This avoids blowing the stack on deeply nested Wasm inputs. Although we can still OOM, we leave fixing that to future PRs. Right now there are only two traversals, because that is all we've needed so far: an in-order DFS for immutable visitors (needs to be in-order so we can encode instructions in the right order) and a pre-order DFS for mutable visitors (pre-order is the easiest traversal to implement iteratively). We can add more traversals as we need them.
-
-
The
Dot
trait has been made internal. Use the newwalrus::Module::write_graphviz_dot
method instead. -
The
Visit
trait is no longer exported in the public API, and has been made internal. Use the new traversal functions instead (walrus::ir::dfs_in_order
andwalrus::ir::dfs_pre_order_mut
).
Released 2019-06-05.
-
Added
ModuleExports::iter_mut
for iterating over exclusive references to a module's exports. -
Added a
ModuleConfig::on_parse
hook, which has access to a map from indices in the original Wasm binary to the newly assigned walrus IDs. This is a good time to parse custom sections that reference functions or types or whatever by index. -
The
TableKind
enum now has variousunwrap_*
helpers to get a particular variant's inner data or else panic. -
Added
ModuleFunctions::by_name
to get a function ID by function name.
- The
CustomSection::data
trait method now has a new parameter: a map from walrus IDs to their indices in the new wasm binary we are emitting. This is useful for custom sections that reference functions or types or whatever by index.
Released 2019-05-17.
-
Added the
walrus::ModuleCustomSections
API for working with arbitrary custom sections, including and especially custom sections thatwalrus
itself has no special knowledge of. This is exposed as thecustoms
field of awalrus::Module
. -
Added the
Module::with_config
constructor method to create a default, empty module that uses the given configuration.
- The
walrus::Module::custom
vector of raw custom modules has been removed and is superceded by the newwalrus::ModuleCustomSections
API. If you were using this and the oldCustomSection
type, switch to use theRawCustomSection
type withModuleCustomSections
.
Released 2019-05-02.
ModuleConfig::parse_file
andModule::parse_file_with_config
helper functions to easily parse a Wasm file from disk with a given configuration.
ModuleConfig::parse
takes&self
instead of&mut self
now. This was just an oversight / copy-past error before.
Released 2019-02-19.
- Added support for the reference types wasm proposal. #50
- Can finish a
FunctionBuilder
with the relevant&mut
parts of a module, rather than a whole&mut Module
. This is useful when some parts of the module are mutably borrowed elsewhere. #56 - Can get a
FunctionBuilder
from an existingLocalFunction
so you can build new expressions for the function. #54 - Added the ability to delete functions, imports, exports, etc. Usually it is easier to just let the builtin GCing emit only the necessary bits of the wasm binary, but manually deleting will remove the item from iterators over the module's parts. If you delete a thing, you are responsible for ensuring that nothing else is referencing it (eg there are no remaining calls to a function that you are deleting, etc). #58
- Added an
id
getter forImport
s. #59 - Added a mutable iterator for tables in a module. #59
- Added a convenience function for getting the main function table for a module. #57
- The
WithSideEffects
expression variant can have arbitrary stack-neutral side effects before its value now, in addition to after its value. #55
Released 2019-02-14.
- Added configuration options for controlling emission of the producers section
Released 2019-02-14.
- Added configuration options for controlling emission of the DWARF and name custom sections.
- Changed the synthetic naming option from "generate_names" to "generate_synthetic_names_for_anonymous_items" to more accurately reflect what it does.
Released 2019-02-12.
- Initial release!