[Interop] Fix assignment of nulls to pointer fields

This commit is contained in:
Sergey Bogolepov
2020-02-28 16:19:08 +07:00
committed by Sergey Bogolepov
parent 07177396ac
commit 9b5513ca37
2 changed files with 10 additions and 3 deletions
@@ -194,9 +194,13 @@ private fun InteropCallContext.convertCPointerToNativePtr(cPointer: IrExpression
}
private fun InteropCallContext.writePointerToMemory(nativePtr: IrExpression, value: IrExpression): IrExpression {
private fun InteropCallContext.writePointerToMemory(
nativePtr: IrExpression,
value: IrExpression,
pointerType: IrType
): IrExpression {
val valueToWrite = when {
value.type.isCPointer() -> convertCPointerToNativePtr(value)
pointerType.isCPointer() -> convertCPointerToNativePtr(value)
else -> error("Unsupported pointer type")
}
return writeValueToMemory(nativePtr, valueToWrite)
@@ -284,7 +288,7 @@ private fun InteropCallContext.generateMemberAtAccess(callSite: IrCall): IrExpre
when {
type.isCEnumType() -> writeEnumValueToMemory(fieldPointer, value)
type.isStoredInMemoryDirectly() -> writeValueToMemory(fieldPointer, value)
type.isCPointer() -> writePointerToMemory(fieldPointer, value)
type.isCPointer() -> writePointerToMemory(fieldPointer, value, type)
else -> error("Cannot set field of type ${type.getClass()?.name}")
}
}
@@ -15,6 +15,9 @@ fun main() {
assertEquals(next, null)
next = this.ptr
assertEquals(next, this.ptr)
// Check null pointer because it has Nothing? type.
next = null
assertEquals(next, null)
assertEquals(vec4f, vectorOf(1.0f, 1.0f, 1.0f, 1.0f))
vec4f = vectorOf(0.0f, 0.0f, 0.0f, 0.0f)