Mercurial > hg > CbC > old > device
changeset 511:14c7faf78910
inline continue (first binary run)
author | kono |
---|---|
date | Sun, 25 Dec 2005 17:40:11 +0900 |
parents | 2bd6ff6ee9a8 |
children | 53ec17a8af7d |
files | Changes mc-codegen.c mc-inline.c mc-parse.c |
diffstat | 4 files changed, 17 insertions(+), 9 deletions(-) [+] |
line wrap: on
line diff
--- a/Changes Sun Dec 25 16:29:40 2005 +0900 +++ b/Changes Sun Dec 25 17:40:11 2005 +0900 @@ -7506,8 +7506,10 @@ Sun Dec 25 16:26:03 JST 2005 -あぁ、確かに goto のラベルは、inline の中ではlocal なscopeに -しないといけないのであった。で、どうすれば良いわけ? - - - +あぁ、確かに goto のラベルは、inline の中ではlocal なscope +にしないといけないのであった。で、どうすれば良いわけ? + +うまく直せない。scope 関係を見直せば良いんだけど.... enter_top_scope とか。 +マルチレベルscopeになるわけね。 + +
--- a/mc-codegen.c Sun Dec 25 16:29:40 2005 +0900 +++ b/mc-codegen.c Sun Dec 25 17:40:11 2005 +0900 @@ -2811,6 +2811,7 @@ nsc = FLABEL; if (!inmode) ndsp = fwdlabel(); + // で、inmode の時は? break; case ADECL: // funcion arguments if(!integral(type0)&&type0>0&&(car(type0)==FUNCTION||car(type0)==CODE)) {
--- a/mc-inline.c Sun Dec 25 16:29:40 2005 +0900 +++ b/mc-inline.c Sun Dec 25 17:40:11 2005 +0900 @@ -969,9 +969,11 @@ 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,dots; + int e2,e3,t,e4,dots; int ret_type = function_type(cadddr(e),&dots); + enter_scope(); // to make label scope happy + fnptr = n; // st_return see this pvartable = p_vartable(e,arg_disp,caddr(e1)); /* inline function arguments */ @@ -989,13 +991,14 @@ narg ++; } caddr(e) = reverse0(e1); // make it normal - e = pexpr(parse); + e2 = pexpr(parse); pdisp = sdisp; pvartable = svartable; // how to handle return value? - g_expr_u(e); + g_expr_u(e2); fnptr = sfnptr; + leave_scope(); return ret_type; }
--- a/mc-parse.c Sun Dec 25 16:29:40 2005 +0900 +++ b/mc-parse.c Sun Dec 25 17:40:11 2005 +0900 @@ -2547,11 +2547,13 @@ parse = list3(ST_LABEL,parse,(int)get_name(nptr->nm,0,0)); else { if(nptr->sc == FLABEL) { + // already used by goto with fwdlabel fwddef(nptr->dsp); } else if(nptr->sc != EMPTY && nptr->sc != EXTRN1) { - error(TYERR); + error(TYERR); // duplicate label } else { nptr->sc=EMPTY; + // define this label in top level scope nptr1=l_top_search(nptr->nm,0); nptr1->sc = BLABEL; nptr1->dsp = backdef();