Support more cases in special bridge lowering

This commit is contained in:
Mikhael Bogdanov
2018-06-13 10:13:38 +02:00
parent 64835c1c9c
commit ede751c074
2 changed files with 21 additions and 14 deletions
@@ -62,6 +62,7 @@ import org.jetbrains.kotlin.load.java.getOverriddenBuiltinReflectingJvmDescripto
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils.getSourceFromDescriptor import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils.getSourceFromDescriptor
import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.DescriptorUtils
import org.jetbrains.kotlin.resolve.DescriptorUtils.getSuperClassDescriptor
import org.jetbrains.kotlin.resolve.DescriptorUtils.isInterface import org.jetbrains.kotlin.resolve.DescriptorUtils.isInterface
import org.jetbrains.kotlin.resolve.annotations.hasJvmDefaultAnnotation import org.jetbrains.kotlin.resolve.annotations.hasJvmDefaultAnnotation
import org.jetbrains.kotlin.resolve.jvm.AsmTypes.OBJECT_TYPE import org.jetbrains.kotlin.resolve.jvm.AsmTypes.OBJECT_TYPE
@@ -212,7 +213,7 @@ class BridgeLowering(val context: JvmBackendContext) : ClassLoweringPass {
bridge.descriptor.returnType, Modality.OPEN, descriptor.visibility bridge.descriptor.returnType, Modality.OPEN, descriptor.visibility
) )
val irFunction = IrFunctionImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, IrDeclarationOrigin.DEFINED, bridgeDescriptorForIrFunction) val irFunction = IrFunctionImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, IrDeclarationOrigin.BRIDGE, bridgeDescriptorForIrFunction)
irFunction.createParameterDeclarations() irFunction.createParameterDeclarations()
context.createIrBuilder(irFunction.symbol).irBlockBody(irFunction) { context.createIrBuilder(irFunction.symbol).irBlockBody(irFunction) {
@@ -222,11 +223,14 @@ class BridgeLowering(val context: JvmBackendContext) : ClassLoweringPass {
generateTypeCheckBarrierIfNeeded(descriptor, bridgeDescriptorForIrFunction, 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.copyAsDeclaration() else delegateTo.descriptor
val call = IrCallImpl( val call = IrCallImpl(
UNDEFINED_OFFSET, UNDEFINED_OFFSET, UNDEFINED_OFFSET, UNDEFINED_OFFSET,
implementation, implementation,
null, JvmLoweredStatementOrigin.BRIDGE_DELEGATION, null null, JvmLoweredStatementOrigin.BRIDGE_DELEGATION,
if (isStubDeclarationWithDelegationToSuper) getSuperClassDescriptor(
descriptor.containingDeclaration as ClassDescriptor
) else null
) )
call.dispatchReceiver = IrGetValueImpl( call.dispatchReceiver = IrGetValueImpl(
UNDEFINED_OFFSET, UNDEFINED_OFFSET,
@@ -321,17 +325,19 @@ class BridgeLowering(val context: JvmBackendContext) : ClassLoweringPass {
SignatureAndDescriptor(typeMapper.mapAsmMethod(descriptor), descriptor) SignatureAndDescriptor(typeMapper.mapAsmMethod(descriptor), descriptor)
} }
fun FunctionDescriptor.copyAsDeclaration(): FunctionDescriptor { fun SignatureAndDescriptor.copyAsDeclaration(): FunctionDescriptor {
val isGetter = this is PropertyGetterDescriptor val containingClass = getDirectMember(descriptor).containingDeclaration as ClassDescriptor
val isAccessor = this is PropertyAccessorDescriptor val delegationDescriptor = JvmFunctionDescriptorImpl(
val directMember = getDirectMember(this) containingClass, null, Annotations.EMPTY, Name.identifier(method.name),
val copy = CallableMemberDescriptor.Kind.SYNTHESIZED, descriptor.source, 0
directMember.copy(directMember.containingDeclaration, directMember.modality, directMember.visibility, DECLARATION, false) )
if (isAccessor) {
val property = copy as PropertyDescriptor delegationDescriptor.initialize(
return if (isGetter) property.getter!! else property.setter!! descriptor.extensionReceiverParameter?.returnType, containingClass.thisAsReceiverParameter, emptyList(),
} descriptor.valueParameters.map { it.copy(delegationDescriptor, it.name, it.index) },
return copy as FunctionDescriptor descriptor.returnType, Modality.OPEN, descriptor.visibility
)
return delegationDescriptor
} }
} }
@@ -36,6 +36,7 @@ interface IrDeclarationOrigin {
object IR_TEMPORARY_VARIABLE : IrDeclarationOriginImpl("IR_TEMPORARY_VARIABLE") object IR_TEMPORARY_VARIABLE : IrDeclarationOriginImpl("IR_TEMPORARY_VARIABLE")
object IR_EXTERNAL_DECLARATION_STUB : IrDeclarationOriginImpl("IR_EXTERNAL_DECLARATION_STUB") object IR_EXTERNAL_DECLARATION_STUB : IrDeclarationOriginImpl("IR_EXTERNAL_DECLARATION_STUB")
object IR_BUILTINS_STUB : IrDeclarationOriginImpl("IR_BUILTINS_STUB") object IR_BUILTINS_STUB : IrDeclarationOriginImpl("IR_BUILTINS_STUB")
object BRIDGE : IrDeclarationOriginImpl("BRIDGE")
} }
abstract class IrDeclarationOriginImpl(val name: String) : IrDeclarationOrigin { abstract class IrDeclarationOriginImpl(val name: String) : IrDeclarationOrigin {