JVM IR: Use Object.clone in Enum.values
This commit is contained in:
committed by
Alexander Udalov
parent
e47715f52b
commit
bea1a8c422
+9
-6
@@ -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
|
||||
Reference in New Issue
Block a user