From 95a1bd84707aec36a032cc9fc9ea61aeac176097 Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Sat, 4 Apr 2020 14:32:42 +0200 Subject: [PATCH] cgen: handle C typedefs --- vlib/v/gen/cgen.v | 5 ++++- vlib/v/parser/parser.v | 2 ++ vlib/v/table/atypes.v | 5 +++-- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/vlib/v/gen/cgen.v b/vlib/v/gen/cgen.v index 4de46ef6cd..aaf367dc86 100644 --- a/vlib/v/gen/cgen.v +++ b/vlib/v/gen/cgen.v @@ -159,7 +159,10 @@ pub fn (g mut Gen) typ(t table.Type) string { if styp.starts_with('C__') { styp = styp[3..] if sym.kind == .struct_ { - styp = 'struct $styp' + info := sym.info as table.Struct + if !info.is_typedef { + styp = 'struct $styp' + } } } if table.type_is(t, .optional) { diff --git a/vlib/v/parser/parser.v b/vlib/v/parser/parser.v index 6ae33e7031..aed3b6e0c8 100644 --- a/vlib/v/parser/parser.v +++ b/vlib/v/parser/parser.v @@ -1475,6 +1475,7 @@ fn (p mut Parser) struct_decl() ast.StructDecl { p.next() // C p.next() // . } + is_typedef := p.attr == 'typedef' mut name := p.check_name() mut default_exprs := []ast.Expr // println('struct decl $name') @@ -1544,6 +1545,7 @@ fn (p mut Parser) struct_decl() ast.StructDecl { name: name info: table.Struct{ fields: fields + is_typedef: is_typedef } } mut ret := 0 diff --git a/vlib/v/table/atypes.v b/vlib/v/table/atypes.v index 6dbe77a67a..e0eeaa73e5 100644 --- a/vlib/v/table/atypes.v +++ b/vlib/v/table/atypes.v @@ -3,7 +3,7 @@ // that can be found in the LICENSE file. // // Type layout information (32 bits) -// flag (8 bits) | nr_muls (8 bits) | idx (16 bits) +// flag (8 bits) | nr_muls (8 bits) | idx (16 bits) // pack: (int(flag)<<24) | (nr_muls<<16) | u16(idx) // unpack: // flag: (int(type)>>24) & 0xff @@ -18,7 +18,7 @@ import ( pub type Type int -pub type TypeInfo = Array | ArrayFixed | Map | Struct | +pub type TypeInfo = Array | ArrayFixed | Map | Struct | MultiReturn | Alias | Enum | SumType | FnType pub struct TypeSymbol { @@ -539,6 +539,7 @@ pub fn (kinds []Kind) str() string { pub struct Struct { pub mut: fields []Field + is_typedef bool // C. [typedef] } pub struct Enum {