From 09d082c6780d5bd7642d1c6715f2490b7f542486 Mon Sep 17 00:00:00 2001 From: Sergey Rubanov Date: Wed, 16 Jan 2019 19:53:37 +0300 Subject: [PATCH] Use WebAssembly.instantiateStreaming when presented in browser (#2477) --- runtime/src/launcher/js/launcher.js | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/runtime/src/launcher/js/launcher.js b/runtime/src/launcher/js/launcher.js index ac0567daa2d..b2f55c2c9d4 100644 --- a/runtime/src/launcher/js/launcher.js +++ b/runtime/src/launcher/js/launcher.js @@ -210,15 +210,27 @@ function instantiateAndRunSync(arraybuffer, args) { return invokeModule(instance, args) } + +// Instantiate module in Browser as a promise of streaming instantiation. +function instantiateAndRunStreaming(filename) { + linkJavaScriptLibraries(); + WebAssembly.instantiateStreaming(fetch(filename), konan_dependencies) + .then(resultObject => invokeModule(resultObject.instance, [filename])); +} + konan.moduleEntry = function (args) { if (isBrowser()) { if (!document.currentScript.hasAttribute("wasm")) { throw new Error('Could not find the wasm attribute pointing to the WebAssembly binary.'); } const filename = document.currentScript.getAttribute("wasm"); - fetch(filename) - .then(response => response.arrayBuffer()) - .then(arraybuffer => instantiateAndRun(arraybuffer, [filename])); + if (typeof WebAssembly.instantiateStreaming === 'function') { + instantiateAndRunStreaming(filename); + } else { + fetch(filename) + .then(response => response.arrayBuffer()) + .then(arraybuffer => instantiateAndRun(arraybuffer, [filename])); + } } else { // Invoke from d8. const arrayBuffer = readbuffer(args[0]);