JVM IR: Use Object.clone in Enum.values

This commit is contained in:
Steven Schäfer
2021-02-08 16:50:46 +01:00
committed by Alexander Udalov
parent e47715f52b
commit bea1a8c422
2 changed files with 9 additions and 11 deletions
@@ -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 {
@@ -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