Implement interpretation for object with overridden methods
This commit is contained in:
+1
-2
@@ -627,8 +627,7 @@ class IrInterpreter(irModule: IrModuleFragment) {
|
|||||||
data.pushReturnValue(Wrapper.getCompanionObject(owner))
|
data.pushReturnValue(Wrapper.getCompanionObject(owner))
|
||||||
return Next
|
return Next
|
||||||
}
|
}
|
||||||
val objectState = Common(owner)
|
data.pushReturnValue(Common(owner).apply { setSuperClassRecursive() })
|
||||||
data.pushReturnValue(objectState)
|
|
||||||
return Next
|
return Next
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+24
@@ -9,7 +9,9 @@ import org.jetbrains.kotlin.backend.common.interpreter.stack.Variable
|
|||||||
import org.jetbrains.kotlin.ir.declarations.IrClass
|
import org.jetbrains.kotlin.ir.declarations.IrClass
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrFunction
|
import org.jetbrains.kotlin.ir.declarations.IrFunction
|
||||||
import org.jetbrains.kotlin.ir.declarations.impl.IrFunctionImpl
|
import org.jetbrains.kotlin.ir.declarations.impl.IrFunctionImpl
|
||||||
|
import org.jetbrains.kotlin.ir.types.classOrNull
|
||||||
import org.jetbrains.kotlin.ir.util.fqNameForIrSerialization
|
import org.jetbrains.kotlin.ir.util.fqNameForIrSerialization
|
||||||
|
import org.jetbrains.kotlin.ir.util.isInterface
|
||||||
|
|
||||||
class Common private constructor(
|
class Common private constructor(
|
||||||
override val irClass: IrClass, override val fields: MutableList<Variable>, superClass: Complex?, subClass: Complex?
|
override val irClass: IrClass, override val fields: MutableList<Variable>, superClass: Complex?, subClass: Complex?
|
||||||
@@ -17,6 +19,28 @@ class Common private constructor(
|
|||||||
|
|
||||||
constructor(irClass: IrClass) : this(irClass, mutableListOf(), null, null)
|
constructor(irClass: IrClass) : this(irClass, mutableListOf(), null, null)
|
||||||
|
|
||||||
|
fun setSuperClassRecursive() {
|
||||||
|
var thisClass: Common? = this
|
||||||
|
while (thisClass != null) {
|
||||||
|
val superClass = thisClass.irClass.superTypes.filterNot { it.isInterface() }.singleOrNull()
|
||||||
|
val superClassOwner = superClass?.classOrNull?.owner
|
||||||
|
val superClassState = superClassOwner?.let { Common(it) }
|
||||||
|
superClassState?.let { thisClass!!.setSuperClassInstance(it) }
|
||||||
|
|
||||||
|
if (superClass == null && thisClass.irClass.superTypes.isNotEmpty()) {
|
||||||
|
// cover the case when super type implement an interface and so doesn't have explicit any as super class
|
||||||
|
thisClass.setSuperClassInstance(Common(getAnyClassRecursive()))
|
||||||
|
}
|
||||||
|
thisClass = superClassState
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getAnyClassRecursive(): IrClass {
|
||||||
|
var owner = irClass.superTypes.first().classOrNull!!.owner
|
||||||
|
while (owner.superTypes.isNotEmpty()) owner = owner.superTypes.first().classOrNull!!.owner
|
||||||
|
return owner
|
||||||
|
}
|
||||||
|
|
||||||
fun getToStringFunction(): IrFunctionImpl {
|
fun getToStringFunction(): IrFunctionImpl {
|
||||||
return irClass.declarations.filterIsInstance<IrFunction>()
|
return irClass.declarations.filterIsInstance<IrFunction>()
|
||||||
.filter { it.descriptor.name.asString() == "toString" }
|
.filter { it.descriptor.name.asString() == "toString" }
|
||||||
|
|||||||
Reference in New Issue
Block a user