From eb8c3aa54e5025ac2eb19fb2b9be9b1cde09a64b Mon Sep 17 00:00:00 2001 From: Igor Yakovlev Date: Thu, 3 Feb 2022 16:23:38 +0100 Subject: [PATCH] [WASM] Remove WasmImport annotation --- .../jetbrains/kotlin/backend/wasm/compiler.kt | 27 ++----------------- .../wasm/ir2wasm/DeclarationGenerator.kt | 7 ++--- .../kotlin/backend/wasm/utils/Annotations.kt | 9 ------- .../kotlin/js/testOld/BasicWasmBoxTest.kt | 4 +-- .../kotlin/wasm/internal/ExternalWrapper.kt | 9 +++++++ .../kotlin/wasm/internal/WasmAnnotations.kt | 4 --- libraries/stdlib/wasm/src/kotlin/io.kt | 24 +++++++---------- 7 files changed, 24 insertions(+), 60 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 0ac53569de7..ea0eda73051 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 @@ -110,33 +110,10 @@ fun WasmCompiledModuleFragment.generateJs(): String { var wasmInstance = null; const externrefBoxes = new WeakMap(); - - const runtime = { - identity(x) { - return x; - }, - - println(valueAddr) { - console.log(">>> " + importStringFromWasm(valueAddr)); - }, - - printError(valueAddr) { - console.error(">>> " + importStringFromWasm(valueAddr)); - }, - }; - - function importStringFromWasm(addr) { - const mem16 = new Uint16Array(wasmInstance.exports.memory.buffer); - const mem32 = new Int32Array(wasmInstance.exports.memory.buffer); - const len = mem32[addr / 4]; - const str_start_addr = (addr + 4) / 2; - const slice = mem16.slice(str_start_addr, str_start_addr + len); - return String.fromCharCode.apply(null, slice); - } """.trimIndent() - val jsCode = - "\nconst js_code = {${jsFuns.joinToString(",\n") { "\"" + it.importName + "\" : " + it.jsCode }}};" + val jsFuns = jsFuns.joinToString(",\n") { "\"" + it.importName + "\" : " + it.jsCode } + val jsCode = "\nconst js_code = {$jsFuns};" return runtime + jsCode } diff --git a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/DeclarationGenerator.kt b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/DeclarationGenerator.kt index ca40fa669ed..d1174145445 100644 --- a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/DeclarationGenerator.kt +++ b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/DeclarationGenerator.kt @@ -65,15 +65,12 @@ class DeclarationGenerator(val context: WasmModuleCodegenContext, private val al } val jsCode = declaration.getJsFunAnnotation() ?: if (declaration.isExternal) declaration.name.asString() else null - val importedName = if (jsCode != null) { + val importedName = jsCode?.let { val jsCodeName = jsCodeName(declaration) - context.addJsFun(jsCodeName, jsCode) + context.addJsFun(jsCodeName, it) WasmImportPair("js_code", jsCodeName(declaration)) - } else { - declaration.getWasmImportAnnotation() } - if (declaration.isFakeOverride) return diff --git a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/utils/Annotations.kt b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/utils/Annotations.kt index ff6503ea12d..443fb8fbbdd 100644 --- a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/utils/Annotations.kt +++ b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/utils/Annotations.kt @@ -29,15 +29,6 @@ fun IrAnnotationContainer.hasWasmNoOpCastAnnotation(): Boolean = fun IrAnnotationContainer.hasWasmAutoboxedAnnotation(): Boolean = hasAnnotation(FqName("kotlin.wasm.internal.WasmAutoboxed")) -fun IrAnnotationContainer.getWasmImportAnnotation(): WasmImportPair? = - getAnnotation(FqName("kotlin.wasm.internal.WasmImport"))?.let { - WasmImportPair( - (it.getValueArgument(0) as IrConst<*>).value as String, - (it.getValueArgument(1) as IrConst<*>).value as String - ) - } - - class WasmArrayInfo(val klass: IrClass, val isNullable: Boolean) { val type = klass.defaultType.let { if (isNullable) it.makeNullable() else it } } diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/testOld/BasicWasmBoxTest.kt b/js/js.tests/test/org/jetbrains/kotlin/js/testOld/BasicWasmBoxTest.kt index 663ea7e5738..78a187847b6 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/testOld/BasicWasmBoxTest.kt +++ b/js/js.tests/test/org/jetbrains/kotlin/js/testOld/BasicWasmBoxTest.kt @@ -218,7 +218,7 @@ abstract class BasicWasmBoxTest( val testRunner = """ const wasmBinary = read(String.raw`${outputWasmFile.absoluteFile}`, 'binary'); const wasmModule = new WebAssembly.Module(wasmBinary); - wasmInstance = new WebAssembly.Instance(wasmModule, { runtime, js_code }); + wasmInstance = new WebAssembly.Instance(wasmModule, { js_code }); const ${sanitizeName(config.moduleId)} = wasmInstance.exports; ${createJsRun(wasmInstance = "wasmInstance", testFunction = testFunction, dceEnabled = dceEnabled)} """.trimIndent() @@ -261,7 +261,7 @@ abstract class BasicWasmBoxTest( """ const response = await fetch("index.wasm"); const wasmBinary = await response.arrayBuffer(); - wasmInstance = (await WebAssembly.instantiate(wasmBinary, { runtime, js_code })).instance; + wasmInstance = (await WebAssembly.instantiate(wasmBinary, { js_code })).instance; ${createJsRun(wasmInstance = "wasmInstance", testFunction = "box", dceEnabled = dceEnabled)} console.log("Test passed!"); """.trimIndent() diff --git a/libraries/stdlib/wasm/internal/kotlin/wasm/internal/ExternalWrapper.kt b/libraries/stdlib/wasm/internal/kotlin/wasm/internal/ExternalWrapper.kt index 5fa84eaa89e..60d0f275b05 100644 --- a/libraries/stdlib/wasm/internal/kotlin/wasm/internal/ExternalWrapper.kt +++ b/libraries/stdlib/wasm/internal/kotlin/wasm/internal/ExternalWrapper.kt @@ -138,6 +138,15 @@ internal fun anyToExternRef(x: Any): ExternalInterfaceType { x.asWasmExternRef() } +@JsFun("""(addr) => { + const mem16 = new Uint16Array(wasmInstance.exports.memory.buffer); + const mem32 = new Int32Array(wasmInstance.exports.memory.buffer); + const len = mem32[addr / 4]; + const str_start_addr = (addr + 4) / 2; + const slice = mem16.slice(str_start_addr, str_start_addr + len); + return String.fromCharCode.apply(null, slice); +} +""") internal external fun importStringFromWasm(addr: Int): ExternalInterfaceType @JsFun("x => x.length") diff --git a/libraries/stdlib/wasm/internal/kotlin/wasm/internal/WasmAnnotations.kt b/libraries/stdlib/wasm/internal/kotlin/wasm/internal/WasmAnnotations.kt index a64d94619b0..7a81be80c2c 100644 --- a/libraries/stdlib/wasm/internal/kotlin/wasm/internal/WasmAnnotations.kt +++ b/libraries/stdlib/wasm/internal/kotlin/wasm/internal/WasmAnnotations.kt @@ -13,10 +13,6 @@ import kotlin.reflect.KClass @Retention(AnnotationRetention.BINARY) internal annotation class ExcludedFromCodegen -@Target(FUNCTION, PROPERTY_GETTER, PROPERTY_SETTER) -@Retention(AnnotationRetention.BINARY) -internal annotation class WasmImport(val module: String, val name: String) - @Target(CLASS) @Retention(AnnotationRetention.BINARY) internal annotation class WasmArrayOf( diff --git a/libraries/stdlib/wasm/src/kotlin/io.kt b/libraries/stdlib/wasm/src/kotlin/io.kt index 6c9841214bf..16ce6fe27d7 100644 --- a/libraries/stdlib/wasm/src/kotlin/io.kt +++ b/libraries/stdlib/wasm/src/kotlin/io.kt @@ -7,14 +7,20 @@ package kotlin.io import kotlin.wasm.internal.* +@JsFun("(error) => console.error(\">>> \" + error)") +internal external fun printError(error: String?): Unit + +@JsFun("(message) => console.log(\">>> \" + message)") +private external fun printlnImpl(error: String?): Unit + /** Prints the line separator to the standard output stream. */ public actual fun println() { - println("") + printlnImpl("") } /** Prints the given [message] and the line separator to the standard output stream. */ public actual fun println(message: Any?) { - printlnImpl(exportString(message.toString())) + printlnImpl(message?.toString()) } /** Prints the given [message] to the standard output stream. */ @@ -29,16 +35,4 @@ public actual fun readln(): String = throw UnsupportedOperationException("readln @SinceKotlin("1.6") public actual fun readlnOrNull(): String? = throw UnsupportedOperationException("readlnOrNull is not supported in Kotlin/WASM") -internal actual interface Serializable - -@WasmImport("runtime", "println") -private fun printlnImpl(messageAddr: Int): Unit = - implementedAsIntrinsic - -internal fun printError(error: Any?) { - printErrorImpl(exportString(error.toString())) -} - -@WasmImport("runtime", "printError") -private fun printErrorImpl(errorAddr: Int): Unit = - implementedAsIntrinsic +internal actual interface Serializable \ No newline at end of file