diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/js/binaryen.idl | 13 | ||||
-rw-r--r-- | src/js/binaryen.js-extended.js | 56 | ||||
-rw-r--r-- | src/js/binaryen.js-post.js | 29 | ||||
-rw-r--r-- | src/js/binaryen.js-pre.js | 1 |
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){ |