diff --git a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/BodyGenerator.kt b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/BodyGenerator.kt index 970dfd30869..544cbf1ba9c 100644 --- a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/BodyGenerator.kt +++ b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/ir2wasm/BodyGenerator.kt @@ -505,7 +505,7 @@ class BodyGenerator(val context: WasmFunctionCodegenContext) : IrElementVisitorV // Return true if function is recognized as intrinsic. fun tryToGenerateWasmOpIntrinsicCall(call: IrFunctionAccessExpression, function: IrFunction): Boolean { - if (function.hasWasmReinterpretAnnotation()) { + if (function.hasWasmNoOpCastAnnotation()) { return true } 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 4bd065aafff..932e2135f23 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 @@ -55,7 +55,7 @@ class DeclarationGenerator(val context: WasmModuleCodegenContext) : IrElementVis declaration.getWasmImportAnnotation() } - val isIntrinsic = declaration.hasWasmReinterpretAnnotation() || declaration.getWasmOpAnnotation() != null + val isIntrinsic = declaration.hasWasmNoOpCastAnnotation() || declaration.getWasmOpAnnotation() != null if (isIntrinsic) { 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 b114b8087bc..ea0a3947a53 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 @@ -23,8 +23,8 @@ fun IrAnnotationContainer.hasExcludedFromCodegenAnnotation(): Boolean = fun IrAnnotationContainer.getWasmOpAnnotation(): String? = getAnnotation(FqName("kotlin.wasm.internal.WasmOp"))?.getSingleConstStringArgument() -fun IrAnnotationContainer.hasWasmReinterpretAnnotation(): Boolean = - hasAnnotation(FqName("kotlin.wasm.internal.WasmReinterpret")) +fun IrAnnotationContainer.hasWasmNoOpCastAnnotation(): Boolean = + hasAnnotation(FqName("kotlin.wasm.internal.WasmNoOpCast")) fun IrAnnotationContainer.hasWasmForeignAnnotation(): Boolean = hasAnnotation(FqName("kotlin.wasm.internal.WasmForeign")) diff --git a/libraries/stdlib/wasm/builtins/kotlin/Boolean.kt b/libraries/stdlib/wasm/builtins/kotlin/Boolean.kt index 15d4b878db2..81d9d8125d7 100644 --- a/libraries/stdlib/wasm/builtins/kotlin/Boolean.kt +++ b/libraries/stdlib/wasm/builtins/kotlin/Boolean.kt @@ -60,7 +60,7 @@ public class Boolean private constructor(private val value: Boolean) : Comparabl } } - @WasmReinterpret + @WasmNoOpCast internal fun toInt(): Int = implementedAsIntrinsic diff --git a/libraries/stdlib/wasm/builtins/kotlin/Char.kt b/libraries/stdlib/wasm/builtins/kotlin/Char.kt index 5fe37924517..05a752c252e 100644 --- a/libraries/stdlib/wasm/builtins/kotlin/Char.kt +++ b/libraries/stdlib/wasm/builtins/kotlin/Char.kt @@ -76,7 +76,7 @@ public class Char private constructor(public val value: Char) : Comparable this.toInt().toShort() /** Returns the value of this character as a `Int`. */ - @WasmReinterpret + @WasmNoOpCast public fun toInt(): Int = implementedAsIntrinsic diff --git a/libraries/stdlib/wasm/builtins/kotlin/Primitives.kt b/libraries/stdlib/wasm/builtins/kotlin/Primitives.kt index 0e669c47d5d..38f8ba02279 100644 --- a/libraries/stdlib/wasm/builtins/kotlin/Primitives.kt +++ b/libraries/stdlib/wasm/builtins/kotlin/Primitives.kt @@ -346,7 +346,7 @@ public class Byte private constructor(public val value: Byte) : Number(), Compar public override inline fun hashCode(): Int = this.toInt() - @WasmReinterpret + @WasmNoOpCast @PublishedApi internal fun reinterpretAsInt(): Int = implementedAsIntrinsic @@ -686,7 +686,7 @@ public class Short private constructor(public val value: Short) : Number(), Comp public override inline fun hashCode(): Int = this.toInt() - @WasmReinterpret + @WasmNoOpCast @PublishedApi internal fun reinterpretAsInt(): Int = implementedAsIntrinsic @@ -1065,23 +1065,23 @@ public class Int private constructor(val value: Int) : Number(), Comparable public override inline fun hashCode(): Int = this - @WasmReinterpret + @WasmNoOpCast @PublishedApi internal fun reinterpretAsBoolean(): Boolean = implementedAsIntrinsic @PublishedApi - @WasmReinterpret + @WasmNoOpCast internal fun reinterpretAsByte(): Byte = implementedAsIntrinsic @PublishedApi - @WasmReinterpret + @WasmNoOpCast internal fun reinterpretAsShort(): Short = implementedAsIntrinsic @PublishedApi - @WasmReinterpret + @WasmNoOpCast internal fun reinterpretAsChar(): Char = implementedAsIntrinsic } diff --git a/libraries/stdlib/wasm/internal/kotlin/wasm/internal/Runtime.kt b/libraries/stdlib/wasm/internal/kotlin/wasm/internal/Runtime.kt index 081bbddfd2e..b4b6895def0 100644 --- a/libraries/stdlib/wasm/internal/kotlin/wasm/internal/Runtime.kt +++ b/libraries/stdlib/wasm/internal/kotlin/wasm/internal/Runtime.kt @@ -33,7 +33,7 @@ internal fun unsafeCharArrayToRawMemory(src: CharArray, dstAddr: Int) { } } -@WasmReinterpret +@WasmNoOpCast internal fun unsafeNotNull(x: Any?): Any = implementedAsIntrinsic diff --git a/libraries/stdlib/wasm/internal/kotlin/wasm/internal/WasmAnnotations.kt b/libraries/stdlib/wasm/internal/kotlin/wasm/internal/WasmAnnotations.kt index 7341eebeeab..ff37c298534 100644 --- a/libraries/stdlib/wasm/internal/kotlin/wasm/internal/WasmAnnotations.kt +++ b/libraries/stdlib/wasm/internal/kotlin/wasm/internal/WasmAnnotations.kt @@ -28,9 +28,12 @@ internal annotation class WasmArrayOf( val isNullable: Boolean, ) +// When applied to a function it forces codegen to not generate any code for it. +// In other words the annotated function will pass it's arguments unchanged. +// This is used in order to implement type casts when we know that underlying wasm types don't change. @Target(AnnotationTarget.FUNCTION) @Retention(AnnotationRetention.BINARY) -internal annotation class WasmReinterpret +internal annotation class WasmNoOpCast // This tells backend to insert box/unbox intrinsics around the annotated class. It's used to represent built-in types without making them // explicitly "inline" (or "value" in the newest terminology).