binaryen.js
===========
**binaryen.js** is a port of [Binaryen](https://github.com/WebAssembly/binaryen) to the Web, allowing you to generate WebAssembly using a JavaScript API.
[](https://www.npmjs.com/package/binaryen) [](https://www.npmjs.com/package/binaryen) [](https://travis-ci.org/AssemblyScript/binaryen.js)
Usage
-----
```
$> npm install binaryen
```
```js
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](https://github.com/AssemblyScript/binaryen.js/tags) instead if necessary.
### Usage with a CDN
* From GitHub via [jsDelivr](https://www.jsdelivr.com):
`https://cdn.jsdelivr.net/gh/AssemblyScript/binaryen.js@VERSION/index.js`
* From npm via [jsDelivr](https://www.jsdelivr.com):
`https://cdn.jsdelivr.net/npm/binaryen@VERSION/index.js`
* From npm via [UNPKG](https://unpkg.com):
`https://unpkg.com/binaryen@VERSION/index.js`
Replace `VERSION` with a [specific version](https://github.com/AssemblyScript/binaryen.js/releases) or omit it (not recommended in production) to use master/latest.
API
---
### Contents
- [Types](#types)
- [Module construction](#module-construction)
- [Module manipulation](#module-manipulation)
- [Module validation](#module-validation)
- [Module optimization](#module-optimization)
- [Module creation](#module-creation)
- [Expression construction](#expression-construction)
- [Control flow](#control-flow)
- [Constants](#constants)
- [Variable accesses](#variable-accesses)
- [Integer operations](#integer-operations)
- [Floating point operations](#floating-point-operations)
- [Datatype conversions](#datatype-conversions)
- [Function calls](#function-calls)
- [Linear memory accesses](#linear-memory-accesses)
- [Host operations](#host-operations)
- [Atomic memory accesses 🦄](#atomic-memory-accesses-)
- [Atomic read-modify-write operations 🦄](#atomic-read-modify-write-operations-)
- [Atomic wait and wake operations 🦄](#atomic-wait-and-wake-operations-)
- [Sign extension operations 🦄](#sign-extension-operations-)
- [Expression manipulation](#expression-manipulation)
- [Relooper](#relooper)
- [Source maps](#source-maps)
- [Debugging](#debugging)
[Future features](http://webassembly.org/docs/future-features/) 🦄 might not be supported by all runtimes.
### Types
* **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.
### Module construction
* 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 manipulation
* 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.
* FunctionTypeInfo#**name**: `string | null`
* FunctionTypeInfo#**params**: `Type[]`
* FunctionTypeInfo#**result**: `Type`
* **getFunctionInfo**(ftype: `Function`: `FunctionInfo`
Obtains information about a function.
* FunctionInfo#**name**: `string`
* FunctionInfo#**module**: `string | null` (if imported)
* FunctionInfo#**base**: `string | null` (if imported)
* FunctionInfo#**type**: `FunctionType`
* FunctionInfo#**params**: `Type[]`
* FunctionInfo#**result**: `Type`
* FunctionInfo#**vars**: `Type`
* FunctionInfo#**body**: `Expression`
* **getGlobalInfo**(global: `Global`): `GlobalInfo`
Obtains information about a global.
* GlobalInfo#**name**: `string`
* GlobalInfo#**module**: `string | null` (if imported)
* GlobalInfo#**base**: `string | null` (if imported)
* GlobalInfo#**type**: `Type`
* GlobalInfo#**mutable**: `boolean`
* GlobalInfo#**init**: `Expression`
* **getExportInfo**(export_: `Export`): `ExportInfo`
Obtains information about an export.
* ExportInfo#**kind**: `ExternalKind`
* ExportInfo#**name**: `string`
* ExportInfo#**value**: `string`
Possible `ExternalKind` values are:
* **ExternalFunction**: `ExternalKind`
* **ExternalTable**: `ExternalKind`
* **ExternalMemory**: `ExternalKind`
* **ExternalGlobal**: `ExternalKind`
### Module validation
* Module#**validate**(): `boolean`
Validates the module. Returns `true` if valid, otherwise prints validation errors and returns `false`.
### Module optimization
* 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 creation
* 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.
* BinaryWithSourceMap#**binary**: `Uint8Array`
* BinaryWithSourceMap#**sourceMap**: `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](http://asmjs.org/) representation of the module.
* Module#**dispose**(): `void`
Releases the resources held by the module once it isn't needed anymore.
### Expression construction
#### [Control flow](http://webassembly.org/docs/semantics/#control-constructs-and-instructions)
* 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](http://webassembly.org/docs/semantics/#unreachable) instruction that will always trap.
* Module#**drop**(value: `Expression`): `Expression`
Creates a [drop](http://webassembly.org/docs/semantics/#type-parametric-operators) of a value.
* Module#**select**(condition: `Expression`, ifTrue: `Expression`, ifFalse: `Expression`): `Expression`
Creates a [select](http://webassembly.org/docs/semantics/#type-parametric-operators) of one of two values.
#### [Constants](http://webassembly.org/docs/semantics/#constants)
* Module#i32.**const**(value: `number`): `Expression`
>
* Module#i64.**const**(low: `number`, high: `number`): `Expression`
>
* Module#f32.**const**(value: `number`): `Expression`
* Module#f32.**const_bits**(value: `number`): `Expression`
>
* Module#f64.**const**(value: `number`): `Expression`
* Module#f64.**const_bits**(low: `number`, high: `number`): `Expression`
#### [Variable accesses](http://webassembly.org/docs/semantics/#local-variables)
* 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.
#### [Integer operations](http://webassembly.org/docs/semantics/#32-bit-integer-operators)
* Module#i32.**clz**(value: `Expression`): `Expression`
* Module#i32.**ctz**(value: `Expression`): `Expression`
* Module#i32.**popcnt**(value: `Expression`): `Expression`
* Module#i32.**eqz**(value: `Expression`): `Expression`
* Module#i32.**add**(left: `Expression`, right: `Expression`): `Expression`
* Module#i32.**sub**(left: `Expression`, right: `Expression`): `Expression`
* Module#i32.**mul**(left: `Expression`, right: `Expression`): `Expression`
* Module#i32.**div_s**(left: `Expression`, right: `Expression`): `Expression`
* Module#i32.**div_u**(left: `Expression`, right: `Expression`): `Expression`
* Module#i32.**rem_s**(left: `Expression`, right: `Expression`): `Expression`
* Module#i32.**rem_u**(left: `Expression`, right: `Expression`): `Expression`
* Module#i32.**and**(left: `Expression`, right: `Expression`): `Expression`
* Module#i32.**or**(left: `Expression`, right: `Expression`): `Expression`
* Module#i32.**xor**(left: `Expression`, right: `Expression`): `Expression`
* Module#i32.**shl**(left: `Expression`, right: `Expression`): `Expression`
* Module#i32.**shr_u**(left: `Expression`, right: `Expression`): `Expression`
* Module#i32.**shr_s**(left: `Expression`, right: `Expression`): `Expression`
* Module#i32.**rotl**(left: `Expression`, right: `Expression`): `Expression`
* Module#i32.**rotr**(left: `Expression`, right: `Expression`): `Expression`
* Module#i32.**eq**(left: `Expression`, right: `Expression`): `Expression`
* Module#i32.**ne**(left: `Expression`, right: `Expression`): `Expression`
* Module#i32.**lt_s**(left: `Expression`, right: `Expression`): `Expression`
* Module#i32.**lt_u**(left: `Expression`, right: `Expression`): `Expression`
* Module#i32.**le_s**(left: `Expression`, right: `Expression`): `Expression`
* Module#i32.**le_u**(left: `Expression`, right: `Expression`): `Expression`
* Module#i32.**gt_s**(left: `Expression`, right: `Expression`): `Expression`
* Module#i32.**gt_u**(left: `Expression`, right: `Expression`): `Expression`
* Module#i32.**ge_s**(left: `Expression`, right: `Expression`): `Expression`
* Module#i32.**ge_u**(left: `Expression`, right: `Expression`): `Expression`
>
* Module#i64.**clz**(value: `Expression`): `Expression`
* Module#i64.**ctz**(value: `Expression`): `Expression`
* Module#i64.**popcnt**(value: `Expression`): `Expression`
* Module#i64.**eqz**(value: `Expression`): `Expression`
* Module#i64.**add**(left: `Expression`, right: `Expression`): `Expression`
* Module#i64.**sub**(left: `Expression`, right: `Expression`): `Expression`
* Module#i64.**mul**(left: `Expression`, right: `Expression`): `Expression`
* Module#i64.**div_s**(left: `Expression`, right: `Expression`): `Expression`
* Module#i64.**div_u**(left: `Expression`, right: `Expression`): `Expression`
* Module#i64.**rem_s**(left: `Expression`, right: `Expression`): `Expression`
* Module#i64.**rem_u**(left: `Expression`, right: `Expression`): `Expression`
* Module#i64.**and**(left: `Expression`, right: `Expression`): `Expression`
* Module#i64.**or**(left: `Expression`, right: `Expression`): `Expression`
* Module#i64.**xor**(left: `Expression`, right: `Expression`): `Expression`
* Module#i64.**shl**(left: `Expression`, right: `Expression`): `Expression`
* Module#i64.**shr_u**(left: `Expression`, right: `Expression`): `Expression`
* Module#i64.**shr_s**(left: `Expression`, right: `Expression`): `Expression`
* Module#i64.**rotl**(left: `Expression`, right: `Expression`): `Expression`
* Module#i64.**rotr**(left: `Expression`, right: `Expression`): `Expression`
* Module#i64.**eq**(left: `Expression`, right: `Expression`): `Expression`
* Module#i64.**ne**(left: `Expression`, right: `Expression`): `Expression`
* Module#i64.**lt_s**(left: `Expression`, right: `Expression`): `Expression`
* Module#i64.**lt_u**(left: `Expression`, right: `Expression`): `Expression`
* Module#i64.**le_s**(left: `Expression`, right: `Expression`): `Expression`
* Module#i64.**le_u**(left: `Expression`, right: `Expression`): `Expression`
* Module#i64.**gt_s**(left: `Expression`, right: `Expression`): `Expression`
* Module#i64.**gt_u**(left: `Expression`, right: `Expression`): `Expression`
* Module#i64.**ge_s**(left: `Expression`, right: `Expression`): `Expression`
* Module#i64.**ge_u**(left: `Expression`, right: `Expression`): `Expression`
#### [Floating point operations](http://webassembly.org/docs/semantics/#floating-point-operators)
* Module#f32.**neg**(value: `Expression`): `Expression`
* Module#f32.**abs**(value: `Expression`): `Expression`
* Module#f32.**ceil**(value: `Expression`): `Expression`
* Module#f32.**floor**(value: `Expression`): `Expression`
* Module#f32.**trunc**(value: `Expression`): `Expression`
* Module#f32.**nearest**(value: `Expression`): `Expression`
* Module#f32.**sqrt**(value: `Expression`): `Expression`
* Module#f32.**add**(left: `Expression`, right: `Expression`): `Expression`
* Module#f32.**sub**(left: `Expression`, right: `Expression`): `Expression`
* Module#f32.**mul**(left: `Expression`, right: `Expression`): `Expression`
* Module#f32.**div**(left: `Expression`, right: `Expression`): `Expression`
* Module#f32.**copysign**(left: `Expression`, right: `Expression`): `Expression`
* Module#f32.**min**(left: `Expression`, right: `Expression`): `Expression`
* Module#f32.**max**(left: `Expression`, right: `Expression`): `Expression`
* Module#f32.**eq**(left: `Expression`, right: `Expression`): `Expression`
* Module#f32.**ne**(left: `Expression`, right: `Expression`): `Expression`
* Module#f32.**lt**(left: `Expression`, right: `Expression`): `Expression`
* Module#f32.**le**(left: `Expression`, right: `Expression`): `Expression`
* Module#f32.**gt**(left: `Expression`, right: `Expression`): `Expression`
* Module#f32.**ge**(left: `Expression`, right: `Expression`): `Expression`
>
* Module#f64.**neg**(value: `Expression`): `Expression`
* Module#f64.**abs**(value: `Expression`): `Expression`
* Module#f64.**ceil**(value: `Expression`): `Expression`
* Module#f64.**floor**(value: `Expression`): `Expression`
* Module#f64.**trunc**(value: `Expression`): `Expression`
* Module#f64.**nearest**(value: `Expression`): `Expression`
* Module#f64.**sqrt**(value: `Expression`): `Expression`
* Module#f64.**add**(left: `Expression`, right: `Expression`): `Expression`
* Module#f64.**sub**(left: `Expression`, right: `Expression`): `Expression`
* Module#f64.**mul**(left: `Expression`, right: `Expression`): `Expression`
* Module#f64.**div**(left: `Expression`, right: `Expression`): `Expression`
* Module#f64.**copysign**(left: `Expression`, right: `Expression`): `Expression`
* Module#f64.**min**(left: `Expression`, right: `Expression`): `Expression`
* Module#f64.**max**(left: `Expression`, right: `Expression`): `Expression`
* Module#f64.**eq**(left: `Expression`, right: `Expression`): `Expression`
* Module#f64.**ne**(left: `Expression`, right: `Expression`): `Expression`
* Module#f64.**lt**(left: `Expression`, right: `Expression`): `Expression`
* Module#f64.**le**(left: `Expression`, right: `Expression`): `Expression`
* Module#f64.**gt**(left: `Expression`, right: `Expression`): `Expression`
* Module#f64.**ge**(left: `Expression`, right: `Expression`): `Expression`
#### [Datatype conversions](http://webassembly.org/docs/semantics/#datatype-conversions-truncations-reinterpretations-promotions-and-demotions)
* Module#i32.**trunc_s.f32**(value: `Expression`): `Expression`
* Module#i32.**trunc_s.f64**(value: `Expression`): `Expression`
* Module#i32.**trunc_u.f32**(value: `Expression`): `Expression`
* Module#i32.**trunc_u.f64**(value: `Expression`): `Expression`
* Module#i32.**reinterpret**(value: `Expression`): `Expression`
* Module#i32.**wrap**(value: `Expression`): `Expression`
>
* Module#i64.**trunc_s.f32**(value: `Expression`): `Expression`
* Module#i64.**trunc_s.f64**(value: `Expression`): `Expression`
* Module#i64.**trunc_u.f32**(value: `Expression`): `Expression`
* Module#i64.**trunc_u.f64**(value: `Expression`): `Expression`
* Module#i64.**reinterpret**(value: `Expression`): `Expression`
* Module#i64.**extend_s**(value: `Expression`): `Expression`
* Module#i64.**extend_u**(value: `Expression`): `Expression`
>
* Module#f32.**reinterpret**(value: `Expression`): `Expression`
* Module#f32.**convert_s.i32**(value: `Expression`): `Expression`
* Module#f32.**convert_s.i64**(value: `Expression`): `Expression`
* Module#f32.**convert_u.i32**(value: `Expression`): `Expression`
* Module#f32.**convert_u.i64**(value: `Expression`): `Expression`
* Module#f32.**demote**(value: `Expression`): `Expression`
>
* Module#f64.**reinterpret**(value: `Expression`): `Expression`
* Module#f64.**convert_s.i32**(value: `Expression`): `Expression`
* Module#f64.**convert_s.i64**(value: `Expression`): `Expression`
* Module#f64.**convert_u.i32**(value: `Expression`): `Expression`
* Module#f64.**convert_u.i64**(value: `Expression`): `Expression`
* Module#f64.**promote**(value: `Expression`): `Expression`
#### [Function calls](http://webassembly.org/docs/semantics/#calls)
* 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.
#### [Linear memory accesses](http://webassembly.org/docs/semantics/#linear-memory-accesses)
* Module#i32.**load**(offset: `number`, align: `number`, ptr: `Expression`): `Expression`
* Module#i32.**load8_s**(offset: `number`, align: `number`, ptr: `Expression`): `Expression`
* Module#i32.**load8_u**(offset: `number`, align: `number`, ptr: `Expression`): `Expression`
* Module#i32.**load16_s**(offset: `number`, align: `number`, ptr: `Expression`): `Expression`
* Module#i32.**load16_u**(offset: `number`, align: `number`, ptr: `Expression`): `Expression`
* Module#i32.**store**(offset: `number`, align: `number`, ptr: `Expression`, value: `Expression`): `Expression`
* Module#i32.**store8**(offset: `number`, align: `number`, ptr: `Expression`, value: `Expression`): `Expression`
* Module#i32.**store16**(offset: `number`, align: `number`, ptr: `Expression`, value: `Expression`): `Expression`
>
* Module#i64.**load**(offset: `number`, align: `number`, ptr: `Expression`): `Expression`
* Module#i64.**load8_s**(offset: `number`, align: `number`, ptr: `Expression`): `Expression`
* Module#i64.**load8_u**(offset: `number`, align: `number`, ptr: `Expression`): `Expression`
* Module#i64.**load16_s**(offset: `number`, align: `number`, ptr: `Expression`): `Expression`
* Module#i64.**load16_u**(offset: `number`, align: `number`, ptr: `Expression`): `Expression`
* Module#i64.**load32_s**(offset: `number`, align: `number`, ptr: `Expression`): `Expression`
* Module#i64.**load32_u**(offset: `number`, align: `number`, ptr: `Expression`): `Expression`
* Module#i64.**store**(offset: `number`, align: `number`, ptr: `Expression`, value: `Expression`): `Expression`
* Module#i64.**store8**(offset: `number`, align: `number`, ptr: `Expression`, value: `Expression`): `Expression`
* Module#i64.**store16**(offset: `number`, align: `number`, ptr: `Expression`, value: `Expression`): `Expression`
* Module#i64.**store32**(offset: `number`, align: `number`, ptr: `Expression`, value: `Expression`): `Expression`
>
* Module#f32.**load**(offset: `number`, align: `number`, ptr: `Expression`): `Expression`
* Module#f32.**store**(offset: `number`, align: `number`, ptr: `Expression`, value: `Expression`): `Expression`
>
* Module#f64.**load**(offset: `number`, align: `number`, ptr: `Expression`): `Expression`
* Module#f64.**store**(offset: `number`, align: `number`, ptr: `Expression`, value: `Expression`): `Expression`
#### [Host operations](http://webassembly.org/docs/semantics/#resizing)
* Module#**memory.size**(): `Expression`
* Module#**memory.grow**(value: `number`): `Expression`
#### [Atomic memory accesses](https://github.com/WebAssembly/threads/blob/master/proposals/threads/Overview.md#atomic-memory-accesses) 🦄
* Module#i32.**atomic.load**(offset: `number`, ptr: `Expression`): `Expression`
* Module#i32.**atomic.load8_u**(offset: `number`, ptr: `Expression`): `Expression`
* Module#i32.**atomic.load16_u**(offset: `number`, ptr: `Expression`): `Expression`
* Module#i32.**atomic.store**(offset: `number`, ptr: `Expression`, value: `Expression`): `Expression`
* Module#i32.**atomic.store8**(offset: `number`, ptr: `Expression`, value: `Expression`): `Expression`
* Module#i32.**atomic.store16**(offset: `number`, ptr: `Expression`, value: `Expression`): `Expression`
>
* Module#i64.**atomic.load**(offset: `number`, ptr: `Expression`): `Expression`
* Module#i64.**atomic.load8_u**(offset: `number`, ptr: `Expression`): `Expression`
* Module#i64.**atomic.load16_u**(offset: `number`, ptr: `Expression`): `Expression`
* Module#i64.**atomic.load32_u**(offset: `number`, ptr: `Expression`): `Expression`
* Module#i64.**atomic.store**(offset: `number`, ptr: `Expression`, value: `Expression`): `Expression`
* Module#i64.**atomic.store8**(offset: `number`, ptr: `Expression`, value: `Expression`): `Expression`
* Module#i64.**atomic.store16**(offset: `number`, ptr: `Expression`, value: `Expression`): `Expression`
* Module#i64.**atomic.store32**(offset: `number`, ptr: `Expression`, value: `Expression`): `Expression`
#### [Atomic read-modify-write operations](https://github.com/WebAssembly/threads/blob/master/proposals/threads/Overview.md#read-modify-write) 🦄
* Module#i32.**atomic.rmw.add**(offset: `number`, ptr: `Expression`, value: `Expression`): `Expression`
* Module#i32.**atomic.rmw.sub**(offset: `number`, ptr: `Expression`, value: `Expression`): `Expression`
* Module#i32.**atomic.rmw.and**(offset: `number`, ptr: `Expression`, value: `Expression`): `Expression`
* Module#i32.**atomic.rmw.or**(offset: `number`, ptr: `Expression`, value: `Expression`): `Expression`
* Module#i32.**atomic.rmw.xor**(offset: `number`, ptr: `Expression`, value: `Expression`): `Expression`
* Module#i32.**atomic.rmw.xchg**(offset: `number`, ptr: `Expression`, value: `Expression`): `Expression`
* Module#i32.**atomic.rmw.cmpxchg**(offset: `number`, ptr: `Expression`, expected: `Expression`, replacement: `Expression`): `Expression`
* Module#i32.**atomic.rmw8_u.add**(offset: `number`, ptr: `Expression`, value: `Expression`): `Expression`
* Module#i32.**atomic.rmw8_u.sub**(offset: `number`, ptr: `Expression`, value: `Expression`): `Expression`
* Module#i32.**atomic.rmw8_u.and**(offset: `number`, ptr: `Expression`, value: `Expression`): `Expression`
* Module#i32.**atomic.rmw8_u.or**(offset: `number`, ptr: `Expression`, value: `Expression`): `Expression`
* Module#i32.**atomic.rmw8_u.xor**(offset: `number`, ptr: `Expression`, value: `Expression`): `Expression`
* Module#i32.**atomic.rmw8_u.xchg**(offset: `number`, ptr: `Expression`, value: `Expression`): `Expression`
* Module#i32.**atomic.rmw8_u.cmpxchg**(offset: `number`, ptr: `Expression`, expected: `Expression`, replacement: `Expression`): `Expression`
* Module#i32.**atomic.rmw16_u.add**(offset: `number`, ptr: `Expression`, value: `Expression`): `Expression`
* Module#i32.**atomic.rmw16_u.sub**(offset: `number`, ptr: `Expression`, value: `Expression`): `Expression`
* Module#i32.**atomic.rmw16_u.and**(offset: `number`, ptr: `Expression`, value: `Expression`): `Expression`
* Module#i32.**atomic.rmw16_u.or**(offset: `number`, ptr: `Expression`, value: `Expression`): `Expression`
* Module#i32.**atomic.rmw16_u.xor**(offset: `number`, ptr: `Expression`, value: `Expression`): `Expression`
* Module#i32.**atomic.rmw16_u.xchg**(offset: `number`, ptr: `Expression`, value: `Expression`): `Expression`
* Module#i32.**atomic.rmw16_u.cmpxchg**(offset: `number`, ptr: `Expression`, expected: `Expression`, replacement: `Expression`): `Expression`
>
* Module#i64.**atomic.rmw.add**(offset: `number`, ptr: `Expression`, value: `Expression`): `Expression`
* Module#i64.**atomic.rmw.sub**(offset: `number`, ptr: `Expression`, value: `Expression`): `Expression`
* Module#i64.**atomic.rmw.and**(offset: `number`, ptr: `Expression`, value: `Expression`): `Expression`
* Module#i64.**atomic.rmw.or**(offset: `number`, ptr: `Expression`, value: `Expression`): `Expression`
* Module#i64.**atomic.rmw.xor**(offset: `number`, ptr: `Expression`, value: `Expression`): `Expression`
* Module#i64.**atomic.rmw.xchg**(offset: `number`, ptr: `Expression`, value: `Expression`): `Expression`
* Module#i64.**atomic.rmw.cmpxchg**(offset: `number`, ptr: `Expression`, expected: `Expression`, replacement: `Expression`): `Expression`
* Module#i64.**atomic.rmw8_u.add**(offset: `number`, ptr: `Expression`, value: `Expression`): `Expression`
* Module#i64.**atomic.rmw8_u.sub**(offset: `number`, ptr: `Expression`, value: `Expression`): `Expression`
* Module#i64.**atomic.rmw8_u.and**(offset: `number`, ptr: `Expression`, value: `Expression`): `Expression`
* Module#i64.**atomic.rmw8_u.or**(offset: `number`, ptr: `Expression`, value: `Expression`): `Expression`
* Module#i64.**atomic.rmw8_u.xor**(offset: `number`, ptr: `Expression`, value: `Expression`): `Expression`
* Module#i64.**atomic.rmw8_u.xchg**(offset: `number`, ptr: `Expression`, value: `Expression`): `Expression`
* Module#i64.**atomic.rmw8_u.cmpxchg**(offset: `number`, ptr: `Expression`, expected: `Expression`, replacement: `Expression`): `Expression`
* Module#i64.**atomic.rmw16_u.add**(offset: `number`, ptr: `Expression`, value: `Expression`): `Expression`
* Module#i64.**atomic.rmw16_u.sub**(offset: `number`, ptr: `Expression`, value: `Expression`): `Expression`
* Module#i64.**atomic.rmw16_u.and**(offset: `number`, ptr: `Expression`, value: `Expression`): `Expression`
* Module#i64.**atomic.rmw16_u.or**(offset: `number`, ptr: `Expression`, value: `Expression`): `Expression`
* Module#i64.**atomic.rmw16_u.xor**(offset: `number`, ptr: `Expression`, value: `Expression`): `Expression`
* Module#i64.**atomic.rmw16_u.xchg**(offset: `number`, ptr: `Expression`, value: `Expression`): `Expression`
* Module#i64.**atomic.rmw16_u.cmpxchg**(offset: `number`, ptr: `Expression`, expected: `Expression`, replacement: `Expression`): `Expression`
* Module#i64.**atomic.rmw32_u.add**(offset: `number`, ptr: `Expression`, value: `Expression`): `Expression`
* Module#i64.**atomic.rmw32_u.sub**(offset: `number`, ptr: `Expression`, value: `Expression`): `Expression`
* Module#i64.**atomic.rmw32_u.and**(offset: `number`, ptr: `Expression`, value: `Expression`): `Expression`
* Module#i64.**atomic.rmw32_u.or**(offset: `number`, ptr: `Expression`, value: `Expression`): `Expression`
* Module#i64.**atomic.rmw32_u.xor**(offset: `number`, ptr: `Expression`, value: `Expression`): `Expression`
* Module#i64.**atomic.rmw32_u.xchg**(offset: `number`, ptr: `Expression`, value: `Expression`): `Expression`
* Module#i64.**atomic.rmw32_u.cmpxchg**(offset: `number`, ptr: `Expression`, expected: `Expression`, replacement: `Expression`): `Expression`
#### [Atomic wait and wake operations](https://github.com/WebAssembly/threads/blob/master/proposals/threads/Overview.md#wait-and-wake-operators) 🦄
* Module#i32.**wait**(ptr: `Expression`, expected: `Expression`, timeout: `Expression`): `Expression`
* Module#i64.**wait**(ptr: `Expression`, expected: `Expression`, timeout: `Expression`): `Expression`
* Module#**wake**(ptr: `Expression`, wakeCount: `Expression`): `Expression`
#### [Sign extension operations](https://github.com/WebAssembly/sign-extension-ops/blob/master/proposals/sign-extension-ops/Overview.md) 🦄
* Module#i32.**extend8_s**(value: `Expression`): `Expression`
* Module#i32.**extend16_s**(value: `Expression`): `Expression`
>
* Module#i64.**extend8_s**(value: `Expression`): `Expression`
* Module#i64.**extend16_s**(value: `Expression`): `Expression`
* Module#i64.**extend32_s**(value: `Expression`): `Expression`
### Expression manipulation
* **getExpressionId**(expr: `Expression`): `ExpressionId`
Gets the id (kind) of the specified expression. Possible values are:
* **InvalidId**: `ExpressionId`
* **BlockId**: `ExpressionId`
* **IfId**: `ExpressionId`
* **LoopId**: `ExpressionId`
* **BreakId**: `ExpressionId`
* **SwitchId**: `ExpressionId`
* **CallId**: `ExpressionId`
* **CallImportId**: `ExpressionId`
* **CallIndirectId**: `ExpressionId`
* **LocalGetId**: `ExpressionId`
* **LocalSetId**: `ExpressionId`
* **GlobalGetId**: `ExpressionId`
* **GlobalSetId**: `ExpressionId`
* **LoadId**: `ExpressionId`
* **StoreId**: `ExpressionId`
* **ConstId**: `ExpressionId`
* **UnaryId**: `ExpressionId`
* **BinaryId**: `ExpressionId`
* **SelectId**: `ExpressionId`
* **DropId**: `ExpressionId`
* **ReturnId**: `ExpressionId`
* **HostId**: `ExpressionId`
* **NopId**: `ExpressionId`
* **UnreachableId**: `ExpressionId`
* **AtomicCmpxchgId**: `ExpressionId`
* **AtomicRMWId**: `ExpressionId`
* **AtomicWaitId**: `ExpressionId`
* **AtomicWakeId**: `ExpressionId`
* **getExpressionType**(expr: `Expression`): `Type`
Gets the type of the specified expression.
* **getExpressionInfo**(expr: `Expression`): `ExpressionInfo`
Obtains information about an expression, always including:
* Info#**id**: `ExpressionId`
* Info#**type**: `Type`
Additional properties depend on the expression's `id` and are usually equivalent to the respective parameters when creating such an expression:
* BlockInfo#**name**: `string`
* BlockInfo#**children**: `Expression[]`
>
* IfInfo#**condition**: `Expression`
* IfInfo#**ifTrue**: `Expression`
* IfInfo#**ifFalse**: `Expression | null`
>
* LoopInfo#**name**: `string`
* LoopInfo#**body**: `Expression`
>
* BreakInfo#**name**: `string`
* BreakInfo#**condition**: `Expression | null`
* BreakInfo#**value**: `Expression | null`
>
* SwitchInfo#**names**: `string[]`
* SwitchInfo#**defaultName**: `string | null`
* SwitchInfo#**condition**: `Expression`
* SwitchInfo#**value**: `Expression | null`
>
* CallInfo#**target**: `string`
* CallInfo#**operands**: `Expression[]`
>
* CallImportInfo#**target**: `string`
* CallImportInfo#**operands**: `Expression[]`
>
* CallIndirectInfo#**target**: `Expression`
* CallIndirectInfo#**operands**: `Expression[]`
>
* LocalGetInfo#**index**: `number`
>
* LocalSetInfo#**isTee**: `boolean`
* LocalSetInfo#**index**: `number`
* LocalSetInfo#**value**: `Expression`
>
* GlobalGetInfo#**name**: `string`
>
* GlobalSetInfo#**name**: `string`
* GlobalSetInfo#**value**: `Expression`
>
* LoadInfo#**isAtomic**: `boolean`
* LoadInfo#**isSigned**: `boolean`
* LoadInfo#**offset**: `number`
* LoadInfo#**bytes**: `number`
* LoadInfo#**align**: `number`
* LoadInfo#**ptr**: `Expression`
>
* StoreInfo#**isAtomic**: `boolean`
* StoreInfo#**offset**: `number`
* StoreInfo#**bytes**: `number`
* StoreInfo#**align**: `number`
* StoreInfo#**ptr**: `Expression`
* StoreInfo#**value**: `Expression`
>
* ConstInfo#**value**: `number | { low: number, high: number }`
>
* UnaryInfo#**op**: `number`
* UnaryInfo#**value**: `Expression`
>
* BinaryInfo#**op**: `number`
* BinaryInfo#**left**: `Expression`
* BinaryInfo#**right**: `Expression`
>
* SelectInfo#**ifTrue**: `Expression`
* SelectInfo#**ifFalse**: `Expression`
* SelectInfo#**condition**: `Expression`
>
* DropInfo#**value**: `Expression`
>
* ReturnInfo#**value**: `Expression | null`
>
* HostInfo#**op**: `number`
* HostInfo#**nameOperand**: `string | null`
* HostInfo#**operands**: `Expression[]`
>
* AtomicRMWInfo#**op**: `number`
* AtomicRMWInfo#**bytes**: `number`
* AtomicRMWInfo#**offset**: `number`
* AtomicRMWInfo#**ptr**: `Expression`
* AtomicRMWInfo#**value**: `Expression`
>
* AtomicCmpxchgInfo#**bytes**: `number`
* AtomicCmpxchgInfo#**offset**: `number`
* AtomicCmpxchgInfo#**ptr**: `Expression`
* AtomicCmpxchgInfo#**expected**: `Expression`
* AtomicCmpxchgInfo#**replacement**: `Expression`
>
* AtomicWaitInfo#**ptr**: `Expression`
* AtomicWaitInfo#**expected**: `Expression`
* AtomicWaitInfo#**timeout**: `Expression`
* AtomicWaitInfo#**expectedType**: `Type`
>
* AtomicWakeInfo#**ptr**: `Expression`
* AtomicWakeInfo#**wakeCount**: `Expression`
NopInfo and UnreachableInfo do not include any additional properties.
### Relooper
* 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.
### Source maps
* 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`.
### Debugging
* 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.
Building
--------
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](https://github.com/kripken/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](./tests), do:
```
$> npm test
```