Support extensions in bridge lowering

This commit is contained in:
Mikhael Bogdanov
2018-05-30 16:34:49 +02:00
parent 5fa54dc854
commit 8767e0924b
@@ -195,25 +195,25 @@ class BridgeLowering(val context: JvmBackendContext) : ClassLoweringPass {
ACC_PUBLIC or ACC_BRIDGE or (if (!isSpecialOrDelegationToSuper) ACC_SYNTHETIC else 0) or if (isSpecialBridge) ACC_FINAL else 0 // TODO. ACC_PUBLIC or ACC_BRIDGE or (if (!isSpecialOrDelegationToSuper) ACC_SYNTHETIC else 0) or if (isSpecialBridge) ACC_FINAL else 0 // TODO.
val containingClass = descriptor.containingDeclaration as ClassDescriptor val containingClass = descriptor.containingDeclaration as ClassDescriptor
//here some 'isSpecialBridge' magic //here some 'isSpecialBridge' magic
val bridgeDescriptor = JvmFunctionDescriptorImpl( val bridgeDescriptorForIrFunction = JvmFunctionDescriptorImpl(
containingClass, null, Annotations.EMPTY, Name.identifier(bridge.method.name), containingClass, null, Annotations.EMPTY, Name.identifier(bridge.method.name),
CallableMemberDescriptor.Kind.SYNTHESIZED, descriptor.source, flags CallableMemberDescriptor.Kind.SYNTHESIZED, descriptor.source, flags
) )
bridgeDescriptor.initialize( bridgeDescriptorForIrFunction.initialize(
null, containingClass.thisAsReceiverParameter, emptyList(), bridge.descriptor.extensionReceiverParameter?.returnType, containingClass.thisAsReceiverParameter, emptyList(),
bridge.descriptor.valueParameters.map { it.copy(bridgeDescriptor, it.name, it.index) }, bridge.descriptor.valueParameters.map { it.copy(bridgeDescriptorForIrFunction, it.name, it.index) },
bridge.descriptor.returnType, Modality.OPEN, descriptor.visibility bridge.descriptor.returnType, Modality.OPEN, descriptor.visibility
) )
val irFunction = IrFunctionImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, IrDeclarationOrigin.DEFINED, bridgeDescriptor) val irFunction = IrFunctionImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, IrDeclarationOrigin.DEFINED, bridgeDescriptorForIrFunction)
irFunction.createParameterDeclarations() irFunction.createParameterDeclarations()
context.createIrBuilder(irFunction.symbol).irBlockBody(irFunction) { context.createIrBuilder(irFunction.symbol).irBlockBody(irFunction) {
//TODO //TODO
//MemberCodegen.markLineNumberForDescriptor(owner.getThisDescriptor(), iv) //MemberCodegen.markLineNumberForDescriptor(owner.getThisDescriptor(), iv)
if (delegateTo.method.argumentTypes.isNotEmpty() && isSpecialBridge) { if (delegateTo.method.argumentTypes.isNotEmpty() && isSpecialBridge) {
generateTypeCheckBarrierIfNeeded(descriptor, bridgeDescriptor, irFunction, delegateTo.method.argumentTypes) generateTypeCheckBarrierIfNeeded(descriptor, bridgeDescriptorForIrFunction, irFunction, delegateTo.method.argumentTypes)
} }
val implementation = if (isSpecialBridge) delegateTo.descriptor.copyAsDeclaration() else delegateTo.descriptor val implementation = if (isSpecialBridge) delegateTo.descriptor.copyAsDeclaration() else delegateTo.descriptor
@@ -228,6 +228,14 @@ class BridgeLowering(val context: JvmBackendContext) : ClassLoweringPass {
irFunction.dispatchReceiverParameter!!.symbol, irFunction.dispatchReceiverParameter!!.symbol,
JvmLoweredStatementOrigin.BRIDGE_DELEGATION JvmLoweredStatementOrigin.BRIDGE_DELEGATION
) )
irFunction.extensionReceiverParameter?.let {
call.extensionReceiver = IrGetValueImpl(
UNDEFINED_OFFSET,
UNDEFINED_OFFSET,
it.symbol,
JvmLoweredStatementOrigin.BRIDGE_DELEGATION
)
}
irFunction.valueParameters.mapIndexed { i, valueParameter -> irFunction.valueParameters.mapIndexed { i, valueParameter ->
call.putValueArgument( call.putValueArgument(
i, i,