Special bridge building fix
This commit is contained in:
+8
-5
@@ -149,13 +149,14 @@ internal class BridgesBuilding(val context: Context) : ClassLoweringPass {
|
|||||||
|
|
||||||
val body = declaration.body as? IrBlockBody
|
val body = declaration.body as? IrBlockBody
|
||||||
?: return declaration
|
?: return declaration
|
||||||
val typeSafeBarrierDescription = BuiltinMethodsWithSpecialGenericSignature.getDefaultValueForOverriddenBuiltinFunction(declaration.descriptor)
|
val descriptor = declaration.descriptor
|
||||||
if (typeSafeBarrierDescription == null || builtBridges.contains(declaration.descriptor))
|
val typeSafeBarrierDescription = BuiltinMethodsWithSpecialGenericSignature.getDefaultValueForOverriddenBuiltinFunction(descriptor)
|
||||||
|
if (typeSafeBarrierDescription == null || builtBridges.contains(descriptor))
|
||||||
return declaration
|
return declaration
|
||||||
|
|
||||||
val irBuilder = context.createIrBuilder(declaration.symbol, declaration.startOffset, declaration.endOffset)
|
val irBuilder = context.createIrBuilder(declaration.symbol, declaration.startOffset, declaration.endOffset)
|
||||||
declaration.body = irBuilder.irBlockBody(declaration) {
|
declaration.body = irBuilder.irBlockBody(declaration) {
|
||||||
buildTypeSafeBarrier(declaration, typeSafeBarrierDescription)
|
buildTypeSafeBarrier(declaration, descriptor, typeSafeBarrierDescription)
|
||||||
body.statements.forEach { +it }
|
body.statements.forEach { +it }
|
||||||
}
|
}
|
||||||
return declaration
|
return declaration
|
||||||
@@ -199,12 +200,14 @@ private fun IrBuilderWithScope.irConst(value: Any?) = when (value) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun IrBlockBodyBuilder.buildTypeSafeBarrier(function: IrFunction,
|
private fun IrBlockBodyBuilder.buildTypeSafeBarrier(function: IrFunction,
|
||||||
|
originalDescriptor: FunctionDescriptor,
|
||||||
typeSafeBarrierDescription: BuiltinMethodsWithSpecialGenericSignature.TypeSafeBarrierDescription) {
|
typeSafeBarrierDescription: BuiltinMethodsWithSpecialGenericSignature.TypeSafeBarrierDescription) {
|
||||||
val valueParameters = function.valueParameters
|
val valueParameters = function.valueParameters
|
||||||
|
val originalValueParameters = originalDescriptor.valueParameters
|
||||||
for (i in valueParameters.indices) {
|
for (i in valueParameters.indices) {
|
||||||
if (!typeSafeBarrierDescription.checkParameter(i))
|
if (!typeSafeBarrierDescription.checkParameter(i))
|
||||||
continue
|
continue
|
||||||
val type = valueParameters[i].type
|
val type = originalValueParameters[i].type
|
||||||
if (type != context.builtIns.nullableAnyType) {
|
if (type != context.builtIns.nullableAnyType) {
|
||||||
+returnIfBadType(irGet(valueParameters[i].symbol), type,
|
+returnIfBadType(irGet(valueParameters[i].symbol), type,
|
||||||
if (typeSafeBarrierDescription == BuiltinMethodsWithSpecialGenericSignature.TypeSafeBarrierDescription.MAP_GET_OR_DEFAULT)
|
if (typeSafeBarrierDescription == BuiltinMethodsWithSpecialGenericSignature.TypeSafeBarrierDescription.MAP_GET_OR_DEFAULT)
|
||||||
@@ -225,7 +228,7 @@ private fun Context.buildBridge(startOffset: Int, endOffset: Int,
|
|||||||
val irBuilder = createIrBuilder(bridge.symbol, startOffset, endOffset)
|
val irBuilder = createIrBuilder(bridge.symbol, startOffset, endOffset)
|
||||||
bridge.body = irBuilder.irBlockBody(bridge) {
|
bridge.body = irBuilder.irBlockBody(bridge) {
|
||||||
val typeSafeBarrierDescription = BuiltinMethodsWithSpecialGenericSignature.getDefaultValueForOverriddenBuiltinFunction(descriptor.overriddenDescriptor)
|
val typeSafeBarrierDescription = BuiltinMethodsWithSpecialGenericSignature.getDefaultValueForOverriddenBuiltinFunction(descriptor.overriddenDescriptor)
|
||||||
typeSafeBarrierDescription?.let { buildTypeSafeBarrier(bridge, it) }
|
typeSafeBarrierDescription?.let { buildTypeSafeBarrier(bridge, descriptor.descriptor, it) }
|
||||||
|
|
||||||
val delegatingCall = IrCallImpl(startOffset, endOffset, targetSymbol, descriptor.descriptor,
|
val delegatingCall = IrCallImpl(startOffset, endOffset, targetSymbol, descriptor.descriptor,
|
||||||
superQualifierSymbol = superQualifierSymbol /* Call non-virtually */
|
superQualifierSymbol = superQualifierSymbol /* Call non-virtually */
|
||||||
|
|||||||
Reference in New Issue
Block a user