From 0400a62014846094a327fab581a2bca1bae1b8d2 Mon Sep 17 00:00:00 2001 From: Ivan Kylchik Date: Wed, 25 Mar 2020 15:35:40 +0300 Subject: [PATCH] Improve receivers search in data pool --- .../backend/common/interpreter/IrInterpreter.kt | 2 +- .../kotlin/backend/common/interpreter/Utils.kt | 13 ++++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/interpreter/IrInterpreter.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/interpreter/IrInterpreter.kt index 5f06aef54b0..43c2db179fa 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/interpreter/IrInterpreter.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/interpreter/IrInterpreter.kt @@ -448,7 +448,7 @@ class IrInterpreter(irModule: IrModuleFragment) { val classProperties = irClass.declarations.filterIsInstance() classProperties.forEach { property -> property.backingField?.initializer?.expression?.interpret(data)?.check { return it } - val receiver = irClass.thisReceiver!!.descriptor + val receiver = irClass.descriptor.thisAsReceiverParameter if (property.backingField?.initializer != null) property.backingField?.let { data.getVariableState(receiver).setState(Variable(it.descriptor, data.popReturnValue())) } } diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/interpreter/Utils.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/interpreter/Utils.kt index a527256deb9..73a75713251 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/interpreter/Utils.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/interpreter/Utils.kt @@ -8,11 +8,11 @@ package org.jetbrains.kotlin.backend.common.interpreter import org.jetbrains.kotlin.backend.common.interpreter.builtins.evaluateIntrinsicAnnotation import org.jetbrains.kotlin.backend.common.interpreter.stack.* import org.jetbrains.kotlin.builtins.UnsignedTypes -import org.jetbrains.kotlin.builtins.functions.FunctionInvokeDescriptor import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.impl.IrFunctionImpl +import org.jetbrains.kotlin.ir.descriptors.WrappedReceiverParameterDescriptor import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.impl.IrConstImpl import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol @@ -51,9 +51,20 @@ fun DeclarationDescriptor.equalTo(other: DeclarationDescriptor): Boolean { return this.isSubtypeOf(other) || this.hasSameNameAs(other) || this == other } +private fun WrappedReceiverParameterDescriptor.isEqualTo(other: DeclarationDescriptor): Boolean { + return when (val container = this.containingDeclaration) { + is FunctionDescriptor -> container.dispatchReceiverParameter == other || container.extensionReceiverParameter == other + else -> false + } +} + private fun DeclarationDescriptor.isSubtypeOf(other: DeclarationDescriptor): Boolean { if (this !is ReceiverParameterDescriptor || other !is ReceiverParameterDescriptor) return false return when { + this is WrappedReceiverParameterDescriptor && other is WrappedReceiverParameterDescriptor -> + this.isEqualTo(other) || other.isEqualTo(this) + this is WrappedReceiverParameterDescriptor -> this.isEqualTo(other) + other is WrappedReceiverParameterDescriptor -> other.isEqualTo(this) this.value is ImplicitClassReceiver && other.value is ImplicitClassReceiver -> this.value.type.isSubtypeOf(other.value.type) this.value is ExtensionReceiver && other.value is ExtensionReceiver -> this.value == other.value else -> false