From 9b5513ca379c84eee7896370aecf3c947feda808 Mon Sep 17 00:00:00 2001 From: Sergey Bogolepov Date: Fri, 28 Feb 2020 16:19:08 +0700 Subject: [PATCH] [Interop] Fix assignment of nulls to pointer fields --- .../backend/konan/lower/InteropCallConvertors.kt | 10 +++++++--- backend.native/tests/interop/basics/structs.kt | 3 +++ 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/InteropCallConvertors.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/InteropCallConvertors.kt index d0861ac71cd..17495d997f5 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/InteropCallConvertors.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/InteropCallConvertors.kt @@ -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}") } } diff --git a/backend.native/tests/interop/basics/structs.kt b/backend.native/tests/interop/basics/structs.kt index 6b7a8272ec5..ad20163caaf 100644 --- a/backend.native/tests/interop/basics/structs.kt +++ b/backend.native/tests/interop/basics/structs.kt @@ -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)