IrInterpreter: interpret IrGetField properly
This commit is contained in:
+7
@@ -168,6 +168,13 @@ class IrCompileTimeChecker(
|
||||
|
||||
override fun visitGetField(expression: IrGetField, data: Nothing?): Boolean {
|
||||
val owner = expression.symbol.owner
|
||||
if (owner.origin == IrDeclarationOrigin.PROPERTY_BACKING_FIELD && owner.correspondingPropertySymbol?.owner?.isConst == true) {
|
||||
val receiverComputable = expression.receiver?.accept(this, null) ?: true
|
||||
val initializerComputable = owner.initializer?.accept(this, null) ?: false
|
||||
if (receiverComputable && initializerComputable) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
val parent = owner.parent as IrSymbolOwner
|
||||
val isJavaPrimitiveStatic = owner.origin == IrDeclarationOrigin.IR_EXTERNAL_JAVA_DECLARATION_STUB && owner.isStatic &&
|
||||
(owner.type.isPrimitiveType() || owner.type.isStringClassType())
|
||||
|
||||
@@ -540,6 +540,9 @@ class IrInterpreter(private val irBuiltIns: IrBuiltIns, private val bodyMap: Map
|
||||
stack.pushReturnValue(Wrapper.getStaticGetter(field)!!.invokeWithArguments().toState(field.type))
|
||||
return Next
|
||||
}
|
||||
if (field.origin == IrDeclarationOrigin.PROPERTY_BACKING_FIELD && field.correspondingPropertySymbol?.owner?.isConst == true) {
|
||||
return field.initializer?.expression?.interpret() ?: Next
|
||||
}
|
||||
// receiver is null, for example, for top level fields
|
||||
val result = receiver?.let { stack.getVariable(receiver).state.getState(field.correspondingPropertySymbol!!) }
|
||||
?: return (expression.symbol.owner.initializer?.expression?.interpret() ?: Next)
|
||||
|
||||
Reference in New Issue
Block a user