Do not generate empty bodies for suspend functions

This commit is contained in:
Ilmir Usmanov
2019-06-06 19:39:00 +03:00
parent 95a65ba94d
commit ca421e0aa5
@@ -48,7 +48,7 @@ open class FunctionCodegen(
val signature = classCodegen.typeMapper.mapSignatureWithGeneric(irFunction, OwnerKind.IMPLEMENTATION) val signature = classCodegen.typeMapper.mapSignatureWithGeneric(irFunction, OwnerKind.IMPLEMENTATION)
val flags = calculateMethodFlags(irFunction.isStatic) val flags = calculateMethodFlags(irFunction.isStatic)
val methodVisitor = createMethod(flags, signature) var methodVisitor = createMethod(flags, signature)
generateParameterNames(irFunction, methodVisitor, signature, state, flags.and(Opcodes.ACC_SYNTHETIC) != 0) generateParameterNames(irFunction, methodVisitor, signature, state, flags.and(Opcodes.ACC_SYNTHETIC) != 0)
@@ -68,33 +68,16 @@ open class FunctionCodegen(
val element = irFunction.symbol.descriptor.psiElement as? KtElement val element = irFunction.symbol.descriptor.psiElement as? KtElement
?: classCodegen.context.suspendLambdaClasses[classCodegen.context.suspendLambdaClasses.keys.find { it == irFunction.parent }] ?: classCodegen.context.suspendLambdaClasses[classCodegen.context.suspendLambdaClasses.keys.find { it == irFunction.parent }]
val continuationClassBuilder = classCodegen.context.continuationClassBuilders[irClass] val continuationClassBuilder = classCodegen.context.continuationClassBuilders[irClass]
ExpressionCodegen( methodVisitor = when {
irFunction, irFunction.isSuspend -> generateStateMachineForNamedFunction(
frameMap, irFunction, classCodegen, methodVisitor, flags, signature, continuationClassBuilder, element!!
InstructionAdapter( )
when { irFunction.isInvokeSuspendOfLambda(classCodegen.context) -> generateStateMachineForLambda(
irFunction.isSuspend -> generateStateMachineForNamedFunction( classCodegen, methodVisitor, flags, signature, element!!
irFunction, )
classCodegen, else -> methodVisitor
methodVisitor, }
flags, ExpressionCodegen(irFunction, frameMap, InstructionAdapter(methodVisitor), classCodegen, isInlineLambda).generate()
signature,
continuationClassBuilder,
element!!
)
irFunction.isInvokeSuspendOfLambda(classCodegen.context) -> generateStateMachineForLambda(
classCodegen,
methodVisitor,
flags,
signature,
element!!
)
else -> methodVisitor
}
),
classCodegen,
isInlineLambda
).generate()
methodVisitor.visitMaxs(-1, -1) methodVisitor.visitMaxs(-1, -1)
continuationClassBuilder?.done() continuationClassBuilder?.done()
} }