From 7e399202a2fd26b6690dcb4295c18569fe58a0b6 Mon Sep 17 00:00:00 2001 From: Svyatoslav Kuzmich Date: Fri, 3 Sep 2021 08:57:55 +0300 Subject: [PATCH] [Wasm] Support generating browser-compatible JS harness * Use fetch and instantiateStreaming * Call main export if it is present * Produce a variable with module name that contains a promise of module exports --- .../org/jetbrains/kotlin/cli/js/K2JsIrCompiler.kt | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/K2JsIrCompiler.kt b/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/K2JsIrCompiler.kt index ffffc4602bc..e8d35649653 100644 --- a/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/K2JsIrCompiler.kt +++ b/compiler/cli/cli-js/src/org/jetbrains/kotlin/cli/js/K2JsIrCompiler.kt @@ -38,6 +38,10 @@ import org.jetbrains.kotlin.incremental.js.IncrementalDataProvider import org.jetbrains.kotlin.incremental.js.IncrementalNextRoundChecker import org.jetbrains.kotlin.incremental.js.IncrementalResultsConsumer import org.jetbrains.kotlin.ir.backend.js.* +import org.jetbrains.kotlin.ir.backend.js.ic.actualizeCacheForModule +import org.jetbrains.kotlin.ir.backend.js.ic.buildCache +import org.jetbrains.kotlin.ir.backend.js.ic.checkCaches +import org.jetbrains.kotlin.ir.backend.js.utils.sanitizeName import org.jetbrains.kotlin.ir.backend.js.ic.* import org.jetbrains.kotlin.ir.declarations.impl.IrFactoryImpl import org.jetbrains.kotlin.ir.declarations.persistent.PersistentIrFactory @@ -314,10 +318,11 @@ class K2JsIrCompiler : CLICompiler() { outputWatFile.writeText(res.wat) val runner = """ - const wasmBinary = read(String.raw`${outputWasmFile.absoluteFile}`, 'binary'); - const wasmModule = new WebAssembly.Module(wasmBinary); - wasmInstance = new WebAssembly.Instance(wasmModule, { runtime, js_code }); - wasmInstance.exports.main(); + const ${sanitizeName(moduleName)} = WebAssembly.instantiateStreaming(fetch('${outputWasmFile.name}'), { runtime, js_code }).then((it) => { + wasmInstance = it.instance; + wasmInstance.exports.main?.(); + return it.instance.exports; + }); """.trimIndent() outputFile.writeText(res.js + "\n" + runner)