From 9ad17f5e480419a95c770109bc6c25f3926ae17d Mon Sep 17 00:00:00 2001 From: Svyatoslav Scherbina Date: Wed, 29 Mar 2017 10:31:12 +0300 Subject: [PATCH] Fix support for pointers to arrays in interop Also represent multidimensional arrays as one-dimensional ones. --- .../native/interop/gen/jvm/StubGenerator.kt | 29 ++++++++++--------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/jvm/StubGenerator.kt b/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/jvm/StubGenerator.kt index ab1e8504ea2..c60774c2f3b 100644 --- a/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/jvm/StubGenerator.kt +++ b/Interop/StubGenerator/src/main/kotlin/org/jetbrains/kotlin/native/interop/gen/jvm/StubGenerator.kt @@ -378,9 +378,12 @@ class StubGenerator( is PointerType -> { val pointeeType = type.pointeeType - if (pointeeType.unwrapTypedefs() is VoidType) { + val unwrappedPointeeType = pointeeType.unwrapTypedefs() + if (unwrappedPointeeType is VoidType) { val info = TypeInfo.Pointer("COpaque") TypeMirror.ByValue("COpaquePointerVar", info, "COpaquePointer") + } else if (unwrappedPointeeType is ArrayType) { + mirror(pointeeType) } else { val pointeeMirror = mirror(pointeeType) val info = TypeInfo.Pointer(pointeeMirror.pointedTypeName) @@ -392,9 +395,13 @@ class StubGenerator( is ArrayType -> { // TODO: array type doesn't exactly correspond neither to pointer nor to value. val elemTypeMirror = mirror(type.elemType) - val info = TypeInfo.Pointer(elemTypeMirror.pointedTypeName) - TypeMirror.ByValue("CArrayPointerVar<${elemTypeMirror.pointedTypeName}>", info, - "CArrayPointer<${elemTypeMirror.pointedTypeName}>") + if (type.elemType.unwrapTypedefs() is ArrayType) { + elemTypeMirror + } else { + val info = TypeInfo.Pointer(elemTypeMirror.pointedTypeName) + TypeMirror.ByValue("CArrayPointerVar<${elemTypeMirror.pointedTypeName}>", info, + "CArrayPointer<${elemTypeMirror.pointedTypeName}>") + } } is FunctionType -> byRefTypeMirror("CFunction<${type.kotlinName}>") @@ -440,11 +447,6 @@ class StubGenerator( * Constructs [OutValueBinding] for the value of given C type. */ fun getOutValueBinding(type: Type): OutValueBinding { - if (type.unwrapTypedefs() is ArrayType) { - // array-typed C function argument or return value is actually a pointer to array. - return getOutValueBinding(PointerType(type)) - } - val mirror = mirror(type) return OutValueBinding( @@ -467,6 +469,10 @@ class StubGenerator( return null } + if (unwrappedPointeeType is ArrayType) { + return representCFunctionParameterAsValuesRef(pointeeType) + } + return pointeeType } @@ -525,11 +531,6 @@ class StubGenerator( * Constructs [InValueBinding] for the value of given C type. */ fun getInValueBinding(type: Type): InValueBinding { - if (type.unwrapTypedefs() is ArrayType) { - // array-typed C function argument or return value is actually a pointer to array. - return getInValueBinding(PointerType(type)) - } - val mirror = mirror(type) return InValueBinding(