summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/js/binaryen.idl13
-rw-r--r--src/js/binaryen.js-extended.js56
-rw-r--r--src/js/binaryen.js-post.js29
-rw-r--r--src/js/binaryen.js-pre.js1
4 files changed, 98 insertions, 1 deletions
diff --git a/src/js/binaryen.idl b/src/js/binaryen.idl
index 6a1d63d8a..b7244fbe2 100644
--- a/src/js/binaryen.idl
+++ b/src/js/binaryen.idl
@@ -30,7 +30,18 @@ interface ModuleInstance {
[Value] Literal callExport([Ref] Name name, [Ref] LiteralList arguments);
};
-[Prefix="ModuleInstance::"]
+
+interface BufferWithRandomAccess {
+ void BufferWithRandomAccess(boolean debug);
+ unsigned long size();
+ [Operator="[]"] octet at(unsigned long index);
+};
+
+interface WasmBinaryWriter {
+ void WasmBinaryWriter(Module m, [Ref] BufferWithRandomAccess outbuf, boolean debug);
+ void write();
+};
+
interface LiteralList {
void LiteralList();
diff --git a/src/js/binaryen.js-extended.js b/src/js/binaryen.js-extended.js
new file mode 100644
index 000000000..74e3e4bbe
--- /dev/null
+++ b/src/js/binaryen.js-extended.js
@@ -0,0 +1,56 @@
+// Extended API
+
+// Makes the internal buffer iterable so we can use Uint8Array.from
+if (typeof Symbol !== 'undefined' && Symbol.iterator) {
+ Module['BufferWithRandomAccess'].prototype[Symbol.iterator] = function() {
+ var b = this, i = 0, L = b.size();
+ return {
+ next: function() {
+ if (i < L) {
+ return { done: false, value: b.at(i++) }
+ } else {
+ return { done: true }
+ }
+ }
+ }
+ };
+}
+
+// Converts (copies) a BufferWithRandomAccess to native ArrayBuffer
+if (typeof Uint8Array !== 'undefined') {
+ Module['BufferWithRandomAccess'].prototype['toArrayBuffer'] = function() {
+ return Uint8Array['from'](this).buffer; // :ArrayBuffer
+ };
+}
+
+// Parse and compile S-expression text syntax into WASM code.
+// When running in NodeJS, this functions returns a Buffer instead of ArrayBuffer.
+Module['compileWast'] = function compileWast(sourceText /*:string*/) /*:ArrayBuffer*/ {
+ var parser = new Module['SExpressionParser'](sourceText);
+
+ // console.log('s-expr dump:');
+ // parser.get_root().dump();
+
+ var s_module = parser.get_root().getChild(0);
+ // console.log('s_module', s_module)
+
+ // strange API for creating WASM `module` from S-expression AST
+ var module = new Module['Module']();
+ new Module['SExpressionWasmBuilder'](module, s_module);
+
+ // console.log('module:', module);
+ // this.WasmPrinter.prototype.printModule(module);
+
+ // emit WASM
+ var debug = false;
+ var buf0 = new Module['BufferWithRandomAccess'](debug);
+ var wasmWriter = new Module['WasmBinaryWriter'](module, buf0, debug);
+ wasmWriter.write();
+
+ if (ENVIRONMENT_IS_NODE) {
+ return Buffer['from'](Uint8Array['from'](buf0));
+ } else {
+ return buf0['toArrayBuffer']();
+ }
+};
+
diff --git a/src/js/binaryen.js-post.js b/src/js/binaryen.js-post.js
new file mode 100644
index 000000000..7389f5afe
--- /dev/null
+++ b/src/js/binaryen.js-post.js
@@ -0,0 +1,29 @@
+return Module;
+};
+if (typeof exports != 'undefined') {
+ (function(){
+ var a = Binaryen();
+ if (typeof module === 'object') {
+ module.exports = a;
+ } else {
+ for (var k in a) {
+ exports[k] = a[k];
+ }
+ }
+ })();
+}
+(typeof window !== 'undefined' ? window :
+ typeof global !== 'undefined' && (
+ typeof process === 'undefined' ||
+
+ // Note: We must export "Binaryen" even inside a CommonJS/AMD/UMD module
+ // space because check.py generates a.js which requires Binaryen global var
+ ( process.argv &&
+ Array.isArray(process.argv) &&
+ process.argv[1] &&
+ process.argv[1].substr(-5) === '/a.js'
+ )
+
+ ) ? global :
+ this
+)['Binaryen'] = Binaryen;
diff --git a/src/js/binaryen.js-pre.js b/src/js/binaryen.js-pre.js
new file mode 100644
index 000000000..ceb25f165
--- /dev/null
+++ b/src/js/binaryen.js-pre.js
@@ -0,0 +1 @@
+var Binaryen = function(Module){