diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/EnumIntrinsicsTransformer.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/EnumIntrinsicsTransformer.kt index 35c31716aca..771d772e5db 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/EnumIntrinsicsTransformer.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/calls/EnumIntrinsicsTransformer.kt @@ -19,7 +19,7 @@ import org.jetbrains.kotlin.ir.util.isEnumClass import org.jetbrains.kotlin.name.Name -class EnumIntrinsicsTransformer(private val context: JsIrBackendContext) : CallsTransformer { +object EnumIntrinsicsUtils { private fun transformEnumTopLevelIntrinsic( call: IrFunctionAccessExpression, staticMethodPredicate: (IrSimpleFunction) -> Boolean @@ -36,19 +36,21 @@ class EnumIntrinsicsTransformer(private val context: JsIrBackendContext) : Calls return irCall(call, staticMethod.symbol) } - private fun transformEnumValueOfIntrinsic(call: IrFunctionAccessExpression) = transformEnumTopLevelIntrinsic(call) { + fun transformEnumValueOfIntrinsic(call: IrFunctionAccessExpression) = transformEnumTopLevelIntrinsic(call) { it.name == Name.identifier("valueOf") && it.valueParameters.count() == 1 && it.valueParameters[0].type.isString() } - private fun transformEnumValuesIntrinsic(call: IrFunctionAccessExpression) = transformEnumTopLevelIntrinsic(call) { + fun transformEnumValuesIntrinsic(call: IrFunctionAccessExpression) = transformEnumTopLevelIntrinsic(call) { it.name == Name.identifier("values") && it.valueParameters.count() == 0 } +} +class EnumIntrinsicsTransformer(private val context: JsIrBackendContext) : CallsTransformer { override fun transformFunctionAccess(call: IrFunctionAccessExpression, doNotIntrinsify: Boolean) = when (call.symbol) { - context.intrinsics.enumValueOfIntrinsic -> transformEnumValueOfIntrinsic(call) - context.intrinsics.enumValuesIntrinsic -> transformEnumValuesIntrinsic(call) + context.intrinsics.enumValueOfIntrinsic -> EnumIntrinsicsUtils.transformEnumValueOfIntrinsic(call) + context.intrinsics.enumValuesIntrinsic -> EnumIntrinsicsUtils.transformEnumValuesIntrinsic(call) else -> call } } diff --git a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/WasmSymbols.kt b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/WasmSymbols.kt index 4e43b717f70..636c81c705b 100644 --- a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/WasmSymbols.kt +++ b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/WasmSymbols.kt @@ -111,6 +111,9 @@ class WasmSymbols( .find { it.valueParameters.firstOrNull()?.type?.isFunctionType == true } .let { symbolTable.referenceSimpleFunction(it!!) } + val enumValueOfIntrinsic = getInternalFunction("enumValueOfIntrinsic") + val enumValuesIntrinsic = getInternalFunction("enumValuesIntrinsic") + val coroutineEmptyContinuation: IrPropertySymbol = symbolTable.referenceProperty( getProperty(FqName.fromSegments(listOf("kotlin", "wasm", "internal", "EmptyContinuation"))) ) diff --git a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/lower/BuiltInsLowering.kt b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/lower/BuiltInsLowering.kt index 9ac1232e75c..eeb82b64f4e 100644 --- a/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/lower/BuiltInsLowering.kt +++ b/compiler/ir/backend.wasm/src/org/jetbrains/kotlin/backend/wasm/lower/BuiltInsLowering.kt @@ -12,6 +12,7 @@ import org.jetbrains.kotlin.backend.common.lower.createIrBuilder import org.jetbrains.kotlin.backend.wasm.WasmBackendContext import org.jetbrains.kotlin.config.AnalysisFlags import org.jetbrains.kotlin.config.languageVersionSettings +import org.jetbrains.kotlin.ir.backend.js.lower.calls.EnumIntrinsicsUtils import org.jetbrains.kotlin.ir.backend.js.utils.erasedUpperBound import org.jetbrains.kotlin.ir.backend.js.utils.isEqualsInheritedFromAny import org.jetbrains.kotlin.ir.builders.* @@ -172,6 +173,10 @@ class BuiltInsLowering(val context: WasmBackendContext) : FileLoweringPass { } } } + symbols.enumValueOfIntrinsic -> + return EnumIntrinsicsUtils.transformEnumValueOfIntrinsic(call) + symbols.enumValuesIntrinsic -> + return EnumIntrinsicsUtils.transformEnumValuesIntrinsic(call) } return call diff --git a/compiler/testData/codegen/box/enum/enumValueOf.kt b/compiler/testData/codegen/box/enum/enumValueOf.kt index 82beff54335..03f3923de88 100644 --- a/compiler/testData/codegen/box/enum/enumValueOf.kt +++ b/compiler/testData/codegen/box/enum/enumValueOf.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: WASM enum class E { OK } fun id(x: T) = x diff --git a/compiler/testData/codegen/box/enum/initEntriesInCompanionObject2.kt b/compiler/testData/codegen/box/enum/initEntriesInCompanionObject2.kt index 7a8b0162e65..3c3a19e5b87 100644 --- a/compiler/testData/codegen/box/enum/initEntriesInCompanionObject2.kt +++ b/compiler/testData/codegen/box/enum/initEntriesInCompanionObject2.kt @@ -1,5 +1,4 @@ // IGNORE_BACKEND: JS -// IGNORE_BACKEND: WASM var l = "" diff --git a/compiler/testData/codegen/boxInline/enum/kt10569.kt b/compiler/testData/codegen/boxInline/enum/kt10569.kt index d9bc35307e4..14cb2aea40f 100644 --- a/compiler/testData/codegen/boxInline/enum/kt10569.kt +++ b/compiler/testData/codegen/boxInline/enum/kt10569.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: WASM // WITH_STDLIB // FILE: 1.kt package test diff --git a/compiler/testData/codegen/boxInline/enum/kt18254.kt b/compiler/testData/codegen/boxInline/enum/kt18254.kt index 61908213453..4a2485a4053 100644 --- a/compiler/testData/codegen/boxInline/enum/kt18254.kt +++ b/compiler/testData/codegen/boxInline/enum/kt18254.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: WASM // WITH_STDLIB // NO_CHECK_LAMBDA_INLINING // FILE: 1.kt diff --git a/compiler/testData/codegen/boxInline/enum/valueOf.kt b/compiler/testData/codegen/boxInline/enum/valueOf.kt index f8f958a92ba..015c7c16ada 100644 --- a/compiler/testData/codegen/boxInline/enum/valueOf.kt +++ b/compiler/testData/codegen/boxInline/enum/valueOf.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: WASM // WITH_STDLIB // FILE: 1.kt package test diff --git a/compiler/testData/codegen/boxInline/enum/valueOfCapturedType.kt b/compiler/testData/codegen/boxInline/enum/valueOfCapturedType.kt index d9627731f3d..d57823c44ab 100644 --- a/compiler/testData/codegen/boxInline/enum/valueOfCapturedType.kt +++ b/compiler/testData/codegen/boxInline/enum/valueOfCapturedType.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: WASM // WITH_STDLIB // FILE: 1.kt package test diff --git a/compiler/testData/codegen/boxInline/enum/valueOfChain.kt b/compiler/testData/codegen/boxInline/enum/valueOfChain.kt index 30f31f23034..efa9ee45ee0 100644 --- a/compiler/testData/codegen/boxInline/enum/valueOfChain.kt +++ b/compiler/testData/codegen/boxInline/enum/valueOfChain.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: WASM // WITH_STDLIB // FILE: 1.kt package test diff --git a/compiler/testData/codegen/boxInline/enum/valueOfChainCapturedType.kt b/compiler/testData/codegen/boxInline/enum/valueOfChainCapturedType.kt index 12d3ca9845b..97ea6e73ef9 100644 --- a/compiler/testData/codegen/boxInline/enum/valueOfChainCapturedType.kt +++ b/compiler/testData/codegen/boxInline/enum/valueOfChainCapturedType.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: WASM // WITH_STDLIB // FILE: 1.kt package test diff --git a/compiler/testData/codegen/boxInline/enum/valueOfNonReified.kt b/compiler/testData/codegen/boxInline/enum/valueOfNonReified.kt index 652d8d6c197..05c7081ecee 100644 --- a/compiler/testData/codegen/boxInline/enum/valueOfNonReified.kt +++ b/compiler/testData/codegen/boxInline/enum/valueOfNonReified.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: WASM // WITH_STDLIB // FILE: 1.kt package test diff --git a/compiler/testData/codegen/boxInline/enum/values.kt b/compiler/testData/codegen/boxInline/enum/values.kt index da2dd332f14..7af68b7ca4c 100644 --- a/compiler/testData/codegen/boxInline/enum/values.kt +++ b/compiler/testData/codegen/boxInline/enum/values.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: WASM // WITH_STDLIB // KJS_WITH_FULL_RUNTIME // FILE: 1.kt diff --git a/compiler/testData/codegen/boxInline/enum/valuesAsArray.kt b/compiler/testData/codegen/boxInline/enum/valuesAsArray.kt index b22ca13fe5f..2f20f45f86a 100644 --- a/compiler/testData/codegen/boxInline/enum/valuesAsArray.kt +++ b/compiler/testData/codegen/boxInline/enum/valuesAsArray.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: WASM // WITH_STDLIB // KJS_WITH_FULL_RUNTIME // FILE: 1.kt diff --git a/compiler/testData/codegen/boxInline/enum/valuesCapturedType.kt b/compiler/testData/codegen/boxInline/enum/valuesCapturedType.kt index 8be8bd94990..f8d99be7661 100644 --- a/compiler/testData/codegen/boxInline/enum/valuesCapturedType.kt +++ b/compiler/testData/codegen/boxInline/enum/valuesCapturedType.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: WASM // WITH_STDLIB // KJS_WITH_FULL_RUNTIME // FILE: 1.kt diff --git a/compiler/testData/codegen/boxInline/enum/valuesChain.kt b/compiler/testData/codegen/boxInline/enum/valuesChain.kt index 2545209a754..4ea7469032c 100644 --- a/compiler/testData/codegen/boxInline/enum/valuesChain.kt +++ b/compiler/testData/codegen/boxInline/enum/valuesChain.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: WASM // WITH_STDLIB // KJS_WITH_FULL_RUNTIME // FILE: 1.kt diff --git a/compiler/testData/codegen/boxInline/enum/valuesChainCapturedType.kt b/compiler/testData/codegen/boxInline/enum/valuesChainCapturedType.kt index d1e62b39e49..a762539ce9e 100644 --- a/compiler/testData/codegen/boxInline/enum/valuesChainCapturedType.kt +++ b/compiler/testData/codegen/boxInline/enum/valuesChainCapturedType.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: WASM // WITH_STDLIB // KJS_WITH_FULL_RUNTIME // FILE: 1.kt diff --git a/compiler/testData/codegen/boxInline/enum/valuesNonReified.kt b/compiler/testData/codegen/boxInline/enum/valuesNonReified.kt index 294e90b14a5..2278b223143 100644 --- a/compiler/testData/codegen/boxInline/enum/valuesNonReified.kt +++ b/compiler/testData/codegen/boxInline/enum/valuesNonReified.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: WASM // WITH_STDLIB // KJS_WITH_FULL_RUNTIME // FILE: 1.kt diff --git a/compiler/testData/codegen/boxInline/reified/kt35511_try_valueOf.kt b/compiler/testData/codegen/boxInline/reified/kt35511_try_valueOf.kt index 375ac8d8095..b060e7e522f 100644 --- a/compiler/testData/codegen/boxInline/reified/kt35511_try_valueOf.kt +++ b/compiler/testData/codegen/boxInline/reified/kt35511_try_valueOf.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: WASM // JVM_TARGET: 1.8 // WITH_STDLIB // FILE: 1.kt diff --git a/compiler/testData/codegen/boxInline/reified/kt35511_try_values.kt b/compiler/testData/codegen/boxInline/reified/kt35511_try_values.kt index 4ca73631652..4ed040221e8 100644 --- a/compiler/testData/codegen/boxInline/reified/kt35511_try_values.kt +++ b/compiler/testData/codegen/boxInline/reified/kt35511_try_values.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: WASM // JVM_TARGET: 1.8 // WITH_STDLIB // FILE: 1.kt diff --git a/libraries/stdlib/wasm/builtins/kotlin/Library.kt b/libraries/stdlib/wasm/builtins/kotlin/Library.kt index a86fc4c450f..407ab48f531 100644 --- a/libraries/stdlib/wasm/builtins/kotlin/Library.kt +++ b/libraries/stdlib/wasm/builtins/kotlin/Library.kt @@ -8,6 +8,8 @@ package kotlin import kotlin.internal.PureReifiable +import kotlin.wasm.internal.enumValueOfIntrinsic +import kotlin.wasm.internal.enumValuesIntrinsic public inline fun emptyArray(): Array = arrayOf() @@ -80,12 +82,12 @@ public inline fun booleanArrayOf(vararg elements: Boolean): BooleanArray = eleme * Returns an array containing enum T entries. */ @SinceKotlin("1.1") -@Suppress("NON_MEMBER_FUNCTION_NO_BODY") -public inline fun > enumValues(): Array +public inline fun > enumValues(): Array = + enumValuesIntrinsic() /** * Returns an enum entry with specified name. */ @SinceKotlin("1.1") -@Suppress("NON_MEMBER_FUNCTION_NO_BODY", "UNUSED_PARAMETER") -public inline fun > enumValueOf(name: String): T \ No newline at end of file +public inline fun > enumValueOf(name: String): T = + enumValueOfIntrinsic(name) \ No newline at end of file diff --git a/libraries/stdlib/wasm/internal/kotlin/wasm/internal/EnumIntrinsics.kt b/libraries/stdlib/wasm/internal/kotlin/wasm/internal/EnumIntrinsics.kt new file mode 100644 index 00000000000..6fa5968ffa8 --- /dev/null +++ b/libraries/stdlib/wasm/internal/kotlin/wasm/internal/EnumIntrinsics.kt @@ -0,0 +1,16 @@ +/* + * 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 + +@PublishedApi +@ExcludedFromCodegen +internal fun > enumValuesIntrinsic(): Array = + implementedAsIntrinsic + +@PublishedApi +@ExcludedFromCodegen +internal fun > enumValueOfIntrinsic(@Suppress("UNUSED_PARAMETER") name: String): T = + implementedAsIntrinsic \ No newline at end of file