From 4ea4bc1c2bd83e4bf11438043e875d963df0eee4 Mon Sep 17 00:00:00 2001 From: pyos Date: Mon, 2 Sep 2019 10:46:22 +0200 Subject: [PATCH] JVM_IR: pass callee after fake override resolution to source inliner Fixes NPE in: open class A { inline fun f() = 1 } class B : A() { fun g() = f() } --- .../kotlin/backend/jvm/codegen/ExpressionCodegen.kt | 2 +- .../backend/jvm/codegen/IrSourceCompilerForInline.kt | 9 ++++----- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt index c9100684e58..df27812b3e1 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt @@ -989,7 +989,7 @@ class ExpressionCodegen( val original = (callee as? IrSimpleFunction)?.resolveFakeOverride() ?: irFunction val methodOwner = callee.parent.safeAs()?.let(typeMapper::mapClass) ?: MethodSignatureMapper.FAKE_OWNER_TYPE - val sourceCompiler = IrSourceCompilerForInline(state, element, this, data) + val sourceCompiler = IrSourceCompilerForInline(state, element, original, this, data) val reifiedTypeInliner = ReifiedTypeInliner(mappings, object : ReifiedTypeInliner.IntrinsicsSupport { override fun putClassInstance(v: InstructionAdapter, type: IrType) { diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrSourceCompilerForInline.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrSourceCompilerForInline.kt index 0312b3cd57e..7eab6cb22b1 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrSourceCompilerForInline.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrSourceCompilerForInline.kt @@ -21,7 +21,6 @@ import org.jetbrains.kotlin.incremental.components.LookupLocation import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.ir.declarations.IrClass import org.jetbrains.kotlin.ir.declarations.IrFunction -import org.jetbrains.kotlin.ir.expressions.IrCall import org.jetbrains.kotlin.ir.expressions.IrMemberAccessExpression import org.jetbrains.kotlin.ir.util.parentAsClass import org.jetbrains.kotlin.ir.util.render @@ -37,6 +36,7 @@ import org.jetbrains.org.objectweb.asm.tree.MethodNode class IrSourceCompilerForInline( override val state: GenerationState, override val callElement: IrMemberAccessExpression, + private val callee: IrFunction, private val codegen: ExpressionCodegen, private val data: BlockInfo ) : SourceCompilerForInline { @@ -94,15 +94,14 @@ class IrSourceCompilerForInline( callDefault: Boolean, asmMethod: Method ): SMAPAndMethodNode { - assert(callableDescriptor == callElement.descriptor.original) { "Expected $callableDescriptor got ${callElement.descriptor.original}" } + assert(callableDescriptor == callee.descriptor.original) { "Expected $callableDescriptor got ${callee.descriptor.original}" } assert(codegen.lastLineNumber >= 0) { "lastLineNumber shall be not negative, but is ${codegen.lastLineNumber}" } - val irFunction = getFunctionToInline(callElement as IrCall, jvmSignature, callDefault) + val irFunction = getFunctionToInline(jvmSignature, callDefault) return makeInlineNode(irFunction, FakeClassCodegen(irFunction, codegen.classCodegen), CallSiteMarker(codegen.lastLineNumber)) } - private fun getFunctionToInline(call: IrCall, jvmSignature: JvmMethodSignature, callDefault: Boolean): IrFunction { - val callee = call.symbol.owner + private fun getFunctionToInline(jvmSignature: JvmMethodSignature, callDefault: Boolean): IrFunction { val parent = callee.parentAsClass if (callDefault) { /*TODO: get rid of hack*/