From bea1a8c4227f5bb9aa6453dab4bb7166c0466895 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Steven=20Sch=C3=A4fer?= Date: Mon, 8 Feb 2021 16:50:46 +0100 Subject: [PATCH] JVM IR: Use Object.clone in Enum.values --- .../kotlin/backend/jvm/lower/EnumClassLowering.kt | 15 +++++++++------ .../codegen/bytecodeText/enum/enumCheckcasts.kt | 5 ----- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/EnumClassLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/EnumClassLowering.kt index 1fc66f8c086..558fab8a96f 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/EnumClassLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/EnumClassLowering.kt @@ -32,10 +32,7 @@ import org.jetbrains.kotlin.ir.expressions.impl.IrSetValueImpl import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol import org.jetbrains.kotlin.ir.symbols.IrValueParameterSymbol import org.jetbrains.kotlin.ir.types.typeWith -import org.jetbrains.kotlin.ir.util.defaultType -import org.jetbrains.kotlin.ir.util.isEnumClass -import org.jetbrains.kotlin.ir.util.isEnumEntry -import org.jetbrains.kotlin.ir.util.patchDeclarationParents +import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid import org.jetbrains.kotlin.name.Name @@ -156,8 +153,14 @@ private class EnumClassLowering(val context: JvmBackendContext) : ClassLoweringP declaration.body = context.createJvmIrBuilder(declaration.symbol).run { irExprBody( when (body.kind) { - IrSyntheticBodyKind.ENUM_VALUES -> - irArray(valuesField.type) { addSpread(irGetField(null, valuesField)) } + IrSyntheticBodyKind.ENUM_VALUES -> { + val cloneFun = context.irBuiltIns.arrayClass.functions.single { + it.owner.name.asString() == "clone" + } + irCall(cloneFun, declaration.returnType).apply { + dispatchReceiver = irGetField(null, valuesField) + } + } IrSyntheticBodyKind.ENUM_VALUEOF -> irCall(backendContext.ir.symbols.enumValueOfFunction).apply { diff --git a/compiler/testData/codegen/bytecodeText/enum/enumCheckcasts.kt b/compiler/testData/codegen/bytecodeText/enum/enumCheckcasts.kt index 6cbc5a8a212..f0a119e862e 100644 --- a/compiler/testData/codegen/bytecodeText/enum/enumCheckcasts.kt +++ b/compiler/testData/codegen/bytecodeText/enum/enumCheckcasts.kt @@ -3,10 +3,5 @@ enum class Foo { open fun result() = "Fail" } -// JVM_TEMPLATES: // There are two CHECKCASTs, one in Foo.valueOf and one in Foo.values // 2 CHECKCAST - -// JVM_IR_TEMPLATES: -// There should be only one CHECKCAST in Foo.valueOf -// 1 CHECKCAST \ No newline at end of file