From 469eede9d392e6ebcba858f0dc6607026884fea5 Mon Sep 17 00:00:00 2001 From: SvyatoslavScherbina Date: Mon, 18 Feb 2019 09:54:41 +0300 Subject: [PATCH] Add basic support for variable-length array parameters in cinterop (#2666) --- .../kotlin/native/interop/indexer/Indexer.kt | 13 +++++-- .../native/interop/indexer/NativeIndex.kt | 1 + .../tests/interop/basics/ctypes.def | 37 ++++++++++++++++++- backend.native/tests/interop/basics/types.kt | 7 ++++ 4 files changed, 53 insertions(+), 5 deletions(-) diff --git a/Interop/Indexer/src/main/kotlin/org/jetbrains/kotlin/native/interop/indexer/Indexer.kt b/Interop/Indexer/src/main/kotlin/org/jetbrains/kotlin/native/interop/indexer/Indexer.kt index 17c7d2f9700..cc5197a99a7 100644 --- a/Interop/Indexer/src/main/kotlin/org/jetbrains/kotlin/native/interop/indexer/Indexer.kt +++ b/Interop/Indexer/src/main/kotlin/org/jetbrains/kotlin/native/interop/indexer/Indexer.kt @@ -522,14 +522,19 @@ internal class NativeIndexImpl(val library: NativeLibrary, val verbose: Boolean } CXType_ConstantArray -> { - val elemType = convertType(clang_getArrayElementType(type)) + val elementType = convertType(clang_getArrayElementType(type)) val length = clang_getArraySize(type) - ConstArrayType(elemType, length) + ConstArrayType(elementType, length) } CXType_IncompleteArray -> { - val elemType = convertType(clang_getArrayElementType(type)) - IncompleteArrayType(elemType) + val elementType = convertType(clang_getArrayElementType(type)) + IncompleteArrayType(elementType) + } + + CXType_VariableArray -> { + val elementType = convertType(clang_getArrayElementType(type)) + VariableArrayType(elementType) } CXType_FunctionProto -> { diff --git a/Interop/Indexer/src/main/kotlin/org/jetbrains/kotlin/native/interop/indexer/NativeIndex.kt b/Interop/Indexer/src/main/kotlin/org/jetbrains/kotlin/native/interop/indexer/NativeIndex.kt index 527c056482d..b36dbc8ba35 100644 --- a/Interop/Indexer/src/main/kotlin/org/jetbrains/kotlin/native/interop/indexer/NativeIndex.kt +++ b/Interop/Indexer/src/main/kotlin/org/jetbrains/kotlin/native/interop/indexer/NativeIndex.kt @@ -266,6 +266,7 @@ interface ArrayType : Type { data class ConstArrayType(override val elemType: Type, val length: Long) : ArrayType data class IncompleteArrayType(override val elemType: Type) : ArrayType +data class VariableArrayType(override val elemType: Type) : ArrayType data class Typedef(val def: TypedefDef) : Type diff --git a/backend.native/tests/interop/basics/ctypes.def b/backend.native/tests/interop/basics/ctypes.def index 181ab2d3be8..3b6cf0bee37 100644 --- a/backend.native/tests/interop/basics/ctypes.def +++ b/backend.native/tests/interop/basics/ctypes.def @@ -13,4 +13,39 @@ struct StructWithConstFields getStructWithConstFields() { enum ForwardDeclaredEnum; enum ForwardDeclaredEnum { ZERO, ONE, TWO -}; \ No newline at end of file +}; + +static int vlaSum(int size, int array[size]) { + int result = 0; + for (int i = 0; i < size; ++i) { + result += array[i]; + } + return result; +} + +static int vlaSum2D(int size, int array[][size]) { + int result = 0; + for (int i = 0; i < size; ++i) { + for (int j = 0; j < size; ++j) { + result += array[i][j]; + } + } + return result; +} + +static int vlaSum2DBothDimensions(int rows, int columns, int array[rows][columns]) { + int result = 0; + for (int i = 0; i < rows; ++i) { + for (int j = 0; j < columns; ++j) { + result += array[i][j]; + } + } + return result; +} + +/* +// Not supported by clang: +static int vlaSum2DForward(int size; int array[][size], int size) { + return vlaSum2D(size, array); +} +*/ \ No newline at end of file diff --git a/backend.native/tests/interop/basics/types.kt b/backend.native/tests/interop/basics/types.kt index 03b8bec2aa5..599afdf9dae 100644 --- a/backend.native/tests/interop/basics/types.kt +++ b/backend.native/tests/interop/basics/types.kt @@ -9,4 +9,11 @@ fun main() { } assertEquals(1u, ForwardDeclaredEnum.ONE.value) + + assertEquals(6, vlaSum(3, cValuesOf(1, 2, 3))) + assertEquals(10, vlaSum2D(2, cValuesOf(1, 2, 3, 4))) + assertEquals(21, vlaSum2DBothDimensions(2, 3, cValuesOf(1, 2, 3, 4, 5, 6))) + + // Not supported by clang: + // assertEquals(10, vlaSum2DForward(cValuesOf(1, 2, 3, 4), 2)) } \ No newline at end of file