Add basic support for variable-length array parameters in cinterop (#2666)

This commit is contained in:
SvyatoslavScherbina
2019-02-18 09:54:41 +03:00
committed by GitHub
parent de65e29fbe
commit 469eede9d3
4 changed files with 53 additions and 5 deletions
@@ -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 -> {
@@ -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
+36 -1
View File
@@ -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))
}