Mercurial > hg > CbC > old > device
changeset 507:425f768aba68
*** empty log message ***
author | kono |
---|---|
date | Sat, 24 Dec 2005 22:12:10 +0900 |
parents | 96af6754acd3 |
children | d8102a46b78d |
files | mc-parse.c |
diffstat | 1 files changed, 38 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- a/mc-parse.c Sat Dec 24 21:01:50 2005 +0900 +++ b/mc-parse.c Sat Dec 24 22:12:10 2005 +0900 @@ -1766,20 +1766,53 @@ extern void pfdecl(NMTBL *n) { - int sd = stypedecl; + int e; + int args,nargs,cargs; + NMTBL *a,*n1; if(!chk) gen_enter(n->nm); extrn_use(n); local_static_list = &null_nptr; retlabel=fwdlabel(); - fnptr=n; + fnptr=get_nptr(); + fnptr->ty=n->ty; + fnptr->nm=n->nm; + fnptr->sc=n->sc; + fnptr->attr=n->attr; + fnptr->next=0; + + for(args=n->dsp,nargs=0;args;args=cadr(args)) { + // make copied called function argment + n1 = get_nptr(); + a = (NMTBL*)caddr(args); + n1->ty = a->ty; + n1->nm = a->nm; + n1->sc = a->sc; + n1->attr = a->attr; + + n1->dsp = a->dsp; // def have to be called? + + nargs=list4(car(args),nargs,(int)n1,cadddr(args)); + } + fnptr->dsp=reverse0(nargs); + retcont = 0; tmp_struct = 0; - arg_register(fnptr); + disp=0; + arg_register(fnptr); // should fix n1->dsp + + for(args=fnptr->dsp,cargs=0;args;args=cadr(args)) { + a = (NMTBL*)caddr(args); + // make call function argment for gen_inline + e=list3(a->sc==IVAR?LVAR:a->sc,a->dsp,(int)a); + cargs = list3(e,cargs,a->ty); + } + e = list4(INLINE,list2(FNAME,(int)fnptr),reverse0(cargs), + list3(car(fnptr->ty),cadr(fnptr->ty),caddr(fnptr->ty))); + typedefed=0; - conv->function_(fnptr,sd); conv->lc_(); init_vars=0; if(!chk) gen_enter1(); @@ -1787,8 +1820,7 @@ control=1; cslabel = -1; - g_expr_u(pexpr(car(attr_value(n,INLINE)))); - conv->function_end_(); conv->rc_(); + gen_inline(e); if(!chk) gen_leave(control,n->nm); retpending = 0;