hey all :wave:. i need a bit of help to call JS fu...
# webassembly
p
hey all 👋. i need a bit of help to call JS funcs from a WASM module. in my code below, the
println
works and i see the message in browser console. how can i use
alert()
JS function from WASM with this setup? i was looking at various docs e.g. https://kotlinlang.org/docs/js-interop.html#external-modifier code: https://github.com/poulad/poulardo.kt/blob/28ed3fb8ee9867f528aa91a38f21deb34d6bee2[…]-wasm/src/nativeMain/kotlin/io/github/poulad/webappwasm/Main.kt build error:
Copy code
$ ./gradlew nativeBinaries
Starting a Gradle Daemon, 1 incompatible and 6 stopped Daemons could not be reused, use --status for details
Configuration cache is an incubating feature.
Configuration on demand is an incubating feature.
Calculating task graph as configuration cache cannot be reused because file 'webapp-wasm\build.gradle.kts' has changed.

> Task :webapp-wasm:linkDebugExecutableNative
e: Compilation failed: external function <root>.alert must have @TypedIntrinsic, @SymbolName, @GCUnsafeCall or @ObjCMethod annotation

 * Source files:
 * Compiler version info: Konan: 1.6.21 / Kotlin: 1.6.21
 * Output kind: PROGRAM

e: java.lang.Error: external function <root>.alert must have @TypedIntrinsic, @SymbolName, @GCUnsafeCall or @ObjCMethod annotation
        at org.jetbrains.kotlin.backend.konan.descriptors.DescriptorUtilsKt.externalSymbolOrThrow(DescriptorUtils.kt:309)
        at org.jetbrains.kotlin.backend.konan.llvm.KonanBinaryInterface.funSymbolNameImpl(BinaryInterface.kt:58)
        at org.jetbrains.kotlin.backend.konan.llvm.KonanBinaryInterface.getSymbolName(BinaryInterface.kt:41)
        at org.jetbrains.kotlin.backend.konan.llvm.BinaryInterfaceKt.computeSymbolName(BinaryInterface.kt:119)
        at org.jetbrains.kotlin.backend.konan.llvm.DeclarationsGeneratorVisitor.visitFunction(LlvmDeclarations.kt:355)
        at org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid$DefaultImpls.visitSimpleFunction(IrElementVisitorVoid.kt:52)
        at org.jetbrains.kotlin.backend.konan.llvm.DeclarationsGeneratorVisitor.visitSimpleFunction(LlvmDeclarations.kt:97)
        at org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid$DefaultImpls.visitSimpleFunction(IrElementVisitorVoid.kt:53)
        at org.jetbrains.kotlin.backend.konan.llvm.DeclarationsGeneratorVisitor.visitSimpleFunction(LlvmDeclarations.kt:97)
        at org.jetbrains.kotlin.backend.konan.llvm.DeclarationsGeneratorVisitor.visitSimpleFunction(LlvmDeclarations.kt:97)
        at org.jetbrains.kotlin.ir.declarations.IrSimpleFunction.accept(IrSimpleFunction.kt:28)
        at org.jetbrains.kotlin.ir.declarations.impl.IrFileImpl.acceptChildren(IrFileImpl.kt:84)
        at org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoidKt.acceptChildrenVoid(IrElementVisitorVoid.kt:287)
        at org.jetbrains.kotlin.backend.konan.llvm.DeclarationsGeneratorVisitor.visitElement(LlvmDeclarations.kt:148)
        at org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid$DefaultImpls.visitPackageFragment(IrElementVisitorVoid.kt:30)
        at org.jetbrains.kotlin.backend.konan.llvm.DeclarationsGeneratorVisitor.visitPackageFragment(LlvmDeclarations.kt:97)
        at org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid$DefaultImpls.visitFile(IrElementVisitorVoid.kt:37)
        at org.jetbrains.kotlin.backend.konan.llvm.DeclarationsGeneratorVisitor.visitFile(LlvmDeclarations.kt:97)
        at org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid$DefaultImpls.visitFile(IrElementVisitorVoid.kt:38)
b
Which wasm are you referring? Wasm32 on new experimental wasm?
Check external declarations and then js files in resources
p
thanks for the example. it's more involved than i thought. do you happen to have examples of the new "experimental wasm" approach?
b
I do not, apologies
b
For an example using the new Kotlin/Wasm compiler backend, you can look at https://kotlinlang.slack.com/archives/CDFP59223/p1654896440852059