diff --git a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/lower/ComplexExternalDeclarationsToTopLevelFunctionsLowering.kt b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/lower/ComplexExternalDeclarationsToTopLevelFunctionsLowering.kt index 1036bcbfa95..7ad55b88c23 100644 --- a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/lower/ComplexExternalDeclarationsToTopLevelFunctionsLowering.kt +++ b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/lower/ComplexExternalDeclarationsToTopLevelFunctionsLowering.kt @@ -9,10 +9,11 @@ import org.jetbrains.kotlin.backend.common.FileLoweringPass import org.jetbrains.kotlin.backend.common.lower.createIrBuilder import org.jetbrains.kotlin.backend.wasm.WasmBackendContext import org.jetbrains.kotlin.backend.wasm.ir2wasm.JsModuleAndQualifierReference +import org.jetbrains.kotlin.backend.wasm.utils.getJsFunAnnotation +import org.jetbrains.kotlin.backend.wasm.utils.getJsPrimitiveType +import org.jetbrains.kotlin.backend.wasm.utils.getWasmImportDescriptor import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.ir.IrElement -import org.jetbrains.kotlin.backend.wasm.utils.getJsFunAnnotation -import org.jetbrains.kotlin.backend.wasm.utils.getWasmImportDescriptor import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET import org.jetbrains.kotlin.ir.backend.js.utils.getJsModule import org.jetbrains.kotlin.ir.backend.js.utils.getJsNameOrKotlinName @@ -30,7 +31,6 @@ import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.ir.visitors.* import org.jetbrains.kotlin.name.Name -import java.lang.StringBuilder /** * Lower complex external declarations to top-level functions: @@ -340,8 +340,13 @@ class ComplexExternalDeclarationsToTopLevelFunctionsLowering(val context: WasmBa "_\$external_class_instanceof", resultType = context.irBuiltIns.booleanType, jsCode = buildString { - append("(x) => x instanceof ") - appendExternalClassReference(klass) + val jsPrimitiveType = klass.getJsPrimitiveType() + if (jsPrimitiveType != null) { + append("(x) => typeof x === '$jsPrimitiveType'") + } else { + append("(x) => x instanceof ") + appendExternalClassReference(klass) + } } ).also { it.addValueParameter("x", context.irBuiltIns.anyType) 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 26648157a0c..ea4938ff20a 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 @@ -58,3 +58,6 @@ fun IrAnnotationContainer.getWasmArrayAnnotation(): WasmArrayInfo? = fun IrAnnotationContainer.getJsFunAnnotation(): String? = getAnnotation(FqName("kotlin.JsFun"))?.getSingleConstStringArgument() + +fun IrAnnotationContainer.getJsPrimitiveType(): String? = + getAnnotation(FqName("kotlin.wasm.internal.JsPrimitive"))?.getSingleConstStringArgument() diff --git a/libraries/stdlib/wasm/internal/kotlin/wasm/internal/JsInteropAnnotations.kt b/libraries/stdlib/wasm/internal/kotlin/wasm/internal/JsInteropAnnotations.kt new file mode 100644 index 00000000000..1b6e9bf0ecc --- /dev/null +++ b/libraries/stdlib/wasm/internal/kotlin/wasm/internal/JsInteropAnnotations.kt @@ -0,0 +1,13 @@ +/* + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package kotlin.wasm.internal + +/** + * Annotated external classes correspond to JS primitive type. + * @param type is a result of JS `typeof` operator applied to this type. + */ +@Target(AnnotationTarget.CLASS) +internal annotation class JsPrimitive(val type: String) \ No newline at end of file