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 -> { CXType_ConstantArray -> {
val elemType = convertType(clang_getArrayElementType(type)) val elementType = convertType(clang_getArrayElementType(type))
val length = clang_getArraySize(type) val length = clang_getArraySize(type)
ConstArrayType(elemType, length) ConstArrayType(elementType, length)
} }
CXType_IncompleteArray -> { CXType_IncompleteArray -> {
val elemType = convertType(clang_getArrayElementType(type)) val elementType = convertType(clang_getArrayElementType(type))
IncompleteArrayType(elemType) IncompleteArrayType(elementType)
}
CXType_VariableArray -> {
val elementType = convertType(clang_getArrayElementType(type))
VariableArrayType(elementType)
} }
CXType_FunctionProto -> { CXType_FunctionProto -> {
@@ -266,6 +266,7 @@ interface ArrayType : Type {
data class ConstArrayType(override val elemType: Type, val length: Long) : ArrayType data class ConstArrayType(override val elemType: Type, val length: Long) : ArrayType
data class IncompleteArrayType(override val elemType: Type) : ArrayType data class IncompleteArrayType(override val elemType: Type) : ArrayType
data class VariableArrayType(override val elemType: Type) : ArrayType
data class Typedef(val def: TypedefDef) : Type data class Typedef(val def: TypedefDef) : Type
@@ -14,3 +14,38 @@ enum ForwardDeclaredEnum;
enum ForwardDeclaredEnum { enum ForwardDeclaredEnum {
ZERO, ONE, TWO 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(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))
} }