From 1a5434bada437422d72067f9dcf461eebe9c4b04 Mon Sep 17 00:00:00 2001 From: Igor Chevdar Date: Tue, 7 Mar 2017 20:23:33 +0300 Subject: [PATCH] Forbade caching of KProperty for local delegated properties. --- .../backend/konan/lower/DelegationLowering.kt | 23 +++++++++---------- 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/DelegationLowering.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/DelegationLowering.kt index 3df4fd71a39..b8eef19c073 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/DelegationLowering.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/DelegationLowering.kt @@ -99,20 +99,19 @@ internal class PropertyDelegationLowering(val context: Context) : FileLoweringPa val propertyDescriptor = expression.descriptor as? VariableDescriptorWithAccessors if (propertyDescriptor == null) return expression val receiversCount = listOf(expression.dispatchReceiver, expression.extensionReceiver).count { it != null } - when (receiversCount) { - 0 -> { // Cache KProperties with no arguments. - val field = kProperties.getOrPut(propertyDescriptor) { - createKProperty(expression, propertyDescriptor) to kProperties.size - } - - return IrCallImpl(expression.startOffset, expression.endOffset, substitutedArrayItemGetter).apply { - dispatchReceiver = IrGetFieldImpl(expression.startOffset, expression.endOffset, kPropertiesField) - putValueArgument(0, IrConstImpl.int(startOffset, endOffset, context.builtIns.intType, field.second)) - } + if (receiversCount == 1 || propertyDescriptor !is PropertyDescriptor) // Has receiver or is local delegated. + return createKProperty(expression, propertyDescriptor) + else if (receiversCount == 0) { // Cache KProperties with no arguments. + val field = kProperties.getOrPut(propertyDescriptor) { + createKProperty(expression, propertyDescriptor) to kProperties.size + } + + return IrCallImpl(expression.startOffset, expression.endOffset, substitutedArrayItemGetter).apply { + dispatchReceiver = IrGetFieldImpl(expression.startOffset, expression.endOffset, kPropertiesField) + putValueArgument(0, IrConstImpl.int(startOffset, endOffset, context.builtIns.intType, field.second)) } - 1 -> return createKProperty(expression, propertyDescriptor) - else -> throw AssertionError("Callable reference to properties with two receivers is not allowed: $propertyDescriptor") } + else throw AssertionError("Callable reference to properties with two receivers is not allowed: $propertyDescriptor") } })