mescc: Support generic initializer.
* module/language/c99/compiler.mes (ast->info): Support generic declaration using initializer. Supports struct field initializer. * doc/examples/t.c (struct_test): Test it. * doc/examples/mini-mes.c (call_lambda, eval_apply, write_byte, display_): Use it. (call_lambda): (eval_apply, list_of_char_equal_p): Use it.
This commit is contained in:
parent
ddd880bdc8
commit
a4d65166c0
|
@ -991,6 +991,9 @@ _)))))
|
||||||
clause-text)
|
clause-text)
|
||||||
#:globals (.globals clause-info)))))
|
#:globals (.globals clause-info)))))
|
||||||
|
|
||||||
|
((case (neg (p-expr (fixed ,value))) ,statement)
|
||||||
|
((case->jump-info info) `(case (p-expr (fixed ,(string-append "-" value))) ,statement)))
|
||||||
|
|
||||||
((default (compd-stmt (block-item-list . ,elements)))
|
((default (compd-stmt (block-item-list . ,elements)))
|
||||||
(lambda (body-length)
|
(lambda (body-length)
|
||||||
(let ((text-length (length (.text info))))
|
(let ((text-length (length (.text info))))
|
||||||
|
@ -1812,18 +1815,6 @@ _)))))
|
||||||
((ident->accu info) local)
|
((ident->accu info) local)
|
||||||
((accu->ident info) name))))))
|
((accu->ident info) name))))))
|
||||||
|
|
||||||
;; int i = f ();
|
|
||||||
((decl (decl-spec-list (type-spec (fixed-type ,type))) (init-declr-list (init-declr (ident ,name) (initzer (fctn-call . ,call)))))
|
|
||||||
;;(stderr "4TYPE: ~s\n" type)
|
|
||||||
(let* ((locals (add-local locals name type 0))
|
|
||||||
(info (clone info #:locals locals)))
|
|
||||||
(let ((info ((ast->info info) `(expr-stmt (fctn-call ,@call)))))
|
|
||||||
(clone info
|
|
||||||
#:text
|
|
||||||
(append (.text info)
|
|
||||||
((accu->ident info) name))
|
|
||||||
#:locals locals))))
|
|
||||||
|
|
||||||
;; int (*function) (void) = g_functions[g_cells[fn].cdr].function;
|
;; int (*function) (void) = g_functions[g_cells[fn].cdr].function;
|
||||||
((decl (decl-spec-list (type-spec (fixed-type ,type))) (init-declr-list (init-declr (ftn-declr (scope (ptr-declr (pointer) (ident ,name))) (param-list . ,param-list)) (initzer ,initzer))))
|
((decl (decl-spec-list (type-spec (fixed-type ,type))) (init-declr-list (init-declr (ftn-declr (scope (ptr-declr (pointer) (ident ,name))) (param-list . ,param-list)) (initzer ,initzer))))
|
||||||
(let* ((locals (add-local locals name type 1))
|
(let* ((locals (add-local locals name type 1))
|
||||||
|
@ -1843,17 +1834,6 @@ _)))))
|
||||||
(i386:accu+base)))))
|
(i386:accu+base)))))
|
||||||
#:locals locals)))
|
#:locals locals)))
|
||||||
|
|
||||||
;; SCM x = car (e);
|
|
||||||
((decl (decl-spec-list (type-spec (typename ,type))) (init-declr-list (init-declr (ident ,name) (initzer (fctn-call . ,call)))))
|
|
||||||
;;(stderr "5TYPE: ~s\n" type)
|
|
||||||
(let* ((locals (add-local locals name type 0))
|
|
||||||
(info (clone info #:locals locals)))
|
|
||||||
(let ((info ((ast->info info) `(expr-stmt (fctn-call ,@call)))))
|
|
||||||
(clone info
|
|
||||||
#:text
|
|
||||||
(append (.text info)
|
|
||||||
((accu->ident info) name))))))
|
|
||||||
|
|
||||||
;; char *p = (char*)g_cells;
|
;; char *p = (char*)g_cells;
|
||||||
((decl (decl-spec-list (type-spec (fixed-type ,type))) (init-declr-list (init-declr (ptr-declr (pointer) (ident ,name)) (initzer (cast (type-name (decl-spec-list (type-spec (fixed-type ,=type))) (abs-declr (pointer))) (p-expr (ident ,value)))))))
|
((decl (decl-spec-list (type-spec (fixed-type ,type))) (init-declr-list (init-declr (ptr-declr (pointer) (ident ,name)) (initzer (cast (type-name (decl-spec-list (type-spec (fixed-type ,=type))) (abs-declr (pointer))) (p-expr (ident ,value)))))))
|
||||||
;;(stderr "6TYPE: ~s\n" type)
|
;;(stderr "6TYPE: ~s\n" type)
|
||||||
|
@ -1893,8 +1873,7 @@ _)))))
|
||||||
((ident->accu info) value)
|
((ident->accu info) value)
|
||||||
((accu->ident info) name))))
|
((accu->ident info) name))))
|
||||||
(let* ((globals (append globals (list (ident->global name type 1 0))))
|
(let* ((globals (append globals (list (ident->global name type 1 0))))
|
||||||
(here (data-offset name globals))
|
(here (data-offset name globals)))
|
||||||
(there (data-offset value globals)))
|
|
||||||
(clone info
|
(clone info
|
||||||
#:globals globals
|
#:globals globals
|
||||||
#:init (append (.init info)
|
#:init (append (.init info)
|
||||||
|
@ -1904,8 +1883,6 @@ _)))))
|
||||||
;;; FIXME: type
|
;;; FIXME: type
|
||||||
;;; char *x = arena;p
|
;;; char *x = arena;p
|
||||||
(int->bv32 (+ d (data-offset value globals)))
|
(int->bv32 (+ d (data-offset value globals)))
|
||||||
;;; char *y = x;
|
|
||||||
;;;(list-head (list-tail data there) 4)
|
|
||||||
(list-tail data (+ here 4)))))))))))
|
(list-tail data (+ here 4)))))))))))
|
||||||
|
|
||||||
;; enum
|
;; enum
|
||||||
|
@ -2205,9 +2182,34 @@ _)))))
|
||||||
(initzer->data info functions globals ta t d (car initzers))
|
(initzer->data info functions globals ta t d (car initzers))
|
||||||
(list-tail data (+ here offset field-size)))))))))))))))
|
(list-tail data (+ here offset field-size)))))))))))))))
|
||||||
|
|
||||||
|
|
||||||
|
;;char cc = g_cells[c].cdr; ==> generic?
|
||||||
|
((decl (decl-spec-list (type-spec ,type)) (init-declr-list (init-declr (ident ,name) (initzer ,initzer))))
|
||||||
|
(let ((type (decl->type type)))
|
||||||
|
(if (.function info)
|
||||||
|
(let* ((locals (add-local locals name type 0))
|
||||||
|
(info (clone info #:locals locals)))
|
||||||
|
(clone info #:text
|
||||||
|
(append (.text ((expr->accu info) initzer))
|
||||||
|
((accu->ident info) name))))
|
||||||
|
(let* ((globals (append globals (list (ident->global name type 1 0))))
|
||||||
|
(here (data-offset name globals)))
|
||||||
|
(clone info
|
||||||
|
#:globals globals
|
||||||
|
#:init (append (.init info)
|
||||||
|
(list (lambda (functions globals ta t d data)
|
||||||
|
(append
|
||||||
|
(list-head data here)
|
||||||
|
(initzer->data info functions globals ta t d initzer)
|
||||||
|
(list-tail data (+ here 4)))))))))))
|
||||||
|
|
||||||
|
|
||||||
((decl (decl-spec-list (type-spec (typename ,type))) (init-declr-list (init-declr (ftn-declr (ident ,name) (param-list . ,param-list)))))
|
((decl (decl-spec-list (type-spec (typename ,type))) (init-declr-list (init-declr (ftn-declr (ident ,name) (param-list . ,param-list)))))
|
||||||
info)
|
info)
|
||||||
|
|
||||||
|
((decl (decl-spec-list (type-spec (typename ,type))) (init-declr-list (init-declr (ftn-declr (ident ,name) (param-list . ,param-list)))) (comment ,comment))
|
||||||
|
info)
|
||||||
|
|
||||||
((decl (decl-spec-list (stor-spec (typedef)) (type-spec (fixed-type ,type))) (init-declr-list (init-declr (ident ,name))))
|
((decl (decl-spec-list (stor-spec (typedef)) (type-spec (fixed-type ,type))) (init-declr-list (init-declr (ident ,name))))
|
||||||
(let ((types (.types info)))
|
(let ((types (.types info)))
|
||||||
(clone info #:types (cons (cons name (assoc-ref types type)) types))))
|
(clone info #:types (cons (cons name (assoc-ref types type)) types))))
|
||||||
|
|
|
@ -251,10 +251,7 @@ assert_fail (char* s)
|
||||||
|
|
||||||
typedef int SCM;
|
typedef int SCM;
|
||||||
|
|
||||||
#if __GNUC__
|
|
||||||
int g_debug = 0;
|
int g_debug = 0;
|
||||||
#endif
|
|
||||||
|
|
||||||
int g_free = 0;
|
int g_free = 0;
|
||||||
|
|
||||||
SCM g_continuations = 0;
|
SCM g_continuations = 0;
|
||||||
|
@ -560,10 +557,7 @@ SCM
|
||||||
append2 (SCM x, SCM y)
|
append2 (SCM x, SCM y)
|
||||||
{
|
{
|
||||||
if (x == cell_nil) return y;
|
if (x == cell_nil) return y;
|
||||||
#if __GNUC__
|
|
||||||
//FIXME GNUC
|
|
||||||
assert (TYPE (x) == TPAIR);
|
assert (TYPE (x) == TPAIR);
|
||||||
#endif
|
|
||||||
return cons (car (x), append2 (cdr (x), y));
|
return cons (car (x), append2 (cdr (x), y));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -578,10 +572,7 @@ pairlis (SCM x, SCM y, SCM a)
|
||||||
pairlis (cdr (x), cdr (y), a));
|
pairlis (cdr (x), cdr (y), a));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#if __GNUC__
|
|
||||||
SCM display_ (SCM);
|
SCM display_ (SCM);
|
||||||
#endif
|
|
||||||
|
|
||||||
SCM
|
SCM
|
||||||
call (SCM fn, SCM x)
|
call (SCM fn, SCM x)
|
||||||
|
@ -594,19 +585,11 @@ call (SCM fn, SCM x)
|
||||||
x = cons (CAR (x), cons (CDADAR (x), CDR (x)));
|
x = cons (CAR (x), cons (CDADAR (x), CDR (x)));
|
||||||
switch (FUNCTION (fn).arity)
|
switch (FUNCTION (fn).arity)
|
||||||
{
|
{
|
||||||
// case 0: return FUNCTION (fn).function0 ();
|
|
||||||
// case 1: return FUNCTION (fn).function1 (car (x));
|
|
||||||
// case 2: return FUNCTION (fn).function2 (car (x), cadr (x));
|
|
||||||
// case 3: return FUNCTION (fn).function3 (car (x), cadr (x), car (cddr (x)));
|
|
||||||
// case -1: return FUNCTION (fn).functionn (x);
|
|
||||||
case 0: {return (FUNCTION (fn).function) ();}
|
case 0: {return (FUNCTION (fn).function) ();}
|
||||||
case 1: {return ((SCM(*)(SCM))(FUNCTION (fn).function)) (car (x));}
|
case 1: {return ((SCM(*)(SCM))(FUNCTION (fn).function)) (car (x));}
|
||||||
case 2: {return ((SCM(*)(SCM,SCM))(FUNCTION (fn).function)) (car (x), cadr (x));}
|
case 2: {return ((SCM(*)(SCM,SCM))(FUNCTION (fn).function)) (car (x), cadr (x));}
|
||||||
case 3: {return ((SCM(*)(SCM,SCM,SCM))(FUNCTION (fn).function)) (car (x), cadr (x), car (cddr (x)));}
|
case 3: {return ((SCM(*)(SCM,SCM,SCM))(FUNCTION (fn).function)) (car (x), cadr (x), car (cddr (x)));}
|
||||||
#if __GNUC__
|
|
||||||
// FIXME GNUC
|
|
||||||
case -1: {return ((SCM(*)(SCM))(FUNCTION (fn).function)) (x);}
|
case -1: {return ((SCM(*)(SCM))(FUNCTION (fn).function)) (x);}
|
||||||
#endif
|
|
||||||
default: {return ((SCM(*)(SCM))(FUNCTION (fn).function)) (x);}
|
default: {return ((SCM(*)(SCM))(FUNCTION (fn).function)) (x);}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -657,9 +640,7 @@ set_env_x (SCM x, SCM e, SCM a)
|
||||||
SCM
|
SCM
|
||||||
call_lambda (SCM e, SCM x, SCM aa, SCM a) ///((internal))
|
call_lambda (SCM e, SCM x, SCM aa, SCM a) ///((internal))
|
||||||
{
|
{
|
||||||
//FIXME
|
SCM cl = cons (cons (cell_closure, x), x);
|
||||||
//SCM cl = cons (cons (cell_closure, x), x);
|
|
||||||
SCM cl;
|
|
||||||
cl = cons (cons (cell_closure, x), x);
|
cl = cons (cons (cell_closure, x), x);
|
||||||
r1 = e;
|
r1 = e;
|
||||||
r0 = cl;
|
r0 = cl;
|
||||||
|
@ -699,10 +680,7 @@ SCM cadr (SCM x) {return car (cdr (x));}
|
||||||
SCM cdar (SCM x) {return cdr (car (x));}
|
SCM cdar (SCM x) {return cdr (car (x));}
|
||||||
SCM cddr (SCM x) {return cdr (cdr (x));}
|
SCM cddr (SCM x) {return cdr (cdr (x));}
|
||||||
|
|
||||||
#if __GNUC__
|
|
||||||
//FIXME
|
|
||||||
SCM gc_pop_frame (); //((internal))
|
SCM gc_pop_frame (); //((internal))
|
||||||
#endif
|
|
||||||
|
|
||||||
SCM
|
SCM
|
||||||
eval_apply ()
|
eval_apply ()
|
||||||
|
@ -765,10 +743,7 @@ eval_apply ()
|
||||||
}
|
}
|
||||||
case TCLOSURE:
|
case TCLOSURE:
|
||||||
{
|
{
|
||||||
//FIXME
|
SCM cl = CLOSURE (car (r1));
|
||||||
//SCM cl = CLOSURE (car (r1));
|
|
||||||
SCM cl;
|
|
||||||
cl = CLOSURE (car (r1));
|
|
||||||
SCM formals = cadr (cl);
|
SCM formals = cadr (cl);
|
||||||
SCM body = cddr (cl);
|
SCM body = cddr (cl);
|
||||||
SCM aa = cdar (cl);
|
SCM aa = cdar (cl);
|
||||||
|
@ -1087,12 +1062,7 @@ SCM
|
||||||
make_symbol_ (SCM s)
|
make_symbol_ (SCM s)
|
||||||
{
|
{
|
||||||
VALUE (tmp_num) = TSYMBOL;
|
VALUE (tmp_num) = TSYMBOL;
|
||||||
///FIXME SCM x = make_cell (tmp_num, s, 0);
|
SCM x = make_cell (tmp_num, s, 0);
|
||||||
SCM x;
|
|
||||||
x = make_cell (tmp_num, s, 0);
|
|
||||||
puts ("MAKE SYMBOL: ");
|
|
||||||
display_ (x);
|
|
||||||
puts ("\n");
|
|
||||||
g_symbols = cons (x, g_symbols);
|
g_symbols = cons (x, g_symbols);
|
||||||
return x;
|
return x;
|
||||||
}
|
}
|
||||||
|
@ -1178,10 +1148,7 @@ write_byte (SCM x) ///((arity . n))
|
||||||
//FILE *f = fd == 1 ? stdout : stderr;
|
//FILE *f = fd == 1 ? stdout : stderr;
|
||||||
assert (TYPE (c) == TNUMBER || TYPE (c) == TCHAR);
|
assert (TYPE (c) == TNUMBER || TYPE (c) == TCHAR);
|
||||||
// fputc (VALUE (c), f);
|
// fputc (VALUE (c), f);
|
||||||
// FIXME
|
char cc = VALUE (c);
|
||||||
//char cc = VALUE (c);
|
|
||||||
char cc;
|
|
||||||
cc = VALUE (c);
|
|
||||||
write (1, (char*)&cc, fd);
|
write (1, (char*)&cc, fd);
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
@ -1252,10 +1219,7 @@ display_ (SCM x)
|
||||||
}
|
}
|
||||||
case TSYMBOL:
|
case TSYMBOL:
|
||||||
{
|
{
|
||||||
// FIXME
|
SCM t = CAR (x);
|
||||||
///SCM t = CAR (x);
|
|
||||||
SCM t;
|
|
||||||
t = CAR (x);
|
|
||||||
while (t != cell_nil)
|
while (t != cell_nil)
|
||||||
{
|
{
|
||||||
putchar (VALUE (CAR (t)));
|
putchar (VALUE (CAR (t)));
|
||||||
|
@ -1461,16 +1425,6 @@ int
|
||||||
main (int argc, char *argv[])
|
main (int argc, char *argv[])
|
||||||
{
|
{
|
||||||
eputs ("Hello mini-mes!\n");
|
eputs ("Hello mini-mes!\n");
|
||||||
|
|
||||||
// make_tmps (g_cells);
|
|
||||||
// SCM x = cstring_to_list ("bla");
|
|
||||||
// while (x != 1)
|
|
||||||
// {
|
|
||||||
// putchar (CDR (CAR (x)));
|
|
||||||
// x = CDR (x);
|
|
||||||
// }
|
|
||||||
// return 0;
|
|
||||||
|
|
||||||
#if __GNUC__
|
#if __GNUC__
|
||||||
//g_debug = getenv ("MES_DEBUG");
|
//g_debug = getenv ("MES_DEBUG");
|
||||||
#endif
|
#endif
|
||||||
|
@ -1505,14 +1459,12 @@ main (int argc, char *argv[])
|
||||||
#if !MES_MINI
|
#if !MES_MINI
|
||||||
gc (g_stack);
|
gc (g_stack);
|
||||||
#endif
|
#endif
|
||||||
#if __GNUC__
|
|
||||||
if (g_debug)
|
if (g_debug)
|
||||||
{
|
{
|
||||||
eputs ("\nstats: [");
|
eputs ("\nstats: [");
|
||||||
eputs (itoa (g_free));
|
eputs (itoa (g_free));
|
||||||
eputs ("]\n");
|
eputs ("]\n");
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -327,6 +327,10 @@ struct_test ()
|
||||||
g_cells[0].car = 1;
|
g_cells[0].car = 1;
|
||||||
g_cells[1].car = 2;
|
g_cells[1].car = 2;
|
||||||
|
|
||||||
|
puts ("t: int c = VALUE (0)\n");
|
||||||
|
int c = CAR (0);
|
||||||
|
if (c != 1) return 1;
|
||||||
|
|
||||||
puts ("t: CAAR (0) != 2\n");
|
puts ("t: CAAR (0) != 2\n");
|
||||||
if (CAAR (0) != 2) return 1;
|
if (CAAR (0) != 2) return 1;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue