Special bridge building fix

This commit is contained in:
Igor Chevdar
2017-12-07 14:40:49 +03:00
parent c30d30c96c
commit c3a6ea4946
@@ -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 */