From 77380630383f37f08d0ead6438aa4c90966b8d25 Mon Sep 17 00:00:00 2001 From: Ganesh Viswanathan Date: Tue, 23 Jun 2020 11:42:50 -0500 Subject: [PATCH] Fix #231 - const func type, comment in struct --- nimterop/toastlib/ast2.nim | 13 +++--- nimterop/toastlib/tshelp.nim | 2 +- tests/include/tast2.h | 83 ++++++++++++++++++++++++++++++++++-- tests/tast2.nim | 4 ++ 4 files changed, 92 insertions(+), 10 deletions(-) diff --git a/nimterop/toastlib/ast2.nim b/nimterop/toastlib/ast2.nim index ffe961e..701b0b4 100644 --- a/nimterop/toastlib/ast2.nim +++ b/nimterop/toastlib/ast2.nim @@ -1238,8 +1238,9 @@ proc addType(gState: State, node: TSNode, union = false) = gState.addTypeObject(node[0], union = union) else: let - fdecl = node[1].anyChildInTree("function_declarator") - adecl = node[1].anyChildInTree("array_declarator") + start = node.getStartAtom() + fdecl = node[start+1].anyChildInTree("function_declarator") + adecl = node[start+1].anyChildInTree("array_declarator") if fdlist.isNil: if adecl.isNil and fdecl.isNil: # typedef X Y; @@ -1341,9 +1342,9 @@ proc addType(gState: State, node: TSNode, union = false) = # First add struct as object decho("addType(): case 6") - gState.addTypeObject(node[0], union = union) + gState.addTypeObject(node[start], union = union) - if node.len > 1 and gState.getNodeVal(node[1]) != "": + if node.len > start+1 and gState.getNodeVal(node[start+1]) != "": # Add any additional names gState.addTypeTyped(node) else: @@ -1357,14 +1358,14 @@ proc addType(gState: State, node: TSNode, union = false) = name = block: var name = "" - for i in 1 ..< node.len: + for i in start+1 ..< node.len: if node[i].getName() == "type_identifier": name = gState.getNodeVal(node[i].getAtom()) name # Now add struct as object with specified name - gState.addTypeObject(node[0], fname = name, istype = true, union = union) + gState.addTypeObject(node[start], fname = name, istype = true, union = union) if name.nBl: # Add any additional names diff --git a/nimterop/toastlib/tshelp.nim b/nimterop/toastlib/tshelp.nim index 91f77ec..b055259 100644 --- a/nimterop/toastlib/tshelp.nim +++ b/nimterop/toastlib/tshelp.nim @@ -62,7 +62,7 @@ proc getAtom*(node: TSNode): TSNode = if node.getName() in gAtoms: return node elif node.len != 0: - if node[0].getName() == "type_qualifier": + if node[0].getName() in ["type_qualifier", "comment"]: # Skip const, volatile if node.len > 1: return node[1].getAtom() diff --git a/tests/include/tast2.h b/tests/include/tast2.h index 6f569d5..89ad486 100644 --- a/tests/include/tast2.h +++ b/tests/include/tast2.h @@ -61,6 +61,7 @@ struct some_struct_s struct parent_struct_s { + /* Random comment */ struct some_struct_s s[SOME_CONST]; }; @@ -108,6 +109,9 @@ typedef struct A20 { char a1; } A20, A21, *A21p; //Expression typedef struct A22 { const int **f1; int *f2[123+132]; } A22; +// #231 +typedef const char *(*A23)(); + //Unions union U1 {int f1; float f2; }; typedef union U2 { const int **f1; int abc[123+132]; } U2; @@ -239,6 +243,7 @@ typedef struct { struct { int f1; } f2; struct NT3 { + /* Random comment */ struct { int f1; union NU1 { @@ -277,6 +282,65 @@ struct TestMyInt { #define C 0x10 #define D "hello" #define E 'c' +#define F 01234 + +#define UEXPR (1234u << 1) +#define ULEXPR (1234ul << 2) +#define ULLEXPR (1234ull << 3) +#define LEXPR (1234l << 4) +#define LLEXPR (1234ll << 5) + +#define SHL1 (1u << 1) +#define SHL2 (1u << 2) +#define SHL3 (1u << 3) +#define COERCE 645635634896ull + 35436 +#define COERCE2 645635634896 + 35436ul +#define BINEXPR ~(-(1u << !-1)) ^ (10 >> 1) +#define POINTEREXPR (int*)0 +#define POINTERPOINTERPOINTEREXPR (int***)0 +#define BOOL true +#define MATHEXPR (1 + 2/3*20 - 100) +#define ANDEXPR (100 & 11000) +#define CASTEXPR (char) 34 +#define AVAL 100 +#define BVAL 200 +#define EQ1 AVAL <= BVAL +#define EQ2 AVAL >= BVAL +#define EQ3 AVAL > BVAL +#define EQ4 AVAL < BVAL +#define EQ5 AVAL != BVAL +#define EQ6 AVAL == BVAL + +// testing integer out of long int range +#define INT_FAST16_MIN (-9223372036854775807L-1) + +#define SIZEOF sizeof(char) +#define REG_STR "regular string" +#define NOTSUPPORTEDSTR "not a " REG_STR + +#define NULLCHAR '\0' +#define OCTCHAR '\012' +#define HEXCHAR '\xFE' +#define TRICKYSTR "\x4E\034\nfoo\0\'\"\r\v\a\b\e\f\t\\\?bar" + +#define ALLSHL (SHL1 | SHL2 | SHL3) + +#ifdef NIMTEROP +#define SOME_CONST 8 +#endif + +struct some_struct_s +{ + int x; +}; + +struct parent_struct_s +{ + /* Random comment */ + struct some_struct_s s[SOME_CONST]; +}; + +typedef struct some_struct_s SOME_ARRAY[SOME_CONST]; struct A0; struct A1 {}; @@ -303,10 +367,10 @@ typedef char *(*A11)[3]; typedef struct A0 *A111[12]; typedef int - **(*A12)(int, int b, int *c, int *, int *count[4], int (*func)(int, int)), + **(*A12)(int, int b, int *c, int *, int /*out*/ *count[4], int (*func)(int, int)), **(*A121)(float, float b, float *c, float *, float *count[4], float (*func)(float, float)), **(*A122)(char, char b, char *c, char *, char *count[4], char (*func)(char, char)); -typedef int A13(int, int, void (*func)(void)); +typedef int (*A13)(int, int, void (*func)(void)); struct A14 { volatile char a1; }; struct A15 { char *a1; const int *a2[1]; }; @@ -320,6 +384,9 @@ typedef struct A20 { char a1; } A20, A21, *A21p; //Expression typedef struct A22 { const int **f1; int *f2[123+132]; } A22; +// #231 +typedef const char *(*A23)(); + //Unions union U1 {int f1; float f2; }; typedef union U2 { const int **f1; int abc[123+132]; } U2; @@ -403,6 +470,16 @@ void int sqlite3_bind_blob(struct A1*, int, const void*, int n, void(*)(void*)); +// Issue #174 - type name[] => UncheckedArray[type] +int ucArrFunc1(int text[]); +int ucArrFunc2(int text[][5], int (*func)(int text[])); + +typedef int ucArrType1[][5]; +struct ucArrType2 { + float f1[5][5]; + int *f2[][5]; +}; + typedef struct fieldfuncfunc { int *(*func1)(int f1, int *(*sfunc1)(int f1, int *(*ssfunc1)(int f1, ...))); }; @@ -441,6 +518,7 @@ typedef struct { struct { int f1; } f2; struct NT3 { + /* Random comment */ struct { int f1; union NU1 { @@ -469,7 +547,6 @@ struct TestMyInt { }; - #endif #ifdef __cplusplus diff --git a/tests/tast2.nim b/tests/tast2.nim index 124c4e4..3f626ae 100644 --- a/tests/tast2.nim +++ b/tests/tast2.nim @@ -333,6 +333,10 @@ checkPragmas(A22, pHeaderBy, istype = false) var a22: A22 a22.f1 = addr a15.a2[0] +assert A23 is proc(): cstring {.cdecl.} +checkPragmas(A23, pHeaderImp & "cdecl") +var a23: A23 + assert U1 is object assert sizeof(U1) == sizeof(cfloat) checkPragmas(U1, pHeaderBy & @["union"], istype = false)