Skip to content

Commit 4611609

Browse files
authored
Prepare for Binaryen compiled to Wasm (AssemblyScript#1029)
1 parent 4da0316 commit 4611609

13 files changed

+553
-492
lines changed

bin/asc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,5 +18,5 @@ try { require("source-map-support").install(); } catch (e) {}
1818

1919
const asc = module.exports = require("../cli/asc.js");
2020
if (/\basc$/.test(process.argv[1])) {
21-
process.exitCode = asc.main(process.argv.slice(2));
21+
asc.ready.then(() => process.exitCode = asc.main(process.argv.slice(2)));
2222
}

cli/README.md

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -17,19 +17,21 @@ The API accepts the same options as the CLI but also lets you override stdout an
1717

1818
```js
1919
const asc = require("assemblyscript/cli/asc");
20-
asc.main([
21-
"myModule.ts",
22-
"--binaryFile", "myModule.wasm",
23-
"--optimize",
24-
"--sourceMap",
25-
"--measure"
26-
], {
27-
stdout: process.stdout,
28-
stderr: process.stderr
29-
}, function(err) {
30-
if (err)
31-
throw err;
32-
...
20+
asc.ready.then(() => {
21+
asc.main([
22+
"myModule.ts",
23+
"--binaryFile", "myModule.wasm",
24+
"--optimize",
25+
"--sourceMap",
26+
"--measure"
27+
], {
28+
stdout: process.stdout,
29+
stderr: process.stderr
30+
}, function(err) {
31+
if (err)
32+
throw err;
33+
...
34+
});
3335
});
3436
```
3537

@@ -43,6 +45,9 @@ const options = require("assemblyscript/cli/asc.json");
4345
You can also compile a source string directly, for example in a browser environment:
4446

4547
```js
46-
const { binary, text, stdout, stderr } = asc.compileString(`...`, { optimize: 2 });
48+
const asc = require("assemblyscript/cli/asc");
49+
asc.ready.then(() => {
50+
const { binary, text, stdout, stderr } = asc.compileString(`...`, { optimize: 2 });
51+
});
4752
...
4853
```

cli/asc.d.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
import { OptionDescription } from "./util/options";
22
export { OptionDescription };
33

4+
/** Ready promise resolved once/if the compiler is ready. */
5+
export const ready: Promise<void>;
6+
47
/** Whether this is a webpack bundle or not. */
58
export const isBundle: boolean;
69

cli/asc.js

Lines changed: 23 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -24,37 +24,39 @@ const mkdirp = require("./util/mkdirp");
2424
const find = require("./util/find");
2525
const EOL = process.platform === "win32" ? "\r\n" : "\n";
2626
const SEP = process.platform === "win32" ? "\\" : "/";
27+
const binaryen = global.Binaryen || (global.Binaryen = require("binaryen"));
2728

28-
// global.Binaryen = require("../lib/binaryen");
29+
// Proxy Binaryen's ready event
30+
Object.defineProperty(exports, "ready", {
31+
get: function() { return binaryen.ready; }
32+
});
2933

3034
// Emscripten adds an `uncaughtException` listener to Binaryen that results in an additional
3135
// useless code fragment on top of an actual error. suppress this:
3236
if (process.removeAllListeners) process.removeAllListeners("uncaughtException");
3337

3438
// Use distribution files if present, otherwise run the sources directly
3539
var assemblyscript, isDev = false;
36-
(() => {
37-
try { // `asc` on the command line
38-
assemblyscript = require("../dist/assemblyscript.js");
39-
} catch (e) {
40-
try { // `asc` on the command line without dist files
41-
require("ts-node").register({
42-
project: path.join(__dirname, "..", "src", "tsconfig.json"),
43-
skipIgnore: true,
44-
compilerOptions: { target: "ES2016" }
45-
});
46-
require("../src/glue/js");
47-
assemblyscript = require("../src");
48-
isDev = true;
49-
} catch (e_ts) {
50-
try { // `require("dist/asc.js")` in explicit browser tests
51-
assemblyscript = eval("require('./assemblyscript')");
52-
} catch (e) {
53-
throw Error(e_ts.stack + "\n---\n" + e.stack);
54-
}
40+
try { // `asc` on the command line
41+
assemblyscript = require("../dist/assemblyscript.js");
42+
} catch (e) {
43+
try { // `asc` on the command line without dist files
44+
require("ts-node").register({
45+
project: path.join(__dirname, "..", "src", "tsconfig.json"),
46+
skipIgnore: true,
47+
compilerOptions: { target: "ES2016" }
48+
});
49+
require("../src/glue/js");
50+
assemblyscript = require("../src");
51+
isDev = true;
52+
} catch (e_ts) {
53+
try { // `require("dist/asc.js")` in explicit browser tests
54+
assemblyscript = eval("require('./assemblyscript')");
55+
} catch (e) {
56+
throw Error(e_ts.stack + "\n---\n" + e.stack);
5557
}
5658
}
57-
})();
59+
}
5860

5961
/** Whether this is a webpack bundle or not. */
6062
exports.isBundle = typeof BUNDLE_VERSION === "string";

package-lock.json

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
"url": "https://github.com/AssemblyScript/assemblyscript/issues"
2222
},
2323
"dependencies": {
24-
"binaryen": "89.0.0-nightly.20191215",
24+
"binaryen": "90.0.0-nightly.20191231",
2525
"long": "^4.0.0",
2626
"source-map-support": "^0.5.16",
2727
"ts-node": "^6.2.0"

scripts/update-constants.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
// Updates the Binaryen constants in src/module.ts
2+
3+
const fs = require("fs");
4+
const path = require("path");
5+
const binaryen = require("binaryen");
6+
7+
const srcfile = path.join(__dirname, "..", "src", "module.ts");
8+
var src = fs.readFileSync(srcfile, "utf8");
9+
10+
binaryen.ready.then(() => {
11+
src = src.replace(/enum (\w+) \{([^}]*)\}/g, function($0) {
12+
return $0.replace(/(\w+)[ ]+=[ ]+([^,;\n]+)/g, function($0, key, val) {
13+
var match = val.match(/\b(_Binaryen\w+)\b/);
14+
if (match) {
15+
let fn = match[1];
16+
let id = binaryen[fn]();
17+
console.log(fn + " = " + id);
18+
return key + " = " + id + " /* " + fn + " */";
19+
}
20+
return $0;
21+
});
22+
});
23+
fs.writeFileSync(srcfile, src, "utf8");
24+
});

src/README.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,18 @@ Portable compiler sources that compile to both JavaScript using `tsc` and, event
22

33
Architecture
44
------------
5+
56
![](https://assemblyscript.github.io/assemblyscript/media/architecture.svg)
7+
8+
Usage
9+
-----
10+
11+
Note that using the compiler as a library requires awaiting Binaryen ready state, like so:
12+
13+
```js
14+
const binaryen = require("binaryen");
15+
const assemblyscript = require("assemblyscript");
16+
binaryen.ready.then(() => {
17+
// do something with assemblyscript
18+
});
19+
```

src/glue/binaryen.d.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -352,6 +352,7 @@ export declare function _BinaryenMinSVecI8x16(): BinaryenOp;
352352
export declare function _BinaryenMinUVecI8x16(): BinaryenOp;
353353
export declare function _BinaryenMaxSVecI8x16(): BinaryenOp;
354354
export declare function _BinaryenMaxUVecI8x16(): BinaryenOp;
355+
export declare function _BinaryenAvgrUVecI8x16(): BinaryenOp;
355356
export declare function _BinaryenNegVecI16x8(): BinaryenOp;
356357
export declare function _BinaryenAnyTrueVecI16x8(): BinaryenOp;
357358
export declare function _BinaryenAllTrueVecI16x8(): BinaryenOp;
@@ -369,6 +370,7 @@ export declare function _BinaryenMinSVecI16x8(): BinaryenOp;
369370
export declare function _BinaryenMinUVecI16x8(): BinaryenOp;
370371
export declare function _BinaryenMaxSVecI16x8(): BinaryenOp;
371372
export declare function _BinaryenMaxUVecI16x8(): BinaryenOp;
373+
export declare function _BinaryenAvgrUVecI16x8(): BinaryenOp;
372374
export declare function _BinaryenNegVecI32x4(): BinaryenOp;
373375
export declare function _BinaryenAnyTrueVecI32x4(): BinaryenOp;
374376
export declare function _BinaryenAllTrueVecI32x4(): BinaryenOp;

src/glue/binaryen.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
const binaryen = global.Binaryen || require("binaryen");
1+
const binaryen = global.Binaryen || (global.Binaryen = require("binaryen"));
22

33
module.exports = binaryen;
44

0 commit comments

Comments
 (0)