Add basic support for variable-length array parameters in cinterop (#2666)
This commit is contained in:
committed by
GitHub
parent
de65e29fbe
commit
469eede9d3
+9
-4
@@ -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 -> {
|
||||
|
||||
+1
@@ -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
|
||||
|
||||
|
||||
@@ -13,4 +13,39 @@ struct StructWithConstFields getStructWithConstFields() {
|
||||
enum ForwardDeclaredEnum;
|
||||
enum ForwardDeclaredEnum {
|
||||
ZERO, ONE, TWO
|
||||
};
|
||||
};
|
||||
|
||||
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);
|
||||
}
|
||||
*/
|
||||
@@ -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))
|
||||
}
|
||||
Reference in New Issue
Block a user