[Wasm] Handle IrClass::thisReceiver receiver outside of constructors
This commit is contained in:
+10
-2
@@ -16,6 +16,7 @@ import org.jetbrains.kotlin.backend.wasm.utils.*
|
|||||||
import org.jetbrains.kotlin.ir.IrBuiltIns
|
import org.jetbrains.kotlin.ir.IrBuiltIns
|
||||||
import org.jetbrains.kotlin.ir.IrElement
|
import org.jetbrains.kotlin.ir.IrElement
|
||||||
import org.jetbrains.kotlin.ir.backend.js.utils.findUnitGetInstanceFunction
|
import org.jetbrains.kotlin.ir.backend.js.utils.findUnitGetInstanceFunction
|
||||||
|
import org.jetbrains.kotlin.ir.backend.js.utils.isDispatchReceiver
|
||||||
import org.jetbrains.kotlin.ir.backend.js.utils.realOverrideTarget
|
import org.jetbrains.kotlin.ir.backend.js.utils.realOverrideTarget
|
||||||
import org.jetbrains.kotlin.ir.declarations.*
|
import org.jetbrains.kotlin.ir.declarations.*
|
||||||
import org.jetbrains.kotlin.ir.expressions.*
|
import org.jetbrains.kotlin.ir.expressions.*
|
||||||
@@ -175,9 +176,16 @@ class BodyGenerator(val context: WasmFunctionCodegenContext) : IrElementVisitorV
|
|||||||
|
|
||||||
override fun visitGetValue(expression: IrGetValue) {
|
override fun visitGetValue(expression: IrGetValue) {
|
||||||
val valueSymbol = expression.symbol
|
val valueSymbol = expression.symbol
|
||||||
body.buildGetLocal(context.referenceLocal(valueSymbol))
|
|
||||||
|
|
||||||
val valueDeclaration = valueSymbol.owner
|
val valueDeclaration = valueSymbol.owner
|
||||||
|
body.buildGetLocal(
|
||||||
|
// Handle cases when IrClass::thisReceiver is referenced instead
|
||||||
|
// of the value parameter of current function
|
||||||
|
if (valueDeclaration.isDispatchReceiver)
|
||||||
|
context.referenceLocal(0)
|
||||||
|
else
|
||||||
|
context.referenceLocal(valueSymbol)
|
||||||
|
)
|
||||||
|
|
||||||
if (valueSymbol.owner is IrValueParameter) {
|
if (valueSymbol.owner is IrValueParameter) {
|
||||||
val parent = valueDeclaration.parent
|
val parent = valueDeclaration.parent
|
||||||
if (parent is IrFunction && parent.isExported(backendContext)) {
|
if (parent is IrFunction && parent.isExported(backendContext)) {
|
||||||
|
|||||||
+4
-1
@@ -20,6 +20,7 @@ import org.jetbrains.kotlin.ir.expressions.IrExpression
|
|||||||
import org.jetbrains.kotlin.ir.expressions.IrGetValue
|
import org.jetbrains.kotlin.ir.expressions.IrGetValue
|
||||||
import org.jetbrains.kotlin.ir.types.isAny
|
import org.jetbrains.kotlin.ir.types.isAny
|
||||||
import org.jetbrains.kotlin.ir.util.isInterface
|
import org.jetbrains.kotlin.ir.util.isInterface
|
||||||
|
import org.jetbrains.kotlin.ir.util.parentAsClass
|
||||||
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
|
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
|
||||||
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
|
||||||
@@ -76,10 +77,12 @@ class EraseVirtualDispatchReceiverParametersTypes(val context: CommonBackendCont
|
|||||||
val newReceiver = oldReceiver.copyTo(irFunction, type = context.irBuiltIns.anyType)
|
val newReceiver = oldReceiver.copyTo(irFunction, type = context.irBuiltIns.anyType)
|
||||||
irFunction.dispatchReceiverParameter = newReceiver
|
irFunction.dispatchReceiverParameter = newReceiver
|
||||||
|
|
||||||
|
val classThisReceiverSymbol = irFunction.parentAsClass.thisReceiver?.symbol
|
||||||
|
|
||||||
// Cast receiver usages back to original type
|
// Cast receiver usages back to original type
|
||||||
irFunction.transformChildrenVoid(object : IrElementTransformerVoid() {
|
irFunction.transformChildrenVoid(object : IrElementTransformerVoid() {
|
||||||
override fun visitGetValue(expression: IrGetValue): IrExpression {
|
override fun visitGetValue(expression: IrGetValue): IrExpression {
|
||||||
if (expression.symbol == oldReceiver.symbol) {
|
if (expression.symbol == oldReceiver.symbol || expression.symbol == classThisReceiverSymbol) {
|
||||||
return with(builder) {
|
return with(builder) {
|
||||||
irImplicitCast(irGet(newReceiver), originalReceiverType)
|
irImplicitCast(irGet(newReceiver), originalReceiverType)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user