-
Notifications
You must be signed in to change notification settings - Fork 94
Description
Description
Because of the assertNotIdentifier
calls in wasm-gen/lib/encoder/index.js, editing, say, a module export name can throw with the default decode options.
Steps to repro
Start with input WASM corresponding to the WAT
(module
(func $add (param $lhs i32) (param $rhs i32) (result i32)
get_local $lhs
get_local $rhs
i32.add)
(export "add" (func $add))
)
(from MDN's examples).
Then edit the export name like
import { edit } from '@webassemblyjs/wasm-edit';
const bin; // ArrayBuffer containing .wasm contents
edit(bin, {
ModuleExport(path) {
path.node.name += '!!';
}
});
This throws with "Unsupported node Identifier" due to the assertion at
function encodeModuleExport(n) {
var out = [];
assertNotIdentifierNode(n.descr.id);
// etc.
}
If you instead decode with ignoreCustomNameSection: true
then the edit succeeds:
import { decode } from '@webassemblyjs/wasm-parser';
import { editWithAST } from '@webassemblyjs/wasm-edit';
const bin; // ArrayBuffer containing .wasm contents
const ast = decode(bin, {
ignoreCustomNameSection: true
});
editWithAST(ast, bin, {
ModuleExport(path) {
path.node.name += '!!';
}
});
At the relevant assertion, n.node.descr
now has type 'NumberLiteral'
instead of 'Identifier'
.
Expected behavior
That valid edits succeed with default decode options. The current behavior feels restrictive.
Other Cases?
This behavior with export names seems to repro reliably across input .wasm files. I also found a possible repro with import names, but that one only affected some of the files I tested and might be due to a bug with decode
. I'll file that separately.