mescc: Tinycc support: Export nested struct definitions.
* module/language/c99/compiler.mes (struct-field): Support nested, named and anonymous enums. (field->info): New function. (type->info): Use it to reap nestedly defined enums, structs, unions. (decl->info): Likewise. * scaffold/tests/t.c: Test it.
This commit is contained in:
parent
b4d1c40aa8
commit
03ba0e18df
|
@ -1544,7 +1544,15 @@
|
||||||
(define (struct-field info)
|
(define (struct-field info)
|
||||||
(lambda (o)
|
(lambda (o)
|
||||||
(pmatch o
|
(pmatch o
|
||||||
((comp-decl (decl-spec-list (type-spec ,type)) (comp-declr-list (comp-declr (ident ,name))))
|
((comp-decl (decl-spec-list (type-spec (enum-def (ident ,name) (enum-def-list . ,fields)))) (comp-declr-list . ,decls))
|
||||||
|
(let (
|
||||||
|
;;(constants (enum-def-list->constants (.constants info) fields))
|
||||||
|
;;(type-entry (enum->type-entry name fields))
|
||||||
|
)
|
||||||
|
(append-map (lambda (o)
|
||||||
|
((struct-field info) `(comp-decl (decl-spec-list (type-spec "int")) (comp-declr-list ,o))))
|
||||||
|
decls)))
|
||||||
|
((comp-decl (decl-spec-list (type-spec ,type)) (comp-declr-list (comp-declr (ident ,name))))
|
||||||
(list (cons name (ast->type type info))))
|
(list (cons name (ast->type type info))))
|
||||||
((comp-decl (decl-spec-list (type-spec ,type)) (comp-declr-list (comp-declr (ptr-declr ,pointer (ident ,name)))))
|
((comp-decl (decl-spec-list (type-spec ,type)) (comp-declr-list (comp-declr (ptr-declr ,pointer (ident ,name)))))
|
||||||
(let ((rank (pointer->rank pointer)))
|
(let ((rank (pointer->rank pointer)))
|
||||||
|
@ -1934,7 +1942,8 @@
|
||||||
(type (rank+= type rank)))
|
(type (rank+= type rank)))
|
||||||
(clone info #:types (acons name type (.types info)))))
|
(clone info #:types (acons name type (.types info)))))
|
||||||
(((decl-spec-list (stor-spec (,store)) (type-spec ,type)) (init-declr-list . ,inits))
|
(((decl-spec-list (stor-spec (,store)) (type-spec ,type)) (init-declr-list . ,inits))
|
||||||
(let* ((type (ast->type type info))
|
(let* ((info (type->info type #f info))
|
||||||
|
(type (ast->type type info))
|
||||||
(function (.function info)))
|
(function (.function info)))
|
||||||
(if (not function) (fold (cut init-declr->info type <> <>) info (map cdr inits))
|
(if (not function) (fold (cut init-declr->info type <> <>) info (map cdr inits))
|
||||||
(let* ((tmp (clone info #:function #f #:globals '()))
|
(let* ((tmp (clone info #:function #f #:globals '()))
|
||||||
|
@ -2290,12 +2299,14 @@
|
||||||
|
|
||||||
((struct-def (field-list . ,fields))
|
((struct-def (field-list . ,fields))
|
||||||
(mescc:trace name " <t>")
|
(mescc:trace name " <t>")
|
||||||
(let ((type-entry (struct->type-entry name (append-map (struct-field info) fields))))
|
(let* ((info (fold field->info info fields))
|
||||||
|
(type-entry (struct->type-entry name (append-map (struct-field info) fields))))
|
||||||
(clone info #:types (cons type-entry (.types info)))))
|
(clone info #:types (cons type-entry (.types info)))))
|
||||||
|
|
||||||
((struct-def (ident ,name) (field-list . ,fields))
|
((struct-def (ident ,name) (field-list . ,fields))
|
||||||
(mescc:trace name " <t>")
|
(mescc:trace name " <t>")
|
||||||
(let ((type-entry (struct->type-entry name (append-map (struct-field info) fields))))
|
(let* ((info (fold field->info info fields))
|
||||||
|
(type-entry (struct->type-entry name (append-map (struct-field info) fields))))
|
||||||
(clone info #:types (cons type-entry (.types info)))))
|
(clone info #:types (cons type-entry (.types info)))))
|
||||||
|
|
||||||
((union-def (ident ,name) (field-list . ,fields))
|
((union-def (ident ,name) (field-list . ,fields))
|
||||||
|
@ -2321,6 +2332,28 @@
|
||||||
info
|
info
|
||||||
)))
|
)))
|
||||||
|
|
||||||
|
(define (field->info o info)
|
||||||
|
(pmatch o
|
||||||
|
((comp-decl (decl-spec-list (type-spec (struct-def (ident ,name) (field-list . ,fields)))) . _)
|
||||||
|
(let* ((fields (append-map (struct-field info) fields))
|
||||||
|
(struct (make-type 'struct (apply + (map field:size fields)) fields)))
|
||||||
|
(clone info #:types (acons `(tag ,name) struct (.types info)))))
|
||||||
|
((comp-decl (decl-spec-list (type-spec (union-def (ident ,name) (field-list . ,fields)))) . _)
|
||||||
|
(let* ((fields (append-map (struct-field info) fields))
|
||||||
|
(union (make-type 'union (apply + (map field:size fields)) fields)))
|
||||||
|
(clone info #:types (acons `(tag ,name) union (.types info))) ))
|
||||||
|
((comp-decl (decl-spec-list (type-spec (enum-def (enum-def-list . ,fields)))) . _)
|
||||||
|
(let ((constants (enum-def-list->constants (.constants info) fields)))
|
||||||
|
(clone info
|
||||||
|
#:constants (append constants (.constants info)))))
|
||||||
|
((comp-decl (decl-spec-list (type-spec (enum-def (ident ,name) (enum-def-list . ,fields)))) . _)
|
||||||
|
(let ((constants (enum-def-list->constants (.constants info) fields))
|
||||||
|
(type-entry (enum->type-entry name fields)))
|
||||||
|
(clone info
|
||||||
|
#:types (cons type-entry (.types info))
|
||||||
|
#:constants (append constants (.constants info)))))
|
||||||
|
(_ info)))
|
||||||
|
|
||||||
;;; fctn-defn
|
;;; fctn-defn
|
||||||
(define (param-decl:get-name o)
|
(define (param-decl:get-name o)
|
||||||
(pmatch o
|
(pmatch o
|
||||||
|
|
|
@ -49,6 +49,23 @@ int_array_t bar;
|
||||||
typedef struct foo *foo_pointer_t;
|
typedef struct foo *foo_pointer_t;
|
||||||
foo_pointer_t foep;
|
foo_pointer_t foep;
|
||||||
|
|
||||||
|
struct nest
|
||||||
|
{
|
||||||
|
struct bar
|
||||||
|
{
|
||||||
|
int baz;
|
||||||
|
} bar;
|
||||||
|
int i;
|
||||||
|
enum baz
|
||||||
|
{
|
||||||
|
bla
|
||||||
|
} baz;
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
blub = 33,
|
||||||
|
} blub;
|
||||||
|
};
|
||||||
|
|
||||||
int
|
int
|
||||||
test (struct foo* p)
|
test (struct foo* p)
|
||||||
{
|
{
|
||||||
|
@ -134,6 +151,16 @@ main (int argc, char* argv[])
|
||||||
if (u.foo != 3) return 24;
|
if (u.foo != 3) return 24;
|
||||||
if (u.bla != 4) return 25;
|
if (u.bla != 4) return 25;
|
||||||
|
|
||||||
|
struct nest n = {0};
|
||||||
|
if (n.bar.baz)
|
||||||
|
return 26;
|
||||||
|
|
||||||
|
if (bla != 0)
|
||||||
|
return 27;
|
||||||
|
|
||||||
|
if (blub != 33)
|
||||||
|
return 28;
|
||||||
|
|
||||||
char buf[sizeof (g_f.string)];
|
char buf[sizeof (g_f.string)];
|
||||||
char buf1[sizeof (g_g->string)];
|
char buf1[sizeof (g_g->string)];
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue