[K/N][codegen] Fixed wrong arguments evaluation order for IrSetField

#KT-56326 Fixed
This commit is contained in:
Igor Chevdar
2023-02-07 14:15:52 +02:00
committed by Space Team
parent 2bafa0eb77
commit 12d0b1e846
3 changed files with 5 additions and 8 deletions
@@ -1,5 +1,3 @@
// KT-56326
// IGNORE_BACKEND_K2: NATIVE
import Host.x import Host.x
object Host { object Host {
-2
View File
@@ -1,5 +1,3 @@
// KT-56326
// IGNORE_BACKEND_K2: NATIVE
class CallbackBlock {} class CallbackBlock {}
public class Foo public class Foo
@@ -1755,12 +1755,13 @@ internal class CodeGeneratorVisitor(
return codegen.theUnitInstanceRef.llvm return codegen.theUnitInstanceRef.llvm
} }
val thisPtr = value.receiver?.let { evaluateExpression(it) }
val valueToAssign = evaluateExpression(value.value) val valueToAssign = evaluateExpression(value.value)
val address: LLVMValueRef val address: LLVMValueRef
val alignment: Int val alignment: Int
if (!value.symbol.owner.isStatic) { if (thisPtr != null) {
val thisPtr = evaluateExpression(value.receiver!!) require(!value.symbol.owner.isStatic) { "Unexpected receiver for a static field: ${value.render()}" }
assert(thisPtr.type == codegen.kObjHeaderPtr) { require(thisPtr.type == codegen.kObjHeaderPtr) {
LLVMPrintTypeToString(thisPtr.type)?.toKString().toString() LLVMPrintTypeToString(thisPtr.type)?.toKString().toString()
} }
val parentAsClass = value.symbol.owner.parentAsClass val parentAsClass = value.symbol.owner.parentAsClass
@@ -1775,7 +1776,7 @@ internal class CodeGeneratorVisitor(
address = fieldPtrOfClass(thisPtr, value.symbol.owner) address = fieldPtrOfClass(thisPtr, value.symbol.owner)
alignment = generationState.llvmDeclarations.forField(value.symbol.owner).alignment alignment = generationState.llvmDeclarations.forField(value.symbol.owner).alignment
} else { } else {
assert(value.receiver == null) require(value.symbol.owner.isStatic) { "A receiver expected for a non-static field: ${value.render()}" }
if (context.config.threadsAreAllowed && value.symbol.owner.storageKind(context) == FieldStorageKind.GLOBAL) if (context.config.threadsAreAllowed && value.symbol.owner.storageKind(context) == FieldStorageKind.GLOBAL)
functionGenerationContext.checkGlobalsAccessible(currentCodeContext.exceptionHandler) functionGenerationContext.checkGlobalsAccessible(currentCodeContext.exceptionHandler)
if (value.symbol.owner.shouldBeFrozen(context) && value.origin != ObjectClassLowering.IrStatementOriginFieldPreInit) if (value.symbol.owner.shouldBeFrozen(context) && value.origin != ObjectClassLowering.IrStatementOriginFieldPreInit)