JVM IR: Avoid IMPLICIT_NOTNULL checks on special bridge methods
...with dynamic type checks, except for the `@PlatformDependent` methods, for which the JVM backend adds null checks.
This commit is contained in:
committed by
Alexander Udalov
parent
9026f89ba5
commit
0328fcaf5d
+9
-2
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.backend.common.CommonBackendContext
|
||||
import org.jetbrains.kotlin.backend.common.ir.allOverridden
|
||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
|
||||
import org.jetbrains.kotlin.ir.declarations.IrClass
|
||||
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
|
||||
import org.jetbrains.kotlin.ir.expressions.IrConstKind
|
||||
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
||||
@@ -107,8 +108,14 @@ class SpecialBridgeMethods(val context: CommonBackendContext) {
|
||||
val specialMethodNames = (specialMethodsWithDefaults + specialMethods).map { (description) -> description.name }.toHashSet()
|
||||
val specialPropertyNames = specialProperties.map { (description) -> description.name }.toHashSet()
|
||||
|
||||
fun findSpecialWithOverride(irFunction: IrSimpleFunction): Pair<IrSimpleFunction, SpecialMethodWithDefaultInfo>? {
|
||||
for (overridden in irFunction.allOverridden()) {
|
||||
fun findSpecialWithOverride(
|
||||
irFunction: IrSimpleFunction,
|
||||
includeSelf: Boolean = false
|
||||
): Pair<IrSimpleFunction, SpecialMethodWithDefaultInfo>? {
|
||||
if (irFunction.parent !is IrClass)
|
||||
return null
|
||||
|
||||
for (overridden in irFunction.allOverridden(includeSelf)) {
|
||||
val description = overridden.toDescription()
|
||||
specialMethodsWithDefaults[description]?.let {
|
||||
return Pair(overridden, it)
|
||||
|
||||
+10
-2
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.backend.common.FileLoweringPass
|
||||
import org.jetbrains.kotlin.backend.common.lower.SpecialBridgeMethods
|
||||
import org.jetbrains.kotlin.backend.common.phaser.makeIrFilePhase
|
||||
import org.jetbrains.kotlin.backend.jvm.JvmBackendContext
|
||||
import org.jetbrains.kotlin.backend.jvm.ir.hasPlatformDependent
|
||||
import org.jetbrains.kotlin.ir.IrElement
|
||||
import org.jetbrains.kotlin.ir.IrStatement
|
||||
import org.jetbrains.kotlin.ir.declarations.IrFile
|
||||
@@ -30,7 +31,8 @@ private enum class AssertionScope {
|
||||
Enabled, Disabled
|
||||
}
|
||||
|
||||
private class JvmArgumentNullabilityAssertionsLowering(context: JvmBackendContext) : FileLoweringPass, IrElementTransformer<AssertionScope> {
|
||||
private class JvmArgumentNullabilityAssertionsLowering(context: JvmBackendContext) : FileLoweringPass,
|
||||
IrElementTransformer<AssertionScope> {
|
||||
|
||||
private val isWithUnifiedNullChecks = context.state.unifiedNullChecks
|
||||
private val isCallAssertionsDisabled = context.state.isCallAssertionsDisabled
|
||||
@@ -90,7 +92,13 @@ private class JvmArgumentNullabilityAssertionsLowering(context: JvmBackendContex
|
||||
}
|
||||
|
||||
private fun isCallToMethodWithTypeCheckBarrier(expression: IrMemberAccessExpression<*>): Boolean =
|
||||
expression.symbol.owner.safeAs<IrSimpleFunction>()?.let { specialBridgeMethods.findSpecialWithOverride(it) != null } == true
|
||||
expression.symbol.owner.safeAs<IrSimpleFunction>()
|
||||
?.let {
|
||||
val bridgeInfo = specialBridgeMethods.findSpecialWithOverride(it, includeSelf = true)
|
||||
// The JVM BE adds null checks around platform dependent special bridge methods (Map.getOrDefault and the version of
|
||||
// MutableMap.remove with two arguments).
|
||||
bridgeInfo != null && !bridgeInfo.first.hasPlatformDependent()
|
||||
} == true
|
||||
|
||||
private val IrStatementOrigin?.isOperatorWithNoNullabilityAssertionsOnExtensionReceiver
|
||||
get() = this is IrStatementOrigin.COMPONENT_N || this in operatorsWithNoNullabilityAssertionsOnExtensionReceiver
|
||||
|
||||
Reference in New Issue
Block a user