From fcbc6b84598bef4d4ca95c593070c2a5cba1da35 Mon Sep 17 00:00:00 2001 From: Kristoffer Andersen Date: Fri, 20 May 2022 13:36:59 +0200 Subject: [PATCH] [IR] Improve IR Symbols API and null discipline in ReflectiveAccess lowering --- .../JvmAnnotationImplementationTransformer.kt | 2 +- .../backend/jvm/lower/ReflectiveAccess.kt | 25 +++++++------------ .../backend/jvm/lower/ScriptLowering.kt | 4 +-- .../kotlin/backend/jvm/JvmSymbols.kt | 3 +++ .../kotlin/backend/jvm/ir/JvmIrUtils.kt | 2 +- 5 files changed, 16 insertions(+), 20 deletions(-) diff --git a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/JvmAnnotationImplementationTransformer.kt b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/JvmAnnotationImplementationTransformer.kt index 24d739eb75a..3c04cd79eed 100644 --- a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/JvmAnnotationImplementationTransformer.kt +++ b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/JvmAnnotationImplementationTransformer.kt @@ -67,7 +67,7 @@ class JvmAnnotationImplementationTransformer(val jvmContext: JvmBackendContext, irGet( jvmContext.ir.symbols.javaLangClass.starProjectedType, null, - jvmContext.ir.symbols.kClassJava.owner.getter!!.symbol + jvmContext.ir.symbols.kClassJavaPropertyGetter.symbol ).apply { extensionReceiver = irExpression } diff --git a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/ReflectiveAccess.kt b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/ReflectiveAccess.kt index 7294fac3fa2..eff364117c9 100644 --- a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/ReflectiveAccess.kt +++ b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/ReflectiveAccess.kt @@ -5,15 +5,12 @@ package org.jetbrains.kotlin.backend.jvm.lower -import org.jetbrains.kotlin.backend.common.ClassLoweringPass import org.jetbrains.kotlin.backend.common.FileLoweringPass import org.jetbrains.kotlin.backend.common.IrElementTransformerVoidWithContext import org.jetbrains.kotlin.backend.common.phaser.makeIrFilePhase -import org.jetbrains.kotlin.backend.common.phaser.makeIrModulePhase import org.jetbrains.kotlin.backend.jvm.JvmBackendContext import org.jetbrains.kotlin.backend.jvm.ir.* import org.jetbrains.kotlin.backend.jvm.lower.SyntheticAccessorLowering.Companion.isAccessible -import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET import org.jetbrains.kotlin.ir.builders.* @@ -23,13 +20,9 @@ import org.jetbrains.kotlin.ir.expressions.impl.IrClassReferenceImpl import org.jetbrains.kotlin.ir.symbols.IrClassSymbol import org.jetbrains.kotlin.ir.symbols.IrSymbol import org.jetbrains.kotlin.ir.types.* -import org.jetbrains.kotlin.ir.types.impl.IrSimpleTypeImpl import org.jetbrains.kotlin.ir.util.* -import org.jetbrains.kotlin.ir.visitors.acceptVoid import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid import org.jetbrains.kotlin.load.java.JvmAbi -import org.jetbrains.kotlin.resolve.descriptorUtil.isCompanionObject -import org.jetbrains.kotlin.utils.addToStdlib.safeAs // Used from CodeFragmentCompiler for IDE Debugger Plug-In @Suppress("unused") @@ -106,10 +99,10 @@ internal class ReflectiveAccessLowering( recordCompanionObjectAsDispatchReceiver(expression) expression.transformChildrenVoid(this) - val withSuper = expression.superQualifierSymbol != null + val superQualifier: IrClassSymbol? = expression.superQualifierSymbol val callee = expression.symbol - if (callee.isAccessible(withSuper)) { + if (callee.isAccessible(withSuper = superQualifier != null)) { return expression } return if (expression.origin == IrStatementOrigin.GET_PROPERTY) { @@ -118,8 +111,8 @@ internal class ReflectiveAccessLowering( generateReflectiveAccessForSetter(expression) } else if (expression.dispatchReceiver == null && expression.extensionReceiver == null) { generateReflectiveStaticCall(expression) - } else if (withSuper) { - generateInvokeSpecialForCall(expression) + } else if (superQualifier != null) { + generateInvokeSpecialForCall(expression, superQualifier) } else { generateReflectiveMethodInvocation(expression) } @@ -179,7 +172,7 @@ internal class ReflectiveAccessLowering( private val reflectSymbols = symbols.javaLangReflectSymbols private fun IrBuilderWithScope.javaClassObject(klass: IrType): IrExpression = - irCall(symbols.kClassJava.owner.getter!!).apply { + irCall(symbols.kClassJavaPropertyGetter).apply { extensionReceiver = IrClassReferenceImpl( startOffset, endOffset, @@ -370,7 +363,7 @@ internal class ReflectiveAccessLowering( val classVar = createTmpVariable( javaClassObject(declaringClass), nameHint = "klass", - irType = symbols.kClassJava.owner.getter!!.returnType + irType = symbols.kClassJavaPropertyGetter.returnType ) val fieldVar = createTmpVariable( getDeclaredField(irGet(classVar), fieldName), @@ -495,7 +488,7 @@ internal class ReflectiveAccessLowering( val (fieldLocation, receiver) = fieldLocationAndReceiver(call) return generateReflectiveFieldSet( fieldLocation, - call.symbol.owner.correspondingPropertySymbol!!.owner.name.asString(), + property.name.asString(), call.getValueArgument(0)!!, call.type, receiver, @@ -518,9 +511,9 @@ internal class ReflectiveAccessLowering( // not run on a JVM: it is interpreted by eval4j. Eval4j handles // invokespecial via JDI from which it *is* possible to do the required // super call. - private fun generateInvokeSpecialForCall(expression: IrCall): IrExpression { + private fun generateInvokeSpecialForCall(expression: IrCall, superQualifier: IrClassSymbol): IrExpression { val jvmSignature = context.methodSignatureMapper.mapSignatureSkipGeneric(expression.symbol.owner) - val owner = expression.superQualifierSymbol!!.owner + val owner = superQualifier.owner val builder = context.createJvmIrBuilder(expression.symbol) // invokeSpecial(owner: String, name: String, descriptor: String, isInterface: Boolean): T diff --git a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/ScriptLowering.kt b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/ScriptLowering.kt index fe6a3531c07..f5104f3612e 100644 --- a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/ScriptLowering.kt +++ b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/ScriptLowering.kt @@ -300,7 +300,7 @@ private class ScriptsToClassesLowering(val context: JvmBackendContext, val inner private fun IrClass.addScriptMainFun() { val javaLangClass = context.ir.symbols.javaLangClass - val kClassJava = context.ir.symbols.kClassJava + val kClassJavaPropertyGetter = context.ir.symbols.kClassJavaPropertyGetter val scriptRunnerPackageClass: IrClassSymbol = context.irFactory.buildClass { name = Name.identifier("RunnerKt") @@ -342,7 +342,7 @@ private class ScriptsToClassesLowering(val context: JvmBackendContext, val inner irCall(scriptRunHelper).apply { putValueArgument( 0, - irGet(javaLangClass.starProjectedType, null, kClassJava.owner.getter!!.symbol).apply { + irGet(javaLangClass.starProjectedType, null, kClassJavaPropertyGetter.symbol).apply { extensionReceiver = scriptClassRef } ) 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 e6404c420bb..c3c7037b43b 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 @@ -826,6 +826,9 @@ class JvmSymbols( } }.symbol + val kClassJavaPropertyGetter: IrSimpleFunction = + kClassJava.owner.getter!! + val spreadBuilder: IrClassSymbol = createClass(FqName("kotlin.jvm.internal.SpreadBuilder")) { klass -> klass.addConstructor().apply { addValueParameter("size", irBuiltIns.intType) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/JvmIrUtils.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/JvmIrUtils.kt index 45c8d0fc866..bd363a3cea5 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/JvmIrUtils.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/JvmIrUtils.kt @@ -366,7 +366,7 @@ fun IrBuilderWithScope.kClassReference(classType: IrType): IrClassReference = ) fun JvmIrBuilder.kClassToJavaClass(kClassReference: IrExpression): IrCall = - irGet(irSymbols.javaLangClass.starProjectedType, null, irSymbols.kClassJava.owner.getter!!.symbol).apply { + irGet(irSymbols.javaLangClass.starProjectedType, null, irSymbols.kClassJavaPropertyGetter.symbol).apply { extensionReceiver = kClassReference }