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 75243f64760..b114b8087bc 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,8 +29,8 @@ fun IrAnnotationContainer.hasWasmReinterpretAnnotation(): Boolean = fun IrAnnotationContainer.hasWasmForeignAnnotation(): Boolean = hasAnnotation(FqName("kotlin.wasm.internal.WasmForeign")) -fun IrAnnotationContainer.hasWasmPrimitiveAnnotation(): Boolean = - hasAnnotation(FqName("kotlin.wasm.internal.WasmPrimitive")) +fun IrAnnotationContainer.hasWasmAutoboxedAnnotation(): Boolean = + hasAnnotation(FqName("kotlin.wasm.internal.WasmAutoboxed")) fun IrAnnotationContainer.getWasmImportAnnotation(): WasmImportPair? = getAnnotation(FqName("kotlin.wasm.internal.WasmImport"))?.let { diff --git a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/utils/WasmInlineClassesUtils.kt b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/utils/WasmInlineClassesUtils.kt index db1af80c55d..714bc9e45b0 100644 --- a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/utils/WasmInlineClassesUtils.kt +++ b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/utils/WasmInlineClassesUtils.kt @@ -32,7 +32,9 @@ class WasmInlineClassesUtils(private val wasmSymbols: WasmSymbols) : InlineClass } override fun isClassInlineLike(klass: IrClass): Boolean { - return klass.isInline || klass.hasWasmPrimitiveAnnotation() + // TODO: This hook is called from autoboxing lowering so we also handle autoboxing annotation here. In the future it's better + // to separate autoboxing from the inline class handling. + return klass.isInline || klass.hasWasmAutoboxedAnnotation() } override val boxIntrinsic: IrSimpleFunctionSymbol diff --git a/libraries/stdlib/wasm/builtins/kotlin/Boolean.kt b/libraries/stdlib/wasm/builtins/kotlin/Boolean.kt index d40e68cf330..15d4b878db2 100644 --- a/libraries/stdlib/wasm/builtins/kotlin/Boolean.kt +++ b/libraries/stdlib/wasm/builtins/kotlin/Boolean.kt @@ -11,7 +11,7 @@ import kotlin.wasm.internal.* * Represents a value which is either `true` or `false`. On the JVM, non-nullable values of this type are * represented as values of the primitive type `boolean`. */ -@WasmPrimitive +@WasmAutoboxed public class Boolean private constructor(private val value: Boolean) : Comparable { /** * Returns the inverse of this boolean. diff --git a/libraries/stdlib/wasm/builtins/kotlin/Char.kt b/libraries/stdlib/wasm/builtins/kotlin/Char.kt index 0cec64ff764..0630878abde 100644 --- a/libraries/stdlib/wasm/builtins/kotlin/Char.kt +++ b/libraries/stdlib/wasm/builtins/kotlin/Char.kt @@ -13,7 +13,7 @@ import kotlin.wasm.internal.* * * On the JVM, non-nullable values of this type are represented as values of the primitive type `char`. */ -@WasmPrimitive +@WasmAutoboxed @Suppress("NOTHING_TO_INLINE") public class Char private constructor(public val value: Char) : Comparable { /** diff --git a/libraries/stdlib/wasm/builtins/kotlin/Primitives.kt b/libraries/stdlib/wasm/builtins/kotlin/Primitives.kt index 47eb15c8e5a..d9dd298f8f1 100644 --- a/libraries/stdlib/wasm/builtins/kotlin/Primitives.kt +++ b/libraries/stdlib/wasm/builtins/kotlin/Primitives.kt @@ -15,7 +15,7 @@ import kotlin.wasm.internal.* /** * Represents a 8-bit signed integer. */ -@WasmPrimitive +@WasmAutoboxed public class Byte private constructor(public val value: Byte) : Number(), Comparable { public companion object { /** @@ -359,7 +359,7 @@ private fun byteToStringImpl(byte: Byte): String = /** * Represents a 16-bit signed integer. */ -@WasmPrimitive +@WasmAutoboxed public class Short private constructor(public val value: Short) : Number(), Comparable { public companion object { /** @@ -701,7 +701,7 @@ private fun shortToStringImpl(x: Short): String = implementedAsIntrinsic /** * Represents a 32-bit signed integer. */ -@WasmPrimitive +@WasmAutoboxed public class Int private constructor(val value: Int) : Number(), Comparable { public companion object { @@ -1099,7 +1099,7 @@ private fun intToStringImpl(x: Int): String = /** * Represents a 64-bit signed integer. */ -@WasmPrimitive +@WasmAutoboxed public class Long private constructor(val value: Long) : Number(), Comparable { public companion object { @@ -1473,7 +1473,7 @@ public class Long private constructor(val value: Long) : Number(), Comparable { public companion object { @@ -1786,7 +1786,7 @@ private fun floatToStringImpl(x: Float): String = /** * Represents a double-precision 64-bit IEEE 754 floating point number. */ -@WasmPrimitive +@WasmAutoboxed public class Double private constructor(public val value: Double) : Number(), Comparable { public companion object { diff --git a/libraries/stdlib/wasm/builtins/kotlin/String.kt b/libraries/stdlib/wasm/builtins/kotlin/String.kt index 1ca1e42d318..b54b3377ba7 100644 --- a/libraries/stdlib/wasm/builtins/kotlin/String.kt +++ b/libraries/stdlib/wasm/builtins/kotlin/String.kt @@ -11,7 +11,7 @@ import kotlin.wasm.internal.* * The `String` class represents character strings. All string literals in Kotlin programs, such as `"abc"`, are * implemented as instances of this class. */ -@WasmPrimitive +@WasmAutoboxed public class String constructor(public val string: String) : Comparable, CharSequence { public companion object; diff --git a/libraries/stdlib/wasm/internal/kotlin/wasm/internal/WasmAnnotations.kt b/libraries/stdlib/wasm/internal/kotlin/wasm/internal/WasmAnnotations.kt index 1b03001c9ef..7341eebeeab 100644 --- a/libraries/stdlib/wasm/internal/kotlin/wasm/internal/WasmAnnotations.kt +++ b/libraries/stdlib/wasm/internal/kotlin/wasm/internal/WasmAnnotations.kt @@ -32,9 +32,11 @@ internal annotation class WasmArrayOf( @Retention(AnnotationRetention.BINARY) internal annotation class WasmReinterpret +// 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). @Target(AnnotationTarget.CLASS) @Retention(AnnotationRetention.BINARY) -internal annotation class WasmPrimitive +internal annotation class WasmAutoboxed /** * Replace calls to this functions with specified Wasm instruction.