[IR] Supported IrExpressionBody

This commit is contained in:
Igor Chevdar
2020-08-31 19:22:21 +05:00
parent d65f88850e
commit 23ac87f626
3 changed files with 16 additions and 10 deletions
@@ -732,7 +732,7 @@ internal class CodeGeneratorVisitor(val context: Context, val lifetimes: Map<IrE
}
when (body) {
is IrBlockBody -> body.statements.forEach { generateStatement(it) }
is IrExpressionBody -> generateStatement(body.expression)
is IrExpressionBody -> error("IrExpressionBody should've been lowered")
is IrSyntheticBody -> throw AssertionError("Synthetic body ${body.kind} has not been lowered")
else -> TODO(ir2string(body))
}
@@ -24,7 +24,6 @@ import org.jetbrains.kotlin.ir.descriptors.WrappedValueParameterDescriptor
import org.jetbrains.kotlin.ir.expressions.*
import org.jetbrains.kotlin.ir.expressions.impl.*
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
import org.jetbrains.kotlin.ir.symbols.impl.IrSimpleFunctionSymbolImpl
import org.jetbrains.kotlin.ir.symbols.impl.IrValueParameterSymbolImpl
@@ -149,8 +148,8 @@ internal class BridgesBuilding(val context: Context) : ClassLoweringPass {
override fun visitFunction(declaration: IrFunction): IrStatement {
declaration.transformChildrenVoid(this)
val body = declaration.body as? IrBlockBody
?: return declaration
val body = declaration.body ?: return declaration
val descriptor = declaration.descriptor
val typeSafeBarrierDescription = BuiltinMethodsWithSpecialGenericSignature.getDefaultValueForOverriddenBuiltinFunction(descriptor)
if (typeSafeBarrierDescription == null || builtBridges.contains(declaration))
@@ -159,7 +158,7 @@ internal class BridgesBuilding(val context: Context) : ClassLoweringPass {
val irBuilder = context.createIrBuilder(declaration.symbol, declaration.startOffset, declaration.endOffset)
declaration.body = irBuilder.irBlockBody(declaration) {
buildTypeSafeBarrier(declaration, declaration, typeSafeBarrierDescription)
body.statements.forEach { +it }
(body as IrBlockBody).statements.forEach { +it }
}
return declaration
}
@@ -15,6 +15,7 @@ import org.jetbrains.kotlin.ir.declarations.IrConstructor
import org.jetbrains.kotlin.ir.declarations.IrFile
import org.jetbrains.kotlin.ir.declarations.IrFunction
import org.jetbrains.kotlin.ir.expressions.*
import org.jetbrains.kotlin.ir.expressions.impl.IrBlockBodyImpl
import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
import org.jetbrains.kotlin.ir.visitors.acceptVoid
@@ -31,11 +32,17 @@ internal class ReturnsInsertionLowering(val context: Context) : FileLoweringPass
override fun visitFunction(declaration: IrFunction) {
declaration.acceptChildrenVoid(this)
val body = declaration.body ?: return
if (declaration is IrConstructor || declaration.returnType == context.irBuiltIns.unitType) {
val irBuilder = context.createIrBuilder(declaration.symbol, declaration.endOffset, declaration.endOffset)
irBuilder.run {
(body as IrBlockBody).statements += irReturn(irGetObject(symbols.unit))
context.createIrBuilder(declaration.symbol, declaration.endOffset, declaration.endOffset).run {
when (val body = declaration.body) {
is IrExpressionBody -> {
declaration.body = IrBlockBodyImpl(body.startOffset, body.endOffset) {
statements += irReturn(body.expression)
}
}
is IrBlockBody -> {
if (declaration is IrConstructor || declaration.returnType == context.irBuiltIns.unitType)
body.statements += irReturn(irGetObject(symbols.unit))
}
}
}
}