From eea3c3624c1b72cf28d10fe501d3ff39aa348809 Mon Sep 17 00:00:00 2001 From: Igor Yakovlev Date: Mon, 19 Feb 2024 16:58:00 +0100 Subject: [PATCH] [WasmJs] Generate a wrapper that run in Deno Fixed #KT-65713 --- .../org/jetbrains/kotlin/backend/wasm/compiler.kt | 15 ++++++++++++--- compiler/testData/codegen/box/size/add.kt | 2 +- compiler/testData/codegen/box/size/helloWorld.kt | 2 +- .../testData/codegen/box/size/helloWorldDOM.kt | 2 +- .../codegen/box/size/objectsOptimization.kt | 2 +- compiler/testData/codegen/box/size/ok.kt | 2 +- .../codegen/box/size/removeUnusedOverride.kt | 2 +- 7 files changed, 18 insertions(+), 9 deletions(-) diff --git a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/compiler.kt b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/compiler.kt index 50c0dcce37a..7cc36478e4f 100644 --- a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/compiler.kt +++ b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/compiler.kt @@ -289,15 +289,16 @@ $jsCodeBodyIndented let wasmExports; const isNodeJs = (typeof process !== 'undefined') && (process.release.name === 'node'); + const isDeno = !isNodeJs && (typeof Deno !== 'undefined') const isStandaloneJsVM = - !isNodeJs && ( + !isDeno && !isNodeJs && ( typeof d8 !== 'undefined' // V8 || typeof inIon !== 'undefined' // SpiderMonkey || typeof jscOptions !== 'undefined' // JavaScriptCore ); - const isBrowser = !isNodeJs && !isStandaloneJsVM && (typeof window !== 'undefined'); + const isBrowser = !isNodeJs && !isDeno && !isStandaloneJsVM && (typeof window !== 'undefined'); - if (!isNodeJs && !isStandaloneJsVM && !isBrowser) { + if (!isNodeJs && !isDeno && !isStandaloneJsVM && !isBrowser) { throw "Supported JS engine not detected"; } @@ -321,6 +322,14 @@ $imports wasmInstance = new WebAssembly.Instance(wasmModule, importObject); } + if (isDeno) { + const path = await import(/* webpackIgnore: true */'https://deno.land/std/path/mod.ts'); + const dirpath = path.dirname(path.fromFileUrl(import.meta.url)); + const binary = Deno.readFileSync(path.resolve(dirpath, wasmFilePath)); + const module = await WebAssembly.compile(binary); + wasmInstance = await WebAssembly.instantiate(module, importObject); + } + if (isStandaloneJsVM) { const wasmBuffer = read(wasmFilePath, 'binary'); const wasmModule = new WebAssembly.Module(wasmBuffer); diff --git a/compiler/testData/codegen/box/size/add.kt b/compiler/testData/codegen/box/size/add.kt index 81d987f87c8..261136e0efc 100644 --- a/compiler/testData/codegen/box/size/add.kt +++ b/compiler/testData/codegen/box/size/add.kt @@ -2,7 +2,7 @@ // RUN_THIRD_PARTY_OPTIMIZER // WASM_DCE_EXPECTED_OUTPUT_SIZE: wasm 12_773 -// WASM_DCE_EXPECTED_OUTPUT_SIZE: mjs 4_921 +// WASM_DCE_EXPECTED_OUTPUT_SIZE: mjs 5_411 // WASM_OPT_EXPECTED_OUTPUT_SIZE: 2_640 // FILE: test.kt diff --git a/compiler/testData/codegen/box/size/helloWorld.kt b/compiler/testData/codegen/box/size/helloWorld.kt index e2aa6cdbdfa..99ed027c4da 100644 --- a/compiler/testData/codegen/box/size/helloWorld.kt +++ b/compiler/testData/codegen/box/size/helloWorld.kt @@ -2,7 +2,7 @@ // RUN_THIRD_PARTY_OPTIMIZER // WASM_DCE_EXPECTED_OUTPUT_SIZE: wasm 35_154 -// WASM_DCE_EXPECTED_OUTPUT_SIZE: mjs 4_941 +// WASM_DCE_EXPECTED_OUTPUT_SIZE: mjs 5_431 // WASM_OPT_EXPECTED_OUTPUT_SIZE: 8_586 fun box(): String { diff --git a/compiler/testData/codegen/box/size/helloWorldDOM.kt b/compiler/testData/codegen/box/size/helloWorldDOM.kt index 900a7883157..ea121a628e0 100644 --- a/compiler/testData/codegen/box/size/helloWorldDOM.kt +++ b/compiler/testData/codegen/box/size/helloWorldDOM.kt @@ -2,7 +2,7 @@ // RUN_THIRD_PARTY_OPTIMIZER // WASM_DCE_EXPECTED_OUTPUT_SIZE: wasm 14_178 -// WASM_DCE_EXPECTED_OUTPUT_SIZE: mjs 5_478 +// WASM_DCE_EXPECTED_OUTPUT_SIZE: mjs 5_968 // WASM_OPT_EXPECTED_OUTPUT_SIZE: 4_317 // FILE: test.kt diff --git a/compiler/testData/codegen/box/size/objectsOptimization.kt b/compiler/testData/codegen/box/size/objectsOptimization.kt index 2ae32ff44a9..3ca1c60b0ad 100644 --- a/compiler/testData/codegen/box/size/objectsOptimization.kt +++ b/compiler/testData/codegen/box/size/objectsOptimization.kt @@ -2,7 +2,7 @@ // RUN_THIRD_PARTY_OPTIMIZER // WASM_DCE_EXPECTED_OUTPUT_SIZE: wasm 17_907 -// WASM_DCE_EXPECTED_OUTPUT_SIZE: mjs 4_787 +// WASM_DCE_EXPECTED_OUTPUT_SIZE: mjs 5_277 // WASM_OPT_EXPECTED_OUTPUT_SIZE: 5_841 object Simple diff --git a/compiler/testData/codegen/box/size/ok.kt b/compiler/testData/codegen/box/size/ok.kt index 5157b9fd1fe..649d9093f7a 100644 --- a/compiler/testData/codegen/box/size/ok.kt +++ b/compiler/testData/codegen/box/size/ok.kt @@ -2,7 +2,7 @@ // RUN_THIRD_PARTY_OPTIMIZER // WASM_DCE_EXPECTED_OUTPUT_SIZE: wasm 12_856 -// WASM_DCE_EXPECTED_OUTPUT_SIZE: mjs 4_787 +// WASM_DCE_EXPECTED_OUTPUT_SIZE: mjs 5_277 // WASM_OPT_EXPECTED_OUTPUT_SIZE: 3_743 fun box() = "OK" \ No newline at end of file diff --git a/compiler/testData/codegen/box/size/removeUnusedOverride.kt b/compiler/testData/codegen/box/size/removeUnusedOverride.kt index 95a095f336c..63f1390002b 100644 --- a/compiler/testData/codegen/box/size/removeUnusedOverride.kt +++ b/compiler/testData/codegen/box/size/removeUnusedOverride.kt @@ -3,7 +3,7 @@ // RUN_THIRD_PARTY_OPTIMIZER // WASM_DCE_EXPECTED_OUTPUT_SIZE: wasm 13_321 -// WASM_DCE_EXPECTED_OUTPUT_SIZE: mjs 4_787 +// WASM_DCE_EXPECTED_OUTPUT_SIZE: mjs 5_277 // WASM_OPT_EXPECTED_OUTPUT_SIZE: 3_900 interface I {