Skip to content

Update Binaryen for 2020 #1034

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 8 commits into from
Jan 1, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 38 additions & 0 deletions lib/sdk/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# ![AS](https://avatars1.githubusercontent.com/u/28916798?s=48) SDK

An overly simple SDK to use the AssemblyScript compiler on the web. This is built
to distribution files using the exact versions of the compiler and its
dependencies.

Expects [require.js](https://requirejs.org) (or compatible) on the web,
primarily targeting [WebAssembly Studio](https://webassembly.studio). Note that
consuming the source file in this directory directly does not solve any
versioning issues - use `dist/sdk.js` instead. Do not try to bundle this.

Exports
-------

* **binaryen**<br />
The version of binaryen required by the compiler.

* **assemblyscript**<br />
The AssemblyScript compiler as a library.

* **asc**<br />
AssemblyScript compiler frontend that one will interact with
([see](https://github.com/AssemblyScript/assemblyscript/tree/master/cli)).

Example usage
-------------

```js
require(
["https://cdn.jsdelivr.net/npm/assemblyscript@nightly/dist/sdk"],
function(sdk) {
const { binaryen, assemblyscript, asc } = sdk;
asc.ready.then(() => {
asc.main(...);
});
}
);
```
29 changes: 29 additions & 0 deletions lib/sdk/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
const BINARYEN_VERSION = "nightly";
const ASSEMBLYSCRIPT_VERSION = "nightly";

// AMD/require.js (browser)
if (typeof define === "function" && define.amd) {
const paths = {
"binaryen": "https://cdn.jsdelivr.net/npm/binaryen@" + BINARYEN_VERSION + "/index",
"assemblyscript": "https://cdn.jsdelivr.net/npm/assemblyscript@" + ASSEMBLYSCRIPT_VERSION + "/dist/assemblyscript",
"assemblyscript/cli/asc": "https://cdn.jsdelivr.net/npm/assemblyscript@" + ASSEMBLYSCRIPT_VERSION + "/dist/asc",
};
require.config({ paths });
define(Object.keys(paths), (binaryen, assemblyscript, asc) => ({
BINARYEN_VERSION,
ASSEMBLYSCRIPT_VERSION,
binaryen,
assemblyscript,
asc
}));

// CommonJS fallback (node)
} else if (typeof module === "object" && module.exports) {
module.exports = {
BINARYEN_VERSION,
ASSEMBLYSCRIPT_VERSION,
binaryen: require("binaryen"),
assemblyscript: require("assemblyscript"),
asc: require("assemblyscript/cli/asc")
};
}
17 changes: 17 additions & 0 deletions lib/sdk/tests/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js"></script>
<script>
function assert(x) {
if (!x) throw Error("assertion failed");
}
require(["../index"], function(sdk) {
const { BINARYEN_VERSION, ASSEMBLYSCRIPT_VERSION, binaryen, assemblyscript, asc } = sdk;
assert(typeof BINARYEN_VERSION === "string");
assert(typeof ASSEMBLYSCRIPT_VERSION === "string");
console.log("Binaryen@" + BINARYEN_VERSION);
console.log("AssemblyScript@" + ASSEMBLYSCRIPT_VERSION);
assert(typeof binaryen === "object" && binaryen && typeof binaryen._BinaryenTypeNone === "function");
assert(typeof assemblyscript === "object" && assemblyscript && typeof assemblyscript.parse === "function");
assert(typeof asc === "object" && asc && typeof asc.main === "function");
asc.ready.then(() => console.log("ready", sdk));
});
</script>
6 changes: 3 additions & 3 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 3 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
"url": "https://github.com/AssemblyScript/assemblyscript/issues"
},
"dependencies": {
"binaryen": "90.0.0-nightly.20191231",
"binaryen": "90.0.0-nightly.20200101",
"long": "^4.0.0",
"source-map-support": "^0.5.16",
"ts-node": "^6.2.0"
Expand All @@ -48,9 +48,10 @@
"asinit": "bin/asinit"
},
"scripts": {
"build": "npm run build:bundle && npm run build:dts",
"build": "npm run build:bundle && npm run build:dts && npm run build:sdk",
"build:bundle": "webpack --mode production --display-modules",
"build:dts": "node scripts/build-dts && tsc --noEmit --target ESNEXT --module commonjs --experimentalDecorators tests/require/index-release",
"build:sdk": "node scripts/build-sdk",
"clean": "node scripts/clean",
"check": "npm run check:config && npm run check:compiler && tsc --noEmit --target ESNEXT --module commonjs --experimentalDecorators tests/require/index",
"check:config": "tsc --noEmit -p src --diagnostics --listFiles",
Expand Down
13 changes: 13 additions & 0 deletions scripts/build-sdk.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
const path = require("path");
const fs = require("fs");
const pkg = require("../package.json");

fs.readFile(path.join(__dirname, "..", "lib", "sdk", "index.js"), "utf8", function(err, data) {
if (err) throw err;
data = data
.replace(/BINARYEN_VERSION = "nightly"/, "BINARYEN_VERSION = " + JSON.stringify(pkg.dependencies.binaryen))
.replace(/ASSEMBLYSCRIPT_VERSION = "nightly"/, "ASSEMBLYSCRIPT_VERSION = " + JSON.stringify(pkg.version));
fs.writeFile(path.join(__dirname, "..", "dist", "sdk.js"), data, function(err) {
if (err) throw err;
});
});
1 change: 1 addition & 0 deletions scripts/update-constants.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ binaryen.ready.then(() => {
var match = val.match(/\b(_Binaryen\w+)\b/);
if (match) {
let fn = match[1];
if (typeof binaryen[fn] !== "function") throw Error("API mismatch: Is Binaryen up to date?");
let id = binaryen[fn]();
console.log(fn + " = " + id);
return key + " = " + id + " /* " + fn + " */";
Expand Down
1 change: 0 additions & 1 deletion src/builtins.ts
Original file line number Diff line number Diff line change
Expand Up @@ -907,7 +907,6 @@ export function compileCall(
case TypeKind.USIZE: { value = "usize"; break; }
case TypeKind.V128: { value = "v128"; break; }
case TypeKind.ANYREF: { value = "anyref"; break; }
case TypeKind.EXNREF: { value = "exnref"; break; }
default: assert(false);
case TypeKind.VOID: { value = "void"; break; }
}
Expand Down
27 changes: 17 additions & 10 deletions src/compiler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7144,7 +7144,7 @@ export class Compiler extends DiagnosticEmitter {
this.currentType = signatureReference.type.asNullable();
return module.i32(0);
}
// TODO: anyref context yields <usize>0
return module.ref_null();
}
this.currentType = options.usizeType;
return options.isWasm64
Expand Down Expand Up @@ -7282,15 +7282,15 @@ export class Compiler extends DiagnosticEmitter {
}
case ElementKind.GLOBAL: {
if (!this.compileGlobal(<Global>target)) { // reports; not yet compiled if a static field
return this.module.unreachable();
return module.unreachable();
}
let type = (<Global>target).type;
assert(type != Type.void);
if ((<Global>target).is(CommonFlags.INLINED)) {
return this.compileInlineConstant(<Global>target, contextualType, constraints);
}
this.currentType = type;
return this.module.global_get((<Global>target).internalName, type.toNativeType());
return module.global_get((<Global>target).internalName, type.toNativeType());
}
case ElementKind.ENUMVALUE: { // here: if referenced from within the same enum
if (!target.is(CommonFlags.COMPILED)) {
Expand All @@ -7299,14 +7299,14 @@ export class Compiler extends DiagnosticEmitter {
expression.range
);
this.currentType = Type.i32;
return this.module.unreachable();
return module.unreachable();
}
this.currentType = Type.i32;
if ((<EnumValue>target).is(CommonFlags.INLINED)) {
assert((<EnumValue>target).constantValueKind == ConstantValueKind.INTEGER);
return this.module.i32(i64_low((<EnumValue>target).constantIntegerValue));
return module.i32(i64_low((<EnumValue>target).constantIntegerValue));
}
return this.module.global_get((<EnumValue>target).internalName, NativeType.I32);
return module.global_get((<EnumValue>target).internalName, NativeType.I32);
}
case ElementKind.FUNCTION_PROTOTYPE: {
let instance = this.resolver.resolveFunction(
Expand All @@ -7315,9 +7315,13 @@ export class Compiler extends DiagnosticEmitter {
makeMap<string,Type>(flow.contextualTypeArguments)
);
if (!(instance && this.compileFunction(instance))) return module.unreachable();
if (contextualType.is(TypeFlags.HOST | TypeFlags.REFERENCE)) {
this.currentType = Type.anyref;
return module.ref_func(instance.internalName);
}
let index = this.ensureFunctionTableEntry(instance);
this.currentType = instance.signature.type;
return this.module.i32(index);
return module.i32(index);
}
}
this.error(
Expand Down Expand Up @@ -9001,6 +9005,7 @@ export class Compiler extends DiagnosticEmitter {
case TypeKind.F32: return module.f32(0);
case TypeKind.F64: return module.f64(0);
case TypeKind.V128: return module.v128(v128_zero);
case TypeKind.ANYREF: return module.ref_null();
}
}

Expand Down Expand Up @@ -9099,9 +9104,11 @@ export class Compiler extends DiagnosticEmitter {
flow.freeTempLocal(temp);
return ret;
}
// case TypeKind.ANYREF: {
// TODO: !ref.is_null
// }
case TypeKind.ANYREF: {
// TODO: non-null object might still be considered falseish
// i.e. a ref to Boolean(false), Number(0), String("") etc.
return module.unary(UnaryOp.EqzI32, module.ref_is_null(expr));
}
default: {
assert(false);
return module.i32(0);
Expand Down
15 changes: 14 additions & 1 deletion src/glue/binaryen.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,9 @@ export declare function _BinaryenTypeInt64(): BinaryenType;
export declare function _BinaryenTypeFloat32(): BinaryenType;
export declare function _BinaryenTypeFloat64(): BinaryenType;
export declare function _BinaryenTypeVec128(): BinaryenType;
export declare function _BinaryenTypeFuncref(): BinaryenType;
export declare function _BinaryenTypeAnyref(): BinaryenType;
export declare function _BinaryenTypeNullref(): BinaryenType;
export declare function _BinaryenTypeExnref(): BinaryenType;
export declare function _BinaryenTypeUnreachable(): BinaryenType;
export declare function _BinaryenTypeAuto(): BinaryenType;
Expand Down Expand Up @@ -95,6 +97,9 @@ export declare function _BinaryenMemoryInitId(): BinaryenExpressionId;
export declare function _BinaryenDataDropId(): BinaryenExpressionId;
export declare function _BinaryenMemoryCopyId(): BinaryenExpressionId;
export declare function _BinaryenMemoryFillId(): BinaryenExpressionId;
export declare function _BinaryenRefNullId(): BinaryenExpressionId;
export declare function _BinaryenRefIsNullId(): BinaryenExpressionId;
export declare function _BinaryenRefFuncId(): BinaryenExpressionId;
export declare function _BinaryenTryId(): BinaryenExpressionId;
export declare function _BinaryenThrowId(): BinaryenExpressionId;
export declare function _BinaryenRethrowId(): BinaryenExpressionId;
Expand Down Expand Up @@ -468,7 +473,7 @@ export declare function _BinaryenStore(module: BinaryenModuleRef, bytes: u32, of
export declare function _BinaryenConst(module: BinaryenModuleRef, value: usize): BinaryenExpressionRef;
export declare function _BinaryenUnary(module: BinaryenModuleRef, op: BinaryenOp, value: BinaryenExpressionRef): BinaryenExpressionRef;
export declare function _BinaryenBinary(module: BinaryenModuleRef, op: BinaryenOp, left: BinaryenExpressionRef, right: BinaryenExpressionRef): BinaryenExpressionRef;
export declare function _BinaryenSelect(module: BinaryenModuleRef, condition: BinaryenExpressionRef, ifTrue: BinaryenExpressionRef, ifFalse: BinaryenExpressionRef): BinaryenExpressionRef;
export declare function _BinaryenSelect(module: BinaryenModuleRef, condition: BinaryenExpressionRef, ifTrue: BinaryenExpressionRef, ifFalse: BinaryenExpressionRef, type: BinaryenType): BinaryenExpressionRef;
export declare function _BinaryenDrop(module: BinaryenModuleRef, value: BinaryenExpressionRef): BinaryenExpressionRef;
export declare function _BinaryenReturn(module: BinaryenModuleRef, value: BinaryenExpressionRef): BinaryenExpressionRef;
export declare function _BinaryenHost(module: BinaryenModuleRef, op: BinaryenOp, name: usize | 0, operands: usize, numOperands: BinaryenIndex): BinaryenExpressionRef;
Expand All @@ -495,6 +500,10 @@ export declare function _BinaryenDataDrop(module: BinaryenModuleRef, segment: u3
export declare function _BinaryenMemoryCopy(module: BinaryenModuleRef, dest: BinaryenExpressionRef, source: BinaryenExpressionRef, size: BinaryenExpressionRef): BinaryenExpressionRef;
export declare function _BinaryenMemoryFill(module: BinaryenModuleRef, dest: BinaryenExpressionRef, value: BinaryenExpressionRef, size: BinaryenExpressionRef): BinaryenExpressionRef;

export declare function _BinaryenRefNull(module: BinaryenModuleRef): BinaryenExpressionRef;
export declare function _BinaryenRefIsNull(module: BinaryenModuleRef, value: BinaryenExpressionRef): BinaryenExpressionRef;
export declare function _BinaryenRefFunc(module: BinaryenModuleRef, funcName: usize): BinaryenExpressionRef;

export declare function _BinaryenTry(module: BinaryenModuleRef, body: BinaryenExpressionRef, catchBody: BinaryenExpressionRef): BinaryenExpressionRef;
export declare function _BinaryenThrow(module: BinaryenModuleRef, event: usize, operands: usize, numOperands: BinaryenIndex): BinaryenExpressionRef;
export declare function _BinaryenRethrow(module: BinaryenModuleRef, exnref: BinaryenExpressionRef): BinaryenExpressionRef;
Expand Down Expand Up @@ -651,6 +660,10 @@ export declare function _BinaryenMemoryFillGetDest(expr: BinaryenExpressionRef):
export declare function _BinaryenMemoryFillGetValue(expr: BinaryenExpressionRef): BinaryenExpressionRef;
export declare function _BinaryenMemoryFillGetSize(expr: BinaryenExpressionRef): BinaryenExpressionRef;

export declare function _BinaryenRefIsNullGetValue(expr: BinaryenExpressionRef): BinaryenExpressionRef;

export declare function _BinaryenRefFuncGetFunc(expr: BinaryenExpressionRef): usize;

export declare function _BinaryenTryGetBody(expr: BinaryenExpressionRef): BinaryenExpressionRef;
export declare function _BinaryenTryGetCatchBody(expr: BinaryenExpressionRef): BinaryenExpressionRef;

Expand Down
Loading