aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGanesh Viswanathan <dev@genotrance.com>2018-11-20 17:02:37 -0600
committerGanesh Viswanathan <dev@genotrance.com>2018-11-20 17:02:37 -0600
commit882b38f4f642b4d351836f1f1f9645a46b3e7610 (patch)
tree392242f11da9796d816f45a60d219c56f03c3f91
parentb6ca0a815a5a651ed90b2150fdda5ecf1bac9632 (diff)
downloadnimterop-882b38f4f642b4d351836f1f1f9645a46b3e7610.tar.gz
nimterop-882b38f4f642b4d351836f1f1f9645a46b3e7610.zip
Fix typedef struct X X
-rw-r--r--nimterop/ast.nim14
1 files changed, 9 insertions, 5 deletions
diff --git a/nimterop/ast.nim b/nimterop/ast.nim
index 1a30ad7..474c918 100644
--- a/nimterop/ast.nim
+++ b/nimterop/ast.nim
@@ -28,7 +28,7 @@ proc preprocDef(node: ref Ast) =
if name.nBl and val.nBl and name notin gConsts:
gConsts.add(name)
- if val.getType().nBl:
+ if val.getLit().nBl:
# #define NAME VALUE
gConstStr &= &" {name.getIdentifier()}* = {val} # preprocDef()\n"
@@ -65,13 +65,17 @@ proc structSpecifier(node: ref Ast, name = "") =
of "type_identifier":
let typ = getNodeValIf(node.children[0], "type_identifier")
if typ.nBl:
- # typedef struct X Y
gTypes.add(name)
- gTypeStr &= &" {name}* = {typ} #1 structSpecifier()\n"
+ if name != typ:
+ # typedef struct X Y
+ gTypeStr &= &" {name}* = {typ} #1 structSpecifier()\n"
+ else:
+ # typedef struct X X
+ gTypeStr &= &" {name}* {{.importc: \"{name}\", header: {gCurrentHeader}, bycopy.}} = object #2 structSpecifier()\n"
of "field_declaration_list":
# typedef struct { fields } X
- stmt = &" {name}* {{.importc: \"{name}\", header: {gCurrentHeader}, bycopy.}} = object #2 structSpecifier()\n"
+ stmt = &" {name}* {{.importc: \"{name}\", header: {gCurrentHeader}, bycopy.}} = object #3 structSpecifier()\n"
for field in node.children[0].children:
let ts = typeScan(field, "field_declaration", "field_identifier", " ")
@@ -85,7 +89,7 @@ proc structSpecifier(node: ref Ast, name = "") =
let ename = getNodeValIf(node.children[0], "type_identifier")
if ename.nBl and ename notin gTypes:
# struct X { fields }
- stmt &= &" {ename}* {{.importc: \"struct {ename}\", header: {gCurrentHeader}, bycopy.}} = object #3 structSpecifier()\n"
+ stmt &= &" {ename}* {{.importc: \"struct {ename}\", header: {gCurrentHeader}, bycopy.}} = object #4 structSpecifier()\n"
for field in node.children[1].children:
let ts = typeScan(field, "field_declaration", "field_identifier", " ")