Minor. Reformat

This commit is contained in:
Mikhael Bogdanov
2018-04-24 13:27:27 +02:00
parent 6ca55bafdf
commit ec4ff2f2b5
4 changed files with 150 additions and 114 deletions
@@ -24,6 +24,7 @@ import org.jetbrains.kotlin.codegen.FunctionCodegen
import org.jetbrains.kotlin.codegen.state.GenerationState import org.jetbrains.kotlin.codegen.state.GenerationState
import org.jetbrains.kotlin.descriptors.ClassConstructorDescriptor import org.jetbrains.kotlin.descriptors.ClassConstructorDescriptor
import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.ir.declarations.IrConstructor
import org.jetbrains.kotlin.ir.declarations.IrFunction import org.jetbrains.kotlin.ir.declarations.IrFunction
import org.jetbrains.kotlin.ir.util.dump import org.jetbrains.kotlin.ir.util.dump
import org.jetbrains.kotlin.psi.KtParameter import org.jetbrains.kotlin.psi.KtParameter
@@ -46,8 +47,7 @@ open class FunctionCodegen(private val irFunction: IrFunction, private val class
fun generate() { fun generate() {
try { try {
doGenerate() doGenerate()
} } catch (e: Throwable) {
catch (e: Throwable) {
throw RuntimeException("${e.message} while generating code for:\n${irFunction.dump()}", e) throw RuntimeException("${e.message} while generating code for:\n${irFunction.dump()}", e)
} }
} }
@@ -91,10 +91,12 @@ open class FunctionCodegen(private val irFunction: IrFunction, private val class
} }
open protected fun createMethod(flags: Int, signature: JvmMethodGenericSignature): MethodVisitor { open protected fun createMethod(flags: Int, signature: JvmMethodGenericSignature): MethodVisitor {
return classCodegen.visitor.newMethod(irFunction.OtherOrigin, return classCodegen.visitor.newMethod(
irFunction.OtherOrigin,
flags, flags,
signature.asmMethod.name, signature.asmMethod.descriptor, signature.asmMethod.name, signature.asmMethod.descriptor,
signature.genericsSignature, null/*TODO support exception*/) signature.genericsSignature, null/*TODO support exception*/
)
} }
private fun generateAnnotationDefaultValueIfNeeded(methodVisitor: MethodVisitor) { private fun generateAnnotationDefaultValueIfNeeded(methodVisitor: MethodVisitor) {
@@ -104,7 +106,8 @@ open class FunctionCodegen(private val irFunction: IrFunction, private val class
(source.getPsi() as? KtParameter)?.defaultValue?.apply { (source.getPsi() as? KtParameter)?.defaultValue?.apply {
val defaultValue = this val defaultValue = this
val constant = org.jetbrains.kotlin.codegen.ExpressionCodegen.getCompileTimeConstant( val constant = org.jetbrains.kotlin.codegen.ExpressionCodegen.getCompileTimeConstant(
defaultValue, state.bindingContext, true, state.shouldInlineConstVals) defaultValue, state.bindingContext, true, state.shouldInlineConstVals
)
assert(!state.classBuilderMode.generateBodies || constant != null) { "Default value for annotation parameter should be compile time value: " + defaultValue.text } assert(!state.classBuilderMode.generateBodies || constant != null) { "Default value for annotation parameter should be compile time value: " + defaultValue.text }
if (constant != null) { if (constant != null) {
val annotationCodegen = AnnotationCodegen.forAnnotationDefaultValue(methodVisitor, classCodegen, state.typeMapper) val annotationCodegen = AnnotationCodegen.forAnnotationDefaultValue(methodVisitor, classCodegen, state.typeMapper)
@@ -137,12 +140,10 @@ fun createFrameMapWithReceivers(
val receiverParameter = function.extensionReceiverParameter val receiverParameter = function.extensionReceiverParameter
if (receiverParameter != null) { if (receiverParameter != null) {
frameMap.enter(receiverParameter, state.typeMapper.mapType(receiverParameter)) frameMap.enter(receiverParameter, state.typeMapper.mapType(receiverParameter))
} } else {
else {
frameMap.enterTemp(parameter.asmType) frameMap.enterTemp(parameter.asmType)
} }
} } else if (parameter.kind != JvmMethodParameterKind.VALUE) {
else if (parameter.kind != JvmMethodParameterKind.VALUE) {
frameMap.enterTemp(parameter.asmType) frameMap.enterTemp(parameter.asmType)
} }
} }
@@ -105,8 +105,7 @@ class BridgeLowering(val context: JvmBackendContext) : ClassLoweringPass {
if (!memberDescriptor.kind.isReal && findInterfaceImplementation(memberDescriptor) == null) { if (!memberDescriptor.kind.isReal && findInterfaceImplementation(memberDescriptor) == null) {
if (memberDescriptor is FunctionDescriptor) { if (memberDescriptor is FunctionDescriptor) {
generateBridges(memberDescriptor, irClass) generateBridges(memberDescriptor, irClass)
} } else if (memberDescriptor is PropertyDescriptor) {
else if (memberDescriptor is PropertyDescriptor) {
val getter = memberDescriptor.getter val getter = memberDescriptor.getter
if (getter != null) { if (getter != null) {
generateBridges(getter, irClass) generateBridges(getter, irClass)
@@ -139,14 +138,14 @@ class BridgeLowering(val context: JvmBackendContext) : ClassLoweringPass {
) )
if (!bridgesToGenerate.isEmpty()) { if (!bridgesToGenerate.isEmpty()) {
val origin = if (descriptor.kind == DECLARATION) getSourceFromDescriptor(descriptor) else null val origin = if (descriptor.kind == DECLARATION) getSourceFromDescriptor(descriptor) else null
val isSpecialBridge = BuiltinMethodsWithSpecialGenericSignature.getOverriddenBuiltinFunctionWithErasedValueParametersInJava(descriptor) != null val isSpecialBridge =
BuiltinMethodsWithSpecialGenericSignature.getOverriddenBuiltinFunctionWithErasedValueParametersInJava(descriptor) != null
for (bridge in bridgesToGenerate) { for (bridge in bridgesToGenerate) {
irClass.declarations.add(createBridge(origin, descriptor, bridge.from, bridge.to, isSpecialBridge, false)) irClass.declarations.add(createBridge(origin, descriptor, bridge.from, bridge.to, isSpecialBridge, false))
} }
} }
} } else {
else {
val specials = BuiltinSpecialBridgesUtil.generateBridgesForBuiltinSpecial( val specials = BuiltinSpecialBridgesUtil.generateBridgesForBuiltinSpecial(
descriptor, descriptor,
getSignatureMapper(typeMapper), getSignatureMapper(typeMapper),
@@ -156,15 +155,18 @@ class BridgeLowering(val context: JvmBackendContext) : ClassLoweringPass {
if (!specials.isEmpty()) { if (!specials.isEmpty()) {
val origin = if (descriptor.kind == DECLARATION) getSourceFromDescriptor(descriptor) else null val origin = if (descriptor.kind == DECLARATION) getSourceFromDescriptor(descriptor) else null
for (bridge in specials) { for (bridge in specials) {
irClass.declarations.add(createBridge( irClass.declarations.add(
createBridge(
origin, descriptor, bridge.from, bridge.to, origin, descriptor, bridge.from, bridge.to,
bridge.isSpecial, bridge.isDelegateToSuper)) bridge.isSpecial, bridge.isDelegateToSuper
)
)
} }
} }
if (!descriptor.kind.isReal && isAbstractMethod(descriptor, OwnerKind.IMPLEMENTATION)) { if (!descriptor.kind.isReal && isAbstractMethod(descriptor, OwnerKind.IMPLEMENTATION)) {
descriptor.getOverriddenBuiltinReflectingJvmDescriptor<CallableMemberDescriptor>() ?: descriptor.getOverriddenBuiltinReflectingJvmDescriptor<CallableMemberDescriptor>()
error("Expect to find overridden descriptors for $descriptor") ?: error("Expect to find overridden descriptors for $descriptor")
if (!isThereOverriddenInKotlinClass(descriptor)) { if (!isThereOverriddenInKotlinClass(descriptor)) {
val flags = Opcodes.ACC_ABSTRACT or getVisibilityAccessFlag(descriptor) val flags = Opcodes.ACC_ABSTRACT or getVisibilityAccessFlag(descriptor)
@@ -188,7 +190,8 @@ class BridgeLowering(val context: JvmBackendContext) : ClassLoweringPass {
isStubDeclarationWithDelegationToSuper: Boolean isStubDeclarationWithDelegationToSuper: Boolean
): IrFunction { ): IrFunction {
val isSpecialOrDelegationToSuper = isSpecialBridge || isStubDeclarationWithDelegationToSuper val isSpecialOrDelegationToSuper = isSpecialBridge || isStubDeclarationWithDelegationToSuper
val flags = ACC_PUBLIC or ACC_BRIDGE or (if (!isSpecialOrDelegationToSuper) ACC_SYNTHETIC else 0) or if (isSpecialBridge) ACC_FINAL else 0 // TODO. val flags =
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 bridgeDescriptor = JvmFunctionDescriptorImpl(
@@ -212,12 +215,27 @@ class BridgeLowering(val context: JvmBackendContext) : ClassLoweringPass {
} }
val implementation = if (isSpecialBridge) delegateTo.descriptor.copyAsDeclaration() else delegateTo.descriptor val implementation = if (isSpecialBridge) delegateTo.descriptor.copyAsDeclaration() else delegateTo.descriptor
val call = IrCallImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, val call = IrCallImpl(
UNDEFINED_OFFSET, UNDEFINED_OFFSET,
implementation, implementation,
null, JvmLoweredStatementOrigin.BRIDGE_DELEGATION, null) null, JvmLoweredStatementOrigin.BRIDGE_DELEGATION, null
call.dispatchReceiver = IrGetValueImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, containingClass.thisAsReceiverParameter, JvmLoweredStatementOrigin.BRIDGE_DELEGATION) )
call.dispatchReceiver = IrGetValueImpl(
UNDEFINED_OFFSET,
UNDEFINED_OFFSET,
containingClass.thisAsReceiverParameter,
JvmLoweredStatementOrigin.BRIDGE_DELEGATION
)
bridgeDescriptor.valueParameters.mapIndexed { i, valueParameterDescriptor -> bridgeDescriptor.valueParameters.mapIndexed { i, valueParameterDescriptor ->
call.putValueArgument(i, IrGetValueImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, valueParameterDescriptor, JvmLoweredStatementOrigin.BRIDGE_DELEGATION)) call.putValueArgument(
i,
IrGetValueImpl(
UNDEFINED_OFFSET,
UNDEFINED_OFFSET,
valueParameterDescriptor,
JvmLoweredStatementOrigin.BRIDGE_DELEGATION
)
)
} }
+IrReturnImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, bridgeDescriptor, call) +IrReturnImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, bridgeDescriptor, call)
}.apply { }.apply {
@@ -232,21 +250,22 @@ class BridgeLowering(val context: JvmBackendContext) : ClassLoweringPass {
bridgeDescriptor: FunctionDescriptor, bridgeDescriptor: FunctionDescriptor,
delegateParameterTypes: Array<Type>? delegateParameterTypes: Array<Type>?
) { ) {
val typeSafeBarrierDescription = BuiltinMethodsWithSpecialGenericSignature.getDefaultValueForOverriddenBuiltinFunction(overrideDescriptor) ?: return val typeSafeBarrierDescription =
BuiltinMethodsWithSpecialGenericSignature.getDefaultValueForOverriddenBuiltinFunction(overrideDescriptor) ?: return
BuiltinMethodsWithSpecialGenericSignature.getOverriddenBuiltinFunctionWithErasedValueParametersInJava(overrideDescriptor) ?: BuiltinMethodsWithSpecialGenericSignature.getOverriddenBuiltinFunctionWithErasedValueParametersInJava(overrideDescriptor)
error("Overridden built-in method should not be null for " + overrideDescriptor) ?: error("Overridden built-in method should not be null for " + overrideDescriptor)
val conditions = bridgeDescriptor.valueParameters.withIndex().filter { (i, parameterDescriptor) -> val conditions = bridgeDescriptor.valueParameters.withIndex().filter { (i, parameterDescriptor) ->
typeSafeBarrierDescription.checkParameter(i) || typeSafeBarrierDescription.checkParameter(i) ||
!(delegateParameterTypes == null || OBJECT_TYPE == delegateParameterTypes[i]) || !(delegateParameterTypes == null || OBJECT_TYPE == delegateParameterTypes[i]) ||
!TypeUtils.isNullableType(parameterDescriptor.type) !TypeUtils.isNullableType(parameterDescriptor.type)
}.map { (i, parameterDescriptor) -> }.map { (i, parameterDescriptor) ->
val checkValue = IrGetValueImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, parameterDescriptor, JvmLoweredStatementOrigin.BRIDGE_DELEGATION) val checkValue =
IrGetValueImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, parameterDescriptor, JvmLoweredStatementOrigin.BRIDGE_DELEGATION)
if (delegateParameterTypes == null || OBJECT_TYPE == delegateParameterTypes[i]) { if (delegateParameterTypes == null || OBJECT_TYPE == delegateParameterTypes[i]) {
irNotEquals(checkValue, irNull()) irNotEquals(checkValue, irNull())
} } else {
else {
irIs(checkValue, overrideDescriptor.valueParameters[i].type) irIs(checkValue, overrideDescriptor.valueParameters[i].type)
} }
} }
@@ -262,7 +281,8 @@ class BridgeLowering(val context: JvmBackendContext) : ClassLoweringPass {
MAP_GET_OR_DEFAULT -> irGet(IrVariableSymbolImpl(bridgeDescriptor.valueParameters[1])) MAP_GET_OR_DEFAULT -> irGet(IrVariableSymbolImpl(bridgeDescriptor.valueParameters[1]))
BuiltinMethodsWithSpecialGenericSignature.TypeSafeBarrierDescription.NULL -> irNull() BuiltinMethodsWithSpecialGenericSignature.TypeSafeBarrierDescription.NULL -> irNull()
INDEX -> IrConstImpl.int( INDEX -> IrConstImpl.int(
UNDEFINED_OFFSET, UNDEFINED_OFFSET, context.builtIns.intType, typeSafeBarrierDescription.defaultValue as Int) UNDEFINED_OFFSET, UNDEFINED_OFFSET, context.builtIns.intType, typeSafeBarrierDescription.defaultValue as Int
)
FALSE -> irFalse() FALSE -> irFalse()
} }
) )
@@ -283,7 +303,8 @@ class BridgeLowering(val context: JvmBackendContext) : ClassLoweringPass {
val isGetter = this is PropertyGetterDescriptor val isGetter = this is PropertyGetterDescriptor
val isAccessor = this is PropertyAccessorDescriptor val isAccessor = this is PropertyAccessorDescriptor
val directMember = getDirectMember(this) val directMember = getDirectMember(this)
val copy = directMember.copy(directMember.containingDeclaration, directMember.modality, directMember.visibility, DECLARATION, false) val copy =
directMember.copy(directMember.containingDeclaration, directMember.modality, directMember.visibility, DECLARATION, false)
if (isAccessor) { if (isAccessor) {
val property = copy as PropertyDescriptor val property = copy as PropertyDescriptor
return if (isGetter) property.getter!! else property.setter!! return if (isGetter) property.getter!! else property.setter!!
@@ -58,9 +58,13 @@ class InterfaceDelegationLowering(val state: GenerationState) : IrElementTransfo
if (!interfaceFun.isDefinitelyNotDefaultImplsMethod()) { if (!interfaceFun.isDefinitelyNotDefaultImplsMethod()) {
val inheritedFun = val inheritedFun =
if (classDescriptor !== descriptor) { if (classDescriptor !== descriptor) {
InterfaceLowering.createDefaultImplFunDescriptor(descriptor as DefaultImplsClassDescriptorImpl, interfaceFun, classDescriptor, state.typeMapper) InterfaceLowering.createDefaultImplFunDescriptor(
} descriptor as DefaultImplsClassDescriptorImpl,
else { interfaceFun,
classDescriptor,
state.typeMapper
)
} else {
value value
} }
generateDelegationToDefaultImpl(irClass, interfaceFun, inheritedFun) generateDelegationToDefaultImpl(irClass, interfaceFun, inheritedFun)
@@ -75,9 +79,11 @@ class InterfaceDelegationLowering(val state: GenerationState) : IrElementTransfo
val interfaceDescriptor = interfaceFun.containingDeclaration as ClassDescriptor val interfaceDescriptor = interfaceFun.containingDeclaration as ClassDescriptor
val defaultImpls = InterfaceLowering.createDefaultImplsClassDescriptor(interfaceDescriptor) val defaultImpls = InterfaceLowering.createDefaultImplsClassDescriptor(interfaceDescriptor)
val defaultImplFun = InterfaceLowering.createDefaultImplFunDescriptor(defaultImpls, interfaceFun.original, interfaceDescriptor, state.typeMapper) val defaultImplFun =
InterfaceLowering.createDefaultImplFunDescriptor(defaultImpls, interfaceFun.original, interfaceDescriptor, state.typeMapper)
val returnType = inheritedFun.returnType!! val returnType = inheritedFun.returnType!!
val irCallImpl = IrCallImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, defaultImplFun, null, JvmLoweredStatementOrigin.DEFAULT_IMPLS_DELEGATION) val irCallImpl =
IrCallImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, defaultImplFun, null, JvmLoweredStatementOrigin.DEFAULT_IMPLS_DELEGATION)
irBody.statements.add(IrReturnImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, inheritedFun, irCallImpl)) irBody.statements.add(IrReturnImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, inheritedFun, irCallImpl))
var shift = 0 var shift = 0
@@ -49,7 +49,8 @@ class InterfaceLowering(val state: GenerationState) : IrElementTransformerVoid()
val interfaceDescriptor = irClass.descriptor val interfaceDescriptor = irClass.descriptor
val defaultImplsDescriptor = createDefaultImplsClassDescriptor(interfaceDescriptor) val defaultImplsDescriptor = createDefaultImplsClassDescriptor(interfaceDescriptor)
val defaultImplsIrClass = IrClassImpl(irClass.startOffset, irClass.endOffset, JvmLoweredDeclarationOrigin.DEFAULT_IMPLS, defaultImplsDescriptor) val defaultImplsIrClass =
IrClassImpl(irClass.startOffset, irClass.endOffset, JvmLoweredDeclarationOrigin.DEFAULT_IMPLS, defaultImplsDescriptor)
irClass.declarations.add(defaultImplsIrClass) irClass.declarations.add(defaultImplsIrClass)
val members = defaultImplsIrClass.declarations val members = defaultImplsIrClass.declarations
@@ -57,7 +58,8 @@ class InterfaceLowering(val state: GenerationState) : IrElementTransformerVoid()
irClass.declarations.filterIsInstance<IrFunction>().forEach { irClass.declarations.filterIsInstance<IrFunction>().forEach {
val descriptor = it.descriptor val descriptor = it.descriptor
if (descriptor.modality != Modality.ABSTRACT) { if (descriptor.modality != Modality.ABSTRACT) {
val functionDescriptorImpl = createDefaultImplFunDescriptor(defaultImplsDescriptor, descriptor, interfaceDescriptor, state.typeMapper) val functionDescriptorImpl =
createDefaultImplFunDescriptor(defaultImplsDescriptor, descriptor, interfaceDescriptor, state.typeMapper)
members.add(functionDescriptorImpl.createFunctionAndMapVariables(it)) members.add(functionDescriptorImpl.createFunctionAndMapVariables(it))
it.body = null it.body = null
} }
@@ -71,8 +73,7 @@ class InterfaceLowering(val state: GenerationState) : IrElementTransformerVoid()
val visibility = AsmUtil.getVisibilityAccessFlag(it.descriptor) val visibility = AsmUtil.getVisibilityAccessFlag(it.descriptor)
if (visibility == Opcodes.ACC_PRIVATE && it.descriptor.name != clinitName) { if (visibility == Opcodes.ACC_PRIVATE && it.descriptor.name != clinitName) {
it it
} } else null
else null
} }
val defaultBodies = irClass.declarations.filterIsInstance<IrFunction>().filter { val defaultBodies = irClass.declarations.filterIsInstance<IrFunction>().filter {
@@ -102,7 +103,12 @@ class InterfaceLowering(val state: GenerationState) : IrElementTransformerVoid()
} }
internal fun createStaticFunctionWithReceivers(owner: ClassOrPackageFragmentDescriptor, name: Name, descriptor: FunctionDescriptor, dispatchReceiverType: KotlinType): SimpleFunctionDescriptorImpl { internal fun createStaticFunctionWithReceivers(
owner: ClassOrPackageFragmentDescriptor,
name: Name,
descriptor: FunctionDescriptor,
dispatchReceiverType: KotlinType
): SimpleFunctionDescriptorImpl {
val newFunction = SimpleFunctionDescriptorImpl.create( val newFunction = SimpleFunctionDescriptorImpl.create(
owner, owner,
AnnotationsImpl(emptyList()), AnnotationsImpl(emptyList()),
@@ -113,12 +119,14 @@ internal fun createStaticFunctionWithReceivers(owner: ClassOrPackageFragmentDesc
val dispatchReceiver = val dispatchReceiver =
ValueParameterDescriptorImpl.createWithDestructuringDeclarations( ValueParameterDescriptorImpl.createWithDestructuringDeclarations(
newFunction, null, offset++, AnnotationsImpl(emptyList()), Name.identifier("this"), newFunction, null, offset++, AnnotationsImpl(emptyList()), Name.identifier("this"),
dispatchReceiverType, false, false, false, null, descriptor.source, null) dispatchReceiverType, false, false, false, null, descriptor.source, null
)
val extensionReceiver = val extensionReceiver =
descriptor.extensionReceiverParameter?.let { extensionReceiver -> descriptor.extensionReceiverParameter?.let { extensionReceiver ->
ValueParameterDescriptorImpl.createWithDestructuringDeclarations( ValueParameterDescriptorImpl.createWithDestructuringDeclarations(
newFunction, null, offset++, AnnotationsImpl(emptyList()), Name.identifier("receiver"), newFunction, null, offset++, AnnotationsImpl(emptyList()), Name.identifier("receiver"),
extensionReceiver.value.type, false, false, false, null, extensionReceiver.source, null) extensionReceiver.value.type, false, false, false, null, extensionReceiver.source, null
)
} }
val valueParameters = listOfNotNull(dispatchReceiver, extensionReceiver) + val valueParameters = listOfNotNull(dispatchReceiver, extensionReceiver) +