Skip to content

Commit 9c13804

Browse files
udalovSpace Team
authored andcommitted
JVM: do not eagerly wrap delegated properties into full reflection objects
#KT-81974 Fixed
1 parent 989d165 commit 9c13804

File tree

2 files changed

+5
-47
lines changed

2 files changed

+5
-47
lines changed

compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/PropertyReferenceLowering.kt

Lines changed: 5 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -168,12 +168,7 @@ internal class PropertyReferenceLowering(val context: JvmBackendContext) : IrEle
168168
parameters = listOf(thisReceiver!!.copyTo(this)) + method.nonDispatchParameters.map { it.copyTo(this) }
169169
}
170170

171-
private class PropertyReferenceKind(
172-
val implSymbol: IrClassSymbol,
173-
val wrapper: IrFunction
174-
)
175-
176-
private fun propertyReferenceKindFor(expression: IrRichPropertyReference): PropertyReferenceKind {
171+
private fun propertyReferenceClassFor(expression: IrRichPropertyReference): IrClassSymbol {
177172
val boundReceivers = expression.getBoundValues(REFLECTED_PROPERTY)
178173
val getterFunction = expression.originalGetter ?: expression.getterFunction
179174
val needReceiversCount = getterFunction.parameters.size + if (getterFunction.isJvmStaticInObject()) 1 else 0
@@ -183,13 +178,7 @@ internal class PropertyReferenceLowering(val context: JvmBackendContext) : IrEle
183178
val mutable = expression.setterFunction != null
184179
val i = needReceiversCount - boundReceivers.size
185180
check(i in 0..2) { "Incorrect number of receivers ($i) for property reference: ${expression.render()}" }
186-
val symbols = context.symbols
187-
return PropertyReferenceKind(
188-
symbols.getPropertyReferenceClass(mutable, i, true),
189-
symbols.reflection.owner.functions.single {
190-
it.name.asString() == (if (mutable) "mutableProperty$i" else "property$i")
191-
}
192-
)
181+
return context.symbols.getPropertyReferenceClass(mutable, i, true)
193182
}
194183

195184
private data class PropertyInstance(val initializer: IrExpression, val index: Int)
@@ -328,16 +317,15 @@ internal class PropertyReferenceLowering(val context: JvmBackendContext) : IrEle
328317
val boundReceivers = expression.getBoundValues(REFLECTED_PROPERTY)
329318
require(boundReceivers.size <= 1) { "Property references can not capture more than one receiver: ${expression.dump()}" }
330319
val boundReceiver = boundReceivers.firstOrNull()
331-
val referenceKind = propertyReferenceKindFor(expression)
320+
val referenceClass = propertyReferenceClassFor(expression)
332321
return context.createJvmIrBuilder(currentScope!!, expression).run {
333322
val arity = when {
334323
boundReceiver != null -> 5 // (receiver, jClass, name, desc, flags)
335324
else -> 4 // (jClass, name, desc, flags)
336325
}
337-
val instance = irCall(referenceKind.implSymbol.constructors.single { it.owner.parameters.size == arity }).apply {
326+
irCall(referenceClass.constructors.single { it.owner.parameters.size == arity }).apply {
338327
fillReflectedPropertyArguments(this, expression, boundReceiver?.let(expression.boundValues::get))
339328
}
340-
irCall(referenceKind.wrapper).apply { arguments[0] = instance }
341329
}
342330
}
343331

@@ -398,7 +386,7 @@ internal class PropertyReferenceLowering(val context: JvmBackendContext) : IrEle
398386
getterBoundValues: List<Int>,
399387
setterBoundValues: List<Int>,
400388
): IrClass {
401-
val superClass = propertyReferenceKindFor(expression).implSymbol.owner
389+
val superClass = propertyReferenceClassFor(expression).owner
402390
val referenceClass = context.irFactory.buildClass {
403391
setSourceRange(expression)
404392
name = SpecialNames.NO_NAME_PROVIDED

compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmSymbols.kt

Lines changed: 0 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -561,33 +561,6 @@ class JvmSymbols(
561561
}
562562
}
563563

564-
val reflection: IrClassSymbol = createClass(FqName("kotlin.jvm.internal.Reflection")) { klass ->
565-
val javaLangClassType = javaLangClass.starProjectedType
566-
val kClassType = irBuiltIns.kClassClass.starProjectedType
567-
568-
klass.addFunction("getOrCreateKotlinPackage", kDeclarationContainer.defaultType, isStatic = true).apply {
569-
addValueParameter("javaClass", javaLangClassType)
570-
addValueParameter("moduleName", irBuiltIns.stringType)
571-
}
572-
573-
klass.addFunction("getOrCreateKotlinClass", kClassType, isStatic = true).apply {
574-
addValueParameter("javaClass", javaLangClassType)
575-
}
576-
577-
klass.addFunction("getOrCreateKotlinClasses", irBuiltIns.arrayClass.typeWith(kClassType), isStatic = true).apply {
578-
addValueParameter("javaClasses", irBuiltIns.arrayClass.typeWith(javaLangClassType))
579-
}
580-
581-
for (mutable in listOf(false, true)) {
582-
for (n in 0..2) {
583-
val functionName = (if (mutable) "mutableProperty" else "property") + n
584-
klass.addFunction(functionName, irBuiltIns.getKPropertyClass(mutable, n).starProjectedType, isStatic = true).apply {
585-
addValueParameter("p", getPropertyReferenceClass(mutable, n, impl = false).defaultType)
586-
}
587-
}
588-
}
589-
}
590-
591564
val javaLangReflectSymbols: JvmReflectSymbols by lazy {
592565
JvmReflectSymbols(context)
593566
}
@@ -596,9 +569,6 @@ class JvmSymbols(
596569
klass.addFunction("getFunctionDelegate", irBuiltIns.functionClass.starProjectedType, Modality.ABSTRACT)
597570
}
598571

599-
val getOrCreateKotlinPackage: IrSimpleFunctionSymbol =
600-
reflection.functionByName("getOrCreateKotlinPackage")
601-
602572
val desiredAssertionStatus: IrSimpleFunctionSymbol by lazy {
603573
javaLangClass.functionByName("desiredAssertionStatus")
604574
}

0 commit comments

Comments
 (0)