Add some sort of correct calculation with const modifier
This commit is contained in:
+4
-2
@@ -42,6 +42,7 @@ class IrInterpreter : IrElementVisitor<State, Frame> {
|
|||||||
is IrSetField -> visitSetField(element, data)
|
is IrSetField -> visitSetField(element, data)
|
||||||
is IrGetField -> visitGetField(element, data)
|
is IrGetField -> visitGetField(element, data)
|
||||||
is IrGetValue -> visitGetValue(element, data)
|
is IrGetValue -> visitGetValue(element, data)
|
||||||
|
is IrConst<*> -> visitConst(element, data)
|
||||||
else -> TODO("${element.javaClass} not supported")
|
else -> TODO("${element.javaClass} not supported")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -56,7 +57,7 @@ class IrInterpreter : IrElementVisitor<State, Frame> {
|
|||||||
val dispatchReceiver = expression.dispatchReceiver?.accept(this, data)
|
val dispatchReceiver = expression.dispatchReceiver?.accept(this, data)
|
||||||
?.setDescriptor(expression.symbol.descriptor.dispatchReceiverParameter!!)
|
?.setDescriptor(expression.symbol.descriptor.dispatchReceiverParameter!!)
|
||||||
val extensionReceiver = expression.extensionReceiver?.accept(this, data)
|
val extensionReceiver = expression.extensionReceiver?.accept(this, data)
|
||||||
?.setDescriptor(expression.symbol.descriptor.extensionReceiverParameter?.containingDeclaration!!)
|
?.setDescriptor(expression.symbol.descriptor.extensionReceiverParameter!!)
|
||||||
(dispatchReceiver ?: extensionReceiver)?.also { newFrame.addVar(it) }
|
(dispatchReceiver ?: extensionReceiver)?.also { newFrame.addVar(it) }
|
||||||
|
|
||||||
return if (expression.getBody() == null) {
|
return if (expression.getBody() == null) {
|
||||||
@@ -120,7 +121,8 @@ class IrInterpreter : IrElementVisitor<State, Frame> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun visitGetField(expression: IrGetField, data: Frame): State {
|
override fun visitGetField(expression: IrGetField, data: Frame): State {
|
||||||
val receiver = (expression.receiver as IrDeclarationReference).symbol.descriptor
|
val receiver = (expression.receiver as? IrDeclarationReference)?.symbol?.descriptor // receiver is null, for example, for top level fields
|
||||||
|
?: return expression.symbol.owner.initializer!!.expression.accept(this, data)
|
||||||
return data.getVar(receiver).getState(expression.symbol.descriptor).copy()
|
return data.getVar(receiver).getState(expression.symbol.descriptor).copy()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user