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.IrConstructorSymbol
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrValueParameterSymbol
|
import org.jetbrains.kotlin.ir.symbols.IrValueParameterSymbol
|
||||||
import org.jetbrains.kotlin.ir.types.typeWith
|
import org.jetbrains.kotlin.ir.types.typeWith
|
||||||
import org.jetbrains.kotlin.ir.util.defaultType
|
import org.jetbrains.kotlin.ir.util.*
|
||||||
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.visitors.IrElementTransformerVoid
|
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
|
||||||
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
|
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
@@ -156,8 +153,14 @@ private class EnumClassLowering(val context: JvmBackendContext) : ClassLoweringP
|
|||||||
declaration.body = context.createJvmIrBuilder(declaration.symbol).run {
|
declaration.body = context.createJvmIrBuilder(declaration.symbol).run {
|
||||||
irExprBody(
|
irExprBody(
|
||||||
when (body.kind) {
|
when (body.kind) {
|
||||||
IrSyntheticBodyKind.ENUM_VALUES ->
|
IrSyntheticBodyKind.ENUM_VALUES -> {
|
||||||
irArray(valuesField.type) { addSpread(irGetField(null, valuesField)) }
|
val cloneFun = context.irBuiltIns.arrayClass.functions.single {
|
||||||
|
it.owner.name.asString() == "clone"
|
||||||
|
}
|
||||||
|
irCall(cloneFun, declaration.returnType).apply {
|
||||||
|
dispatchReceiver = irGetField(null, valuesField)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
IrSyntheticBodyKind.ENUM_VALUEOF ->
|
IrSyntheticBodyKind.ENUM_VALUEOF ->
|
||||||
irCall(backendContext.ir.symbols.enumValueOfFunction).apply {
|
irCall(backendContext.ir.symbols.enumValueOfFunction).apply {
|
||||||
|
|||||||
@@ -3,10 +3,5 @@ enum class Foo {
|
|||||||
open fun result() = "Fail"
|
open fun result() = "Fail"
|
||||||
}
|
}
|
||||||
|
|
||||||
// JVM_TEMPLATES:
|
|
||||||
// There are two CHECKCASTs, one in Foo.valueOf and one in Foo.values
|
// There are two CHECKCASTs, one in Foo.valueOf and one in Foo.values
|
||||||
// 2 CHECKCAST
|
// 2 CHECKCAST
|
||||||
|
|
||||||
// JVM_IR_TEMPLATES:
|
|
||||||
// There should be only one CHECKCAST in Foo.valueOf
|
|
||||||
// 1 CHECKCAST
|
|
||||||
Reference in New Issue
Block a user