From bf2942b5ccf092e359d935047eeed1886b43fa4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Steven=20Sch=C3=A4fer?= Date: Tue, 16 Mar 2021 18:54:22 +0100 Subject: [PATCH] JVM IR: Add `Object.clone` to JvmSymbols The `clone` function is not available in the builtin classes created from fir. --- .../src/org/jetbrains/kotlin/backend/jvm/JvmSymbols.kt | 8 ++++++++ .../kotlin/backend/jvm/lower/EnumClassLowering.kt | 5 +---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmSymbols.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmSymbols.kt index 156e09b2fe2..3a75c47c837 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmSymbols.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmSymbols.kt @@ -850,6 +850,14 @@ class JvmSymbols( val enumValueOfFunction: IrSimpleFunctionSymbol = javaLangEnum.functionByName("valueOf") + private val javaLangObject: IrClassSymbol = + createClass(FqName("java.lang.Object")) { klass -> + klass.addFunction("clone", irBuiltIns.anyType) + } + + val objectCloneFunction: IrSimpleFunctionSymbol = + javaLangObject.functionByName("clone") + private val kotlinCoroutinesJvmInternalRunSuspendKt = createClass(FqName("kotlin.coroutines.jvm.internal.RunSuspendKt")) { klass -> klass.addFunction("runSuspend", irBuiltIns.unitType, isStatic = true).apply { 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 558fab8a96f..7312dc09c84 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 @@ -154,10 +154,7 @@ private class EnumClassLowering(val context: JvmBackendContext) : ClassLoweringP irExprBody( when (body.kind) { IrSyntheticBodyKind.ENUM_VALUES -> { - val cloneFun = context.irBuiltIns.arrayClass.functions.single { - it.owner.name.asString() == "clone" - } - irCall(cloneFun, declaration.returnType).apply { + irCall(this@EnumClassLowering.context.ir.symbols.objectCloneFunction, declaration.returnType).apply { dispatchReceiver = irGetField(null, valuesField) } }