Remove nullability assertions from special bridge call arguments

This commit is contained in:
Dmitry Petrov
2019-12-23 17:02:30 +03:00
parent fabeca5955
commit cdf9ef63ba
2 changed files with 12 additions and 4 deletions
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.backend.common.FileLoweringPass
import org.jetbrains.kotlin.backend.common.phaser.makeIrFilePhase
import org.jetbrains.kotlin.backend.jvm.JvmBackendContext
import org.jetbrains.kotlin.config.ApiVersion
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.declarations.IrField
import org.jetbrains.kotlin.ir.declarations.IrFile
@@ -17,6 +18,7 @@ import org.jetbrains.kotlin.ir.declarations.IrVariable
import org.jetbrains.kotlin.ir.expressions.*
import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
import org.jetbrains.kotlin.load.java.BuiltinMethodsWithSpecialGenericSignature
val jvmArgumentNullabilityAssertions =
makeIrFilePhase(
@@ -61,7 +63,7 @@ class JvmArgumentNullabilityAssertionsLowering(context: JvmBackendContext) :
extensionReceiver = extensionReceiver?.replaceImplicitNotNullWithArgument()
}
if (isCallAssertionsDisabled) {
if (isCallAssertionsDisabled || isValueArgumentForCallToMethodWithTypeCheckBarrier(expression)) {
for (i in 0 until expression.valueArgumentsCount) {
getValueArgument(i)?.let { irArgument ->
putValueArgument(i, irArgument.replaceImplicitNotNullWithArgument())
@@ -239,5 +241,14 @@ class JvmArgumentNullabilityAssertionsLowering(context: JvmBackendContext) :
else
this
internal fun isValueArgumentForCallToMethodWithTypeCheckBarrier(expression: IrMemberAccessExpression): Boolean {
val descriptor = expression.symbol.descriptor
if (descriptor !is CallableMemberDescriptor) return false
val specialSignatureInfo = with(BuiltinMethodsWithSpecialGenericSignature) {
descriptor.getSpecialSignatureInfo()
}
return specialSignatureInfo?.isObjectReplacedWithTypeParameter ?: false
}
}
}
@@ -1,9 +1,6 @@
// IGNORE_BACKEND_FIR: JVM_IR
// TARGET_BACKEND: JVM
// IGNORE_BACKEND: JVM_IR
// ^ TODO: decide whether special bridges are part of "common Kotlin" or Kotlin/JVM
// FILE: J.java
import java.util.*;