Mercurial > hg > CbC > old > device
changeset 508:d8102a46b78d
inline test routine first compile passed.
author | kono |
---|---|
date | Sun, 25 Dec 2005 10:52:54 +0900 |
parents | 425f768aba68 |
children | e58848f6ebc1 |
files | Changes mc-codegen.c mc-inline.c mc-parse.c |
diffstat | 4 files changed, 33 insertions(+), 15 deletions(-) [+] |
line wrap: on
line diff
--- a/Changes Sat Dec 24 22:12:10 2005 +0900 +++ b/Changes Sun Dec 25 10:52:54 2005 +0900 @@ -7496,6 +7496,12 @@ pfdecl で、inline を生成するんだけど、そこで引数のn->dspが arg_register などで破壊されてしまう。すると、inline がinlineを含んでいた時に破綻します。 - - - +inline return は、まだ、ちゃんとつくってないね。代入になる +場合があるから、ret_var みたいなので取っておけば良いか。 + +gen_inline なんだけど、最初は、partial evaluation だけやるつもり +だったみたいだね。g_expr_u したのは間違いなのか。(そもそも、_u +じゃないし) 部分的なpartial evaluation は、やってもやらなくても、 +どっちでもいいはず。 + +
--- a/mc-codegen.c Sat Dec 24 22:12:10 2005 +0900 +++ b/mc-codegen.c Sun Dec 25 10:52:54 2005 +0900 @@ -252,7 +252,7 @@ jump(e2,caddr(e1)); return VOID; case INLINE: - return g_expr0(pexpr(e1)); + return gen_inline(e1); case INDIRECT: return g_expr0(e2); case RINDIRECT:
--- a/mc-inline.c Sat Dec 24 22:12:10 2005 +0900 +++ b/mc-inline.c Sun Dec 25 10:52:54 2005 +0900 @@ -705,6 +705,20 @@ return list3(ST_COMMENT,pexpr(cadr(e)),caddr(e)); } +static int +pgen_inline(int e) +{ + int e3; + int narg; + + /* inline function arguments */ + narg = 0; + for (e3 = caddr(e); e3; e3 = cadr(e3)) { + narg=list3(pexpr(car(e3)),narg,caddr(e3)); + } + return list4(INLINE,cadr(e),reverse0(narg),cadddr(e)); +} + extern int pexpr(int e1) { @@ -752,7 +766,7 @@ case CODE: return list2(car(e1),pexpr(e2)); case INLINE: - return gen_inline(e1); + return pgen_inline(e1); case INDIRECT: return prindirect(e1); case RINDIRECT: case URINDIRECT: @@ -954,7 +968,8 @@ int e1 = attr_value(n,INLINE); int parse = car(e1); // inline parse tree int arg_disp = cadr(e1); // size of local variable - int e3,t,e4; + int e3,t,e4,dots; + int ret_type = function_type(cadddr(e),&dots); pvartable = p_vartable(e,arg_disp,caddr(e1)); /* inline function arguments */ @@ -970,11 +985,11 @@ } narg ++; } - caddr(e) = reverse0(caddr(e)); // make it normal + caddr(e) = reverse0(e1); // make it normal e = pexpr(parse); pdisp = sdisp; pvartable = svartable; - return e; + return ret_type; } /* end */
--- a/mc-parse.c Sat Dec 24 22:12:10 2005 +0900 +++ b/mc-parse.c Sun Dec 25 10:52:54 2005 +0900 @@ -1788,7 +1788,7 @@ a = (NMTBL*)caddr(args); n1->ty = a->ty; n1->nm = a->nm; - n1->sc = a->sc; + n1->sc = a->sc==IVAR?LVAR:a->sc; n1->attr = a->attr; n1->dsp = a->dsp; // def have to be called? @@ -1809,7 +1809,7 @@ 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), + e = list4(INLINE,list2(FNAME,(int)n),reverse0(cargs), list3(car(fnptr->ty),cadr(fnptr->ty),caddr(fnptr->ty))); typedefed=0; @@ -1820,7 +1820,7 @@ control=1; cslabel = -1; - gen_inline(e); + if(!chk) gen_inline(e); if(!chk) gen_leave(control,n->nm); retpending = 0; @@ -3483,10 +3483,7 @@ } if (car(e1)==FNAME) { if (is_inline((NMTBL *)cadr(e1))) { - if (inmode) - return list4(INLINE,e1,arglist,ftype); - else /* partial evaluation */ - return gen_inline(list4(INLINE,e1,arglist,ftype)); + return list4(INLINE,e1,arglist,ftype); } } return list4(FUNCTION,e1,arglist,ftype);