diff options
Diffstat (limited to 'src/js/binaryen.js-extended.js')
-rw-r--r-- | src/js/binaryen.js-extended.js | 56 |
1 files changed, 56 insertions, 0 deletions
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'](); + } +}; + |