mescc: Tinycc support: Valued function assign.

This commit is contained in:
Jan Nieuwenhuizen 2018-05-11 13:34:45 +02:00
parent a1862f749f
commit 70cb56025f
No known key found for this signature in database
GPG key ID: F3C1A0D9C1D65273
3 changed files with 36 additions and 18 deletions

View file

@ -307,6 +307,11 @@
((decl-spec-list (type-spec ,type)) ((decl-spec-list (type-spec ,type))
(ast->type type info)) (ast->type type info))
;; `typedef int size; void foo (unsigned size u)
((decl-spec-list (type-spec ,type) (type-spec ,type2))
(ast->type type info))
((assn-expr ,a ,op ,b) ((assn-expr ,a ,op ,b)
(ast->type a info)) (ast->type a info))
@ -410,8 +415,7 @@
(assoc-ref (.constants info) o) (assoc-ref (.constants info) o)
(assoc-ref (.functions info) o) (assoc-ref (.functions info) o)
(begin (begin
(stderr "info=~s\n" info) (error "ident->variable: undefined variable:" o))))
(error "ident->variable: undefined variabled:" o))))
(define (static-global? o) (define (static-global? o)
((compose global:function cdr) o)) ((compose global:function cdr) o))
@ -702,13 +706,8 @@
(define (ast->comment o) (define (ast->comment o)
(if mes? '() (if mes? '()
(begin (let ((source (with-output-to-string (lambda () (pretty-print-c99 o)))))
(pmatch o (make-comment (string-join (string-split source #\newline) " ")))))
;; Nyacc 0.80.42: missing (enum-ref (ident "fred"))
((decl (decl-spec-list (type-spec (enum-ref . _))) . _)
'())
(_ (let ((source (with-output-to-string (lambda () (pretty-print-c99 o)))))
(make-comment (string-join (string-split source #\newline) " "))))))))
(define (accu*n info n) (define (accu*n info n)
(append-text info (wrap-as (case n (append-text info (wrap-as (case n
@ -1670,7 +1669,9 @@
((decl . ,decl) ((decl . ,decl)
;;FIXME: ridiculous performance hit with mes ;;FIXME: ridiculous performance hit with mes
(let ((info (append-text info (ast->comment o)))) ;; Nyacc 0.80.42: missing (enum-ref (ident "fred"))
(let (;;(info (append-text info (ast->comment o)))
)
(decl->info info decl))) (decl->info info decl)))
;; ... ;; ...
((gt . _) (expr->accu o info)) ((gt . _) (expr->accu o info))
@ -1881,6 +1882,11 @@
(if (not size) data (if (not size) data
(append data (string->list (make-string (max 0 (- size (length data))) #\nul)))))) (append data (string->list (make-string (max 0 (- size (length data))) #\nul))))))
(((initzer (p-expr (string . ,strings))))
(let ((data (string->list (apply string-append strings))))
(if (not size) data
(append data (string->list (make-string (max 0 (- size (length data))) #\nul))))))
((initzer (p-expr (fixed ,fixed))) ((initzer (p-expr (fixed ,fixed)))
(int->bv32 (expr->number info fixed))) (int->bv32 (expr->number info fixed)))
@ -2120,10 +2126,16 @@
(rank (ptr-declr->rank pointer))) (rank (ptr-declr->rank pointer)))
(if (zero? rank) type (if (zero? rank) type
(make-pointer type rank)))) (make-pointer type rank))))
(((decl-spec-list (type-spec ,type)) . ,rest) (((decl-spec-list (type-spec ,type)) . _)
(ast->type type info)) (ast->type type info))
(((decl-spec-list (stor-spec ,store) (type-spec ,type)) (ftn-declr (ident _) _) _) (((decl-spec-list (stor-spec ,store) (type-spec ,type)) . _)
(ast->type type info)) (ast->type type info))
;; (((decl-spec-list (stor-spec ,store) (type-spec ,type)) (ftn-declr (ident _) _) _)
;; (ast->type type info))
;; (((decl-spec-list (stor-spec ,store) (type-spec ,type)) (ptr-declr ,pointer (ftn-declr (ident _) _)) _)
;; (ast->type type info))
(_ (error "fctn-defn:get-type: not supported:" o)))) (_ (error "fctn-defn:get-type: not supported:" o))))
(define (ftn-declr:get-type info o) (define (ftn-declr:get-type info o)
@ -2149,7 +2161,9 @@
(text (param-list->text formals)) (text (param-list->text formals))
(locals (param-list->locals formals info)) (locals (param-list->locals formals info))
(statement (fctn-defn:get-statement o)) (statement (fctn-defn:get-statement o))
(info (clone info #:locals locals #:function name #:text text #:statics '())) (function (cons name (make-function name type '())))
(functions (cons function (.functions info)))
(info (clone info #:locals locals #:function name #:text text #:functions functions #:statics '()))
(info (ast->info statement info)) (info (ast->info statement info))
(locals (.locals info)) (locals (.locals info))
(local (and (pair? locals) (car locals))) (local (and (pair? locals) (car locals)))

View file

@ -26,6 +26,7 @@ struct foo
struct foo* struct foo*
test (struct foo* f) test (struct foo* f)
{ {
void (*fun) () = test;
return f; return f;
} }

View file

@ -20,16 +20,19 @@
static int sint; static int sint;
static int sint2, sint3; static int sint2, sint3;
typedef unsigned int size;
static int static void*
test () test (size u)
{ {
return 0; void *r;
if (u)
r = test (u);
} }
static int i = 2; static int i = 2;
int int
main () main ()
{ {
return test (); void (*foo)() = &test;
return test (0);
} }