[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) { when (body) {
is IrBlockBody -> body.statements.forEach { generateStatement(it) } 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") is IrSyntheticBody -> throw AssertionError("Synthetic body ${body.kind} has not been lowered")
else -> TODO(ir2string(body)) 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.*
import org.jetbrains.kotlin.ir.expressions.impl.* import org.jetbrains.kotlin.ir.expressions.impl.*
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol 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.IrSimpleFunctionSymbol
import org.jetbrains.kotlin.ir.symbols.impl.IrSimpleFunctionSymbolImpl import org.jetbrains.kotlin.ir.symbols.impl.IrSimpleFunctionSymbolImpl
import org.jetbrains.kotlin.ir.symbols.impl.IrValueParameterSymbolImpl 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 { override fun visitFunction(declaration: IrFunction): IrStatement {
declaration.transformChildrenVoid(this) declaration.transformChildrenVoid(this)
val body = declaration.body as? IrBlockBody val body = declaration.body ?: return declaration
?: return declaration
val descriptor = declaration.descriptor val descriptor = declaration.descriptor
val typeSafeBarrierDescription = BuiltinMethodsWithSpecialGenericSignature.getDefaultValueForOverriddenBuiltinFunction(descriptor) val typeSafeBarrierDescription = BuiltinMethodsWithSpecialGenericSignature.getDefaultValueForOverriddenBuiltinFunction(descriptor)
if (typeSafeBarrierDescription == null || builtBridges.contains(declaration)) 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) val irBuilder = context.createIrBuilder(declaration.symbol, declaration.startOffset, declaration.endOffset)
declaration.body = irBuilder.irBlockBody(declaration) { declaration.body = irBuilder.irBlockBody(declaration) {
buildTypeSafeBarrier(declaration, declaration, typeSafeBarrierDescription) buildTypeSafeBarrier(declaration, declaration, typeSafeBarrierDescription)
body.statements.forEach { +it } (body as IrBlockBody).statements.forEach { +it }
} }
return declaration 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.IrFile
import org.jetbrains.kotlin.ir.declarations.IrFunction import org.jetbrains.kotlin.ir.declarations.IrFunction
import org.jetbrains.kotlin.ir.expressions.* 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.IrElementVisitorVoid
import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
import org.jetbrains.kotlin.ir.visitors.acceptVoid import org.jetbrains.kotlin.ir.visitors.acceptVoid
@@ -31,11 +32,17 @@ internal class ReturnsInsertionLowering(val context: Context) : FileLoweringPass
override fun visitFunction(declaration: IrFunction) { override fun visitFunction(declaration: IrFunction) {
declaration.acceptChildrenVoid(this) declaration.acceptChildrenVoid(this)
val body = declaration.body ?: return context.createIrBuilder(declaration.symbol, declaration.endOffset, declaration.endOffset).run {
if (declaration is IrConstructor || declaration.returnType == context.irBuiltIns.unitType) { when (val body = declaration.body) {
val irBuilder = context.createIrBuilder(declaration.symbol, declaration.endOffset, declaration.endOffset) is IrExpressionBody -> {
irBuilder.run { declaration.body = IrBlockBodyImpl(body.startOffset, body.endOffset) {
(body as IrBlockBody).statements += irReturn(irGetObject(symbols.unit)) statements += irReturn(body.expression)
}
}
is IrBlockBody -> {
if (declaration is IrConstructor || declaration.returnType == context.irBuiltIns.unitType)
body.statements += irReturn(irGetObject(symbols.unit))
}
} }
} }
} }