WASM: Stupidify unit handling

Now every IR instruction returns an actual Unit instance.
All Unit's are actual objects passed around except for function boundaries.
This commit is contained in:
Igor Laevsky
2021-09-02 17:06:30 +03:00
committed by TeamCityServer
parent 37874b1937
commit a246ec636e
15 changed files with 190 additions and 112 deletions
@@ -192,21 +192,6 @@ class AutoboxingTransformer(context: JsCommonBackendContext) : AbstractValueUsag
}
}
class UnitMaterializationPass(val context: JsCommonBackendContext) : AbstractValueUsageTransformer(context.irBuiltIns), BodyLoweringPass {
override fun lower(irBody: IrBody, container: IrDeclaration) {
irBody.transformChildrenVoid()
}
override fun IrExpression.useAsValue(value: IrValueDeclaration): IrExpression {
if (this.type == irBuiltIns.unitType && !this.isGetUnit(irBuiltIns)) {
val unitValue = JsIrBuilder.buildGetObjectValue(type, irBuiltIns.unitClass)
return JsIrBuilder.buildComposite(type, listOf(this, unitValue))
}
return this
}
}
private tailrec fun IrExpression.isGetUnit(irBuiltIns: IrBuiltIns): Boolean =
when (this) {
is IrContainerExpression ->