$ npm install binaryen
binaryen.js is a port of Binaryen to the Web, allowing you to generate WebAssembly using a JavaScript API.
$> npm install binaryen
var binaryen = require("binaryen");
// Create a module with a single function
var myModule = new binaryen.Module();
myModule.addFunction("add", myModule.addFunctionType("iii", binaryen.i32, [ binaryen.i32, binaryen.i32 ]), [ binaryen.i32 ],
myModule.block(null, [
myModule.setLocal(2,
myModule.i32.add(
myModule.getLocal(0, binaryen.i32),
myModule.getLocal(1, binaryen.i32)
)
),
myModule.return(
myModule.getLocal(2, binaryen.i32)
)
])
);
myModule.addFunctionExport("add", "add");
// Optimize the module using default passes and levels
myModule.optimize();
// Validate the module
if (!myModule.validate())
throw new Error("validation error");
// Generate text format and binary
var textData = myModule.emitText();
var wasmData = myModule.emitBinary();
// Example usage with the WebAssembly API
var compiled = new WebAssembly.Module(wasmData);
var instance = new WebAssembly.Instance(compiled, {});
console.log(instance.exports.add(41, 1));
The buildbot also publishes nightly versions once a day if there have been changes. The latest nightly can be installed through
$> npm install binaryen@nightly
or you can use one of the previous versions instead if necessary.
https://cdn.jsdelivr.net/gh/AssemblyScript/binaryen.js@VERSION/index.js
https://cdn.jsdelivr.net/npm/binaryen@VERSION/index.js
https://unpkg.com/binaryen@VERSION/index.js
Replace VERSION
with a specific version or omit it (not recommended in production) to use master/latest.
Future features 🦄 might not be supported by all runtimes.
none: Type
The none type, e.g., void
.
i32: Type
32-bit integer type.
i64: Type
64-bit integer type.
f32: Type
32-bit float type.
f64: Type
64-bit float (double) type.
v128: Type
128-bit vector type. 🦄
unreachable: Type
Special type indicating unreachable code when obtaining information about an expression.
auto: Type
Special type used in Module#block exclusively. Lets the API figure out a block's result type automatically.
new Module(): Module
Constructs a new module.
parseText(text: string
): Module
Creates a module from Binaryen's s-expression text format (not official stack-style text format).
readBinary(data: Uint8Array
): Module
Creates a module from binary data.
Module#addFunctionType(name: string
, resultType: Type
, paramTypes: Type[]
): Signature
Adds a new function type.
Module#getFunctionTypeBySignature(resultType: Type
, paramTypes: Type[]
): Signature
Gets an existing function type by its parametric signature. Returns 0
if there is no such function type.
Module#removeFunctionType(name: string
): void
Removes a function type.
Module#addFunction(name: string
, functionType: Signature
, varTypes: Type[]
, body: Expression
): Function
Adds a function. varTypes
indicate additional locals, in the given order.
Module#getFunction(name: string
): Function
Gets a function, by name,
Module#removeFunction(name: string
): void
Removes a function, by name.
Module#addFunctionImport(internalName: string
, externalModuleName: string
, externalBaseName: string
, functionType: Signature
): Import
Adds a function import.
Module#addTableImport(internalName: string
, externalModuleName: string
, externalBaseName: string
): Import
Adds a table import. There's just one table for now, using name "0"
.
Module#addMemoryImport(internalName: string
, externalModuleName: string
, externalBaseName: string
): Import
Adds a memory import. There's just one memory for now, using name "0"
.
Module#addGlobalImport(internalName: string
, externalModuleName: string
, externalBaseName: string
, globalType: Type
): Import
Adds a global variable import. Imported globals must be immutable.
Module#addFunctionExport(internalName: string
, externalName: string
): Export
Adds a function export.
Module#addTableExport(internalName: string
, externalName: string
): Export
Adds a table export. There's just one table for now, using name "0"
.
Module#addMemoryExport(internalName: string
, externalName: string
): Export
Adds a memory export. There's just one memory for now, using name "0"
.
Module#addGlobalExport(internalName: string
, externalName: string
): Export
Adds a global variable export. Exported globals must be immutable.
Module#addGlobal(name: string
, type: Type
, mutable: number
, value: Expression
): Global
Adds a global instance variable.
Module#getGlobal(name: string
): Global
Gets a global, by name,
Module#removeGlobal(name: string
): void
Removes a global, by name.
Module#removeExport(externalName: string
): void
Removes an export, by external name.
Module#setFunctionTable(initial: number
, maximum: number
, funcs: string[]
): void
Sets the contents of the function table. There's just one table for now, using name "0"
.
Module#setMemory(initial: number
, maximum: number
, exportName: string | null
, segments: MemorySegment[]
, flags?: number[]
, shared?: boolean
): void
Sets the memory. There's just one memory for now, using name "0"
. Providing exportName
also creates a memory export.
Module#setStart(start: Function
): void
Sets the start function.
Module#autoDrop(): void
Enables automatic insertion of drop
operations where needed. Lets you not worry about dropping when creating your code.
getFunctionTypeInfo(ftype: FunctionType
: FunctionTypeInfo
Obtains information about a function type.
string | null
Type[]
Type
getFunctionInfo(ftype: Function
: FunctionInfo
Obtains information about a function.
string
string | null
(if imported)string | null
(if imported)FunctionType
Type[]
Type
Type
Expression
getGlobalInfo(global: Global
): GlobalInfo
Obtains information about a global.
string
string | null
(if imported)string | null
(if imported)Type
boolean
Expression
getExportInfo(export_: Export
): ExportInfo
Obtains information about an export.
ExternalKind
string
string
Possible ExternalKind
values are:
ExternalKind
ExternalKind
ExternalKind
ExternalKind
boolean
true
if valid, otherwise prints validation errors and returns false
.Module#optimize(): void
Optimizes the module using the default optimization passes.
Module#optimizeFunction(func: Function | string
): void
Optimizes a single function using the default optimization passes.
Module#runPasses(passes: string[]
): void
Runs the specified passes on the module.
Module#runPassesOnFunction(func: Function | string
, passes: string[]
): void
Runs the specified passes on a single function.
getOptimizeLevel(): number
Gets the currently set optimize level. 0
, 1
, 2
correspond to -O0
, -O1
, -O2
(default), etc.
setOptimizeLevel(level: number
): void
Sets the optimization level to use. 0
, 1
, 2
correspond to -O0
, -O1
, -O2
(default), etc.
getShrinkLevel(): number
Gets the currently set shrink level. 0
, 1
, 2
correspond to -O0
, -Os
(default), -Oz
.
setShrinkLevel(level: number
): void
Sets the shrink level to use. 0
, 1
, 2
correspond to -O0
, -Os
(default), -Oz
.
getDebugInfo(): boolean
Gets whether generating debug information is currently enabled or not.
setDebugInfo(on: boolean
): void
Enables or disables debug information in emitted binaries.
Module#emitBinary(): Uint8Array
Returns the module in binary format.
Module#emitBinary(sourceMapUrl: string | null
): BinaryWithSourceMap
Returns the module in binary format with its source map. If sourceMapUrl
is null
, source map generation is skipped.
Uint8Array
string | null
Module#emitText(): string
Returns the module in Binaryen's s-expression text format (not official stack-style text format).
Module#emitAsmjs(): string
Returns the asm.js representation of the module.
Module#dispose(): void
Releases the resources held by the module once it isn't needed anymore.
Module#block(label: string | null
, children: Expression[]
, resultType?: Type
): Expression
Creates a block. resultType
defaults to none
.
Module#if(condition: Expression
, ifTrue: Expression
, ifFalse?: Expression
): Expression
Creates an if or if/else combination.
Module#loop(label: string | null
, body: Expression
): Expression
Creates a loop.
Module#break(label: string
, condition?: Expression
, value?: Expression
): Expression
Creates a break (br) to a label.
Module#switch(labels: string[]
, defaultLabel: string
, condition: Expression
, value?: Expression
): Expression
Creates a switch (br_table).
Module#nop(): Expression
Creates a no-operation (nop) instruction.
Module#return(value?: Expression
): Expression
Creates a return.
Module#unreachable(): Expression
Creates an unreachable instruction that will always trap.
Module#drop(value: Expression
): Expression
Creates a drop of a value.
Module#select(condition: Expression
, ifTrue: Expression
, ifFalse: Expression
): Expression
Creates a select of one of two values.
number
): Expression
number
, high: number
): Expression
number
): Expression
number
): Expression
number
): Expression
number
, high: number
): Expression
Module#local.get(index: number
, type: Type
): Expression
Creates a local.get for the local at the specified index. Note that we must specify the type here as we may not have created the local being called yet.
Module#local.set(index: number
, value: Expression
): Expression
Creates a local.set for the local at the specified index.
Module#local.tee(index: number
, value: Expression
): Expression
Creates a local.tee for the local at the specified index. A tee differs from a set in that the value remains on the stack.
Module#global.get(name: string
, type: Type
): Expression
Creates a global.get for the global with the specified name. Note that we must specify the type here as we may not have created the global being called yet.
Module#global.set(name: string
, value: Expression
): Expression
Creates a global.set for the global with the specified name.
Expression
): Expression
Expression
): Expression
Expression
): Expression
Expression
): Expression
Expression
, right: Expression
): Expression
Expression
, right: Expression
): Expression
Expression
, right: Expression
): Expression
Expression
, right: Expression
): Expression
Expression
, right: Expression
): Expression
Expression
, right: Expression
): Expression
Expression
, right: Expression
): Expression
Expression
, right: Expression
): Expression
Expression
, right: Expression
): Expression
Expression
, right: Expression
): Expression
Expression
, right: Expression
): Expression
Expression
, right: Expression
): Expression
Expression
, right: Expression
): Expression
Expression
, right: Expression
): Expression
Expression
, right: Expression
): Expression
Expression
, right: Expression
): Expression
Expression
, right: Expression
): Expression
Expression
, right: Expression
): Expression
Expression
, right: Expression
): Expression
Expression
, right: Expression
): Expression
Expression
, right: Expression
): Expression
Expression
, right: Expression
): Expression
Expression
, right: Expression
): Expression
Expression
, right: Expression
): Expression
Expression
, right: Expression
): Expression
Expression
): Expression
Expression
): Expression
Expression
): Expression
Expression
): Expression
Expression
, right: Expression
): Expression
Expression
, right: Expression
): Expression
Expression
, right: Expression
): Expression
Expression
, right: Expression
): Expression
Expression
, right: Expression
): Expression
Expression
, right: Expression
): Expression
Expression
, right: Expression
): Expression
Expression
, right: Expression
): Expression
Expression
, right: Expression
): Expression
Expression
, right: Expression
): Expression
Expression
, right: Expression
): Expression
Expression
, right: Expression
): Expression
Expression
, right: Expression
): Expression
Expression
, right: Expression
): Expression
Expression
, right: Expression
): Expression
Expression
, right: Expression
): Expression
Expression
, right: Expression
): Expression
Expression
, right: Expression
): Expression
Expression
, right: Expression
): Expression
Expression
, right: Expression
): Expression
Expression
, right: Expression
): Expression
Expression
, right: Expression
): Expression
Expression
, right: Expression
): Expression
Expression
, right: Expression
): Expression
Expression
, right: Expression
): Expression
Expression
): Expression
Expression
): Expression
Expression
): Expression
Expression
): Expression
Expression
): Expression
Expression
): Expression
Expression
): Expression
Expression
, right: Expression
): Expression
Expression
, right: Expression
): Expression
Expression
, right: Expression
): Expression
Expression
, right: Expression
): Expression
Expression
, right: Expression
): Expression
Expression
, right: Expression
): Expression
Expression
, right: Expression
): Expression
Expression
, right: Expression
): Expression
Expression
, right: Expression
): Expression
Expression
, right: Expression
): Expression
Expression
, right: Expression
): Expression
Expression
, right: Expression
): Expression
Expression
, right: Expression
): Expression
Expression
): Expression
Expression
): Expression
Expression
): Expression
Expression
): Expression
Expression
): Expression
Expression
): Expression
Expression
): Expression
Expression
, right: Expression
): Expression
Expression
, right: Expression
): Expression
Expression
, right: Expression
): Expression
Expression
, right: Expression
): Expression
Expression
, right: Expression
): Expression
Expression
, right: Expression
): Expression
Expression
, right: Expression
): Expression
Expression
, right: Expression
): Expression
Expression
, right: Expression
): Expression
Expression
, right: Expression
): Expression
Expression
, right: Expression
): Expression
Expression
, right: Expression
): Expression
Expression
, right: Expression
): Expression
Expression
): Expression
Expression
): Expression
Expression
): Expression
Expression
): Expression
Expression
): Expression
Expression
): Expression
Expression
): Expression
Expression
): Expression
Expression
): Expression
Expression
): Expression
Expression
): Expression
Expression
): Expression
Expression
): Expression
Expression
): Expression
Expression
): Expression
Expression
): Expression
Expression
): Expression
Expression
): Expression
Expression
): Expression
Expression
): Expression
Expression
): Expression
Expression
): Expression
Expression
): Expression
Expression
): Expression
Expression
): Expression
Module#call(name: string
, operands: Expression[]
, returnType: Type
): Expression
Creates a call to a function. Note that we must specify the return type here as we may not have created the function being called yet.
Module#call_indirect/callIndirect(target: Expression
, operands: Expression[]
, returnType: Type
): Expression
Similar to call, but calls indirectly, i.e., via a function pointer, so an expression replaces the name as the called value.
number
, align: number
, ptr: Expression
): Expression
number
, align: number
, ptr: Expression
): Expression
number
, align: number
, ptr: Expression
): Expression
number
, align: number
, ptr: Expression
): Expression
number
, align: number
, ptr: Expression
): Expression
number
, align: number
, ptr: Expression
, value: Expression
): Expression
number
, align: number
, ptr: Expression
, value: Expression
): Expression
number
, align: number
, ptr: Expression
, value: Expression
): Expression
number
, align: number
, ptr: Expression
): Expression
number
, align: number
, ptr: Expression
): Expression
number
, align: number
, ptr: Expression
): Expression
number
, align: number
, ptr: Expression
): Expression
number
, align: number
, ptr: Expression
): Expression
number
, align: number
, ptr: Expression
): Expression
number
, align: number
, ptr: Expression
): Expression
number
, align: number
, ptr: Expression
, value: Expression
): Expression
number
, align: number
, ptr: Expression
, value: Expression
): Expression
number
, align: number
, ptr: Expression
, value: Expression
): Expression
number
, align: number
, ptr: Expression
, value: Expression
): Expression
number
, align: number
, ptr: Expression
): Expression
number
, align: number
, ptr: Expression
, value: Expression
): Expression
number
, align: number
, ptr: Expression
): Expression
number
, align: number
, ptr: Expression
, value: Expression
): Expression
Expression
number
): Expression
number
, ptr: Expression
): Expression
number
, ptr: Expression
): Expression
number
, ptr: Expression
): Expression
number
, ptr: Expression
, value: Expression
): Expression
number
, ptr: Expression
, value: Expression
): Expression
number
, ptr: Expression
, value: Expression
): Expression
number
, ptr: Expression
): Expression
number
, ptr: Expression
): Expression
number
, ptr: Expression
): Expression
number
, ptr: Expression
): Expression
number
, ptr: Expression
, value: Expression
): Expression
number
, ptr: Expression
, value: Expression
): Expression
number
, ptr: Expression
, value: Expression
): Expression
number
, ptr: Expression
, value: Expression
): Expression
number
, ptr: Expression
, value: Expression
): Expression
number
, ptr: Expression
, value: Expression
): Expression
number
, ptr: Expression
, value: Expression
): Expression
number
, ptr: Expression
, value: Expression
): Expression
number
, ptr: Expression
, value: Expression
): Expression
number
, ptr: Expression
, value: Expression
): Expression
number
, ptr: Expression
, expected: Expression
, replacement: Expression
): Expression
number
, ptr: Expression
, value: Expression
): Expression
number
, ptr: Expression
, value: Expression
): Expression
number
, ptr: Expression
, value: Expression
): Expression
number
, ptr: Expression
, value: Expression
): Expression
number
, ptr: Expression
, value: Expression
): Expression
number
, ptr: Expression
, value: Expression
): Expression
number
, ptr: Expression
, expected: Expression
, replacement: Expression
): Expression
number
, ptr: Expression
, value: Expression
): Expression
number
, ptr: Expression
, value: Expression
): Expression
number
, ptr: Expression
, value: Expression
): Expression
number
, ptr: Expression
, value: Expression
): Expression
number
, ptr: Expression
, value: Expression
): Expression
number
, ptr: Expression
, value: Expression
): Expression
number
, ptr: Expression
, expected: Expression
, replacement: Expression
): Expression
number
, ptr: Expression
, value: Expression
): Expression
number
, ptr: Expression
, value: Expression
): Expression
number
, ptr: Expression
, value: Expression
): Expression
number
, ptr: Expression
, value: Expression
): Expression
number
, ptr: Expression
, value: Expression
): Expression
number
, ptr: Expression
, value: Expression
): Expression
number
, ptr: Expression
, expected: Expression
, replacement: Expression
): Expression
number
, ptr: Expression
, value: Expression
): Expression
number
, ptr: Expression
, value: Expression
): Expression
number
, ptr: Expression
, value: Expression
): Expression
number
, ptr: Expression
, value: Expression
): Expression
number
, ptr: Expression
, value: Expression
): Expression
number
, ptr: Expression
, value: Expression
): Expression
number
, ptr: Expression
, expected: Expression
, replacement: Expression
): Expression
number
, ptr: Expression
, value: Expression
): Expression
number
, ptr: Expression
, value: Expression
): Expression
number
, ptr: Expression
, value: Expression
): Expression
number
, ptr: Expression
, value: Expression
): Expression
number
, ptr: Expression
, value: Expression
): Expression
number
, ptr: Expression
, value: Expression
): Expression
number
, ptr: Expression
, expected: Expression
, replacement: Expression
): Expression
number
, ptr: Expression
, value: Expression
): Expression
number
, ptr: Expression
, value: Expression
): Expression
number
, ptr: Expression
, value: Expression
): Expression
number
, ptr: Expression
, value: Expression
): Expression
number
, ptr: Expression
, value: Expression
): Expression
number
, ptr: Expression
, value: Expression
): Expression
number
, ptr: Expression
, expected: Expression
, replacement: Expression
): Expression
Expression
, expected: Expression
, timeout: Expression
): Expression
Expression
, expected: Expression
, timeout: Expression
): Expression
Expression
, wakeCount: Expression
): Expression
Expression
): Expression
Expression
): Expression
Expression
): Expression
Expression
): Expression
Expression
): Expression
getExpressionId(expr: Expression
): ExpressionId
Gets the id (kind) of the specified expression. Possible values are:
ExpressionId
ExpressionId
ExpressionId
ExpressionId
ExpressionId
ExpressionId
ExpressionId
ExpressionId
ExpressionId
ExpressionId
ExpressionId
ExpressionId
ExpressionId
ExpressionId
ExpressionId
ExpressionId
ExpressionId
ExpressionId
ExpressionId
ExpressionId
ExpressionId
ExpressionId
ExpressionId
ExpressionId
ExpressionId
ExpressionId
ExpressionId
ExpressionId
getExpressionType(expr: Expression
): Type
Gets the type of the specified expression.
getExpressionInfo(expr: Expression
): ExpressionInfo
Obtains information about an expression, always including:
ExpressionId
Type
Additional properties depend on the expression's id
and are usually equivalent to the respective parameters when creating such an expression:
string
Expression[]
Expression
Expression
Expression | null
string
Expression
string
Expression | null
Expression | null
string[]
string | null
Expression
Expression | null
string
Expression[]
string
Expression[]
Expression
Expression[]
number
boolean
number
Expression
string
string
Expression
boolean
boolean
number
number
number
Expression
boolean
number
number
number
Expression
Expression
number | { low: number, high: number }
number
Expression
number
Expression
Expression
Expression
Expression
Expression
Expression
Expression | null
number
string | null
Expression[]
number
number
number
Expression
Expression
number
number
Expression
Expression
Expression
Expression
Expression
Expression
Type
Expression
Expression
NopInfo and UnreachableInfo do not include any additional properties.
new Relooper(): Relooper
Constructs a relooper instance. This lets you provide an arbitrary CFG, and the relooper will structure it for WebAssembly.
Relooper#addBlock(code: Expression
): RelooperBlock
Adds a new block to the CFG, containing the provided code as its body.
Relooper#addBranch(from: RelooperBlock
, to: RelooperBlock
, condition: Expression
, code: Expression
): void
Adds a branch from a block to another block, with a condition (or nothing, if this is the default branch to take from the origin - each block must have one such branch), and optional code to execute on the branch (useful for phis).
Relooper#addBlockWithSwitch(code: Expression
, condition: Expression
): RelooperBlock
Adds a new block, which ends with a switch/br_table, with provided code and condition (that determines where we go in the switch).
Relooper#addBranchForSwitch(from: RelooperBlock
, to: RelooperBlock
, indexes: number[]
, code: Expression
): void
Adds a branch from a block ending in a switch, to another block, using an array of indexes that determine where to go, and optional code to execute on the branch.
Relooper#renderAndDispose(entry: RelooperBlock
, labelHelper: number
, module: Module
): Expression
Renders and cleans up the Relooper instance. Call this after you have created all the blocks and branches, giving it the entry block (where control flow begins), a label helper variable (an index of a local we can use, necessary for irreducible control flow), and the module. This returns an expression - normal WebAssembly code - that you can use normally anywhere.
Module#addDebugInfoFileName(filename: string
): number
Adds a debug info file name to the module and returns its index.
Module#getDebugInfoFileName(index: number
): string | null
Gets the name of the debug info file at the specified index.
Module#setDebugLocation(func: Function
, expr: Expression
, fileIndex: number
, lineNumber: number
, columnNumber: number
): void
Sets the debug location of the specified Expression
within the specified Function
.
Module#setAPITracing(on: boolean
): void
Enables tracing of the C-API in the console. Can be very useful when filing bug reports.
Module#interpret(): void
Runs the module in the interpreter, calling the start function.
Clone the GitHub repository including submodules and install the development dependencies:
$> git clone --recursive https://github.com/AssemblyScript/binaryen.js.git
$> cd binaryen.js
$> npm install
Make sure Emscripten is properly set up on your system.
Afterwards, to build the binaryen
submodule to index.js
, run:
$> npm run build
To run the tests, do:
$> npm test
© 2010 - cnpmjs.org x YWFE | Home | YWFE