Mercurial > hg > CbC > old > device
changeset 510:2bd6ff6ee9a8
inline continue...
author | kono |
---|---|
date | Sun, 25 Dec 2005 16:29:40 +0900 |
parents | e58848f6ebc1 |
children | 14c7faf78910 |
files | Changes mc-inline.c |
diffstat | 2 files changed, 14 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/Changes Sun Dec 25 16:07:45 2005 +0900 +++ b/Changes Sun Dec 25 16:29:40 2005 +0900 @@ -7504,4 +7504,10 @@ じゃないし) 部分的なpartial evaluation は、やってもやらなくても、 どっちでもいいはず。 - +Sun Dec 25 16:26:03 JST 2005 + +あぁ、確かに goto のラベルは、inline の中ではlocal なscopeに +しないといけないのであった。で、どうすれば良いわけ? + + +
--- a/mc-inline.c Sun Dec 25 16:07:45 2005 +0900 +++ b/mc-inline.c Sun Dec 25 16:29:40 2005 +0900 @@ -287,18 +287,18 @@ rvalue_t(car(struct_return),caddr(struct_return))); replace_return_struct(cadr(e), rvalue_t(car(struct_return),caddr(struct_return))); - gexpr(cadr(e),0); + g_expr_u(cadr(e)); } else { type = caddr(struct_return); // e1 = rvalue_t(cadr(struct_return),INT); /* size */ e1 = cadr(struct_return); /* size */ - gexpr(list4(STASS,rvalue(car(struct_return)),e,e1),0); + g_expr_u(list4(STASS,rvalue(car(struct_return)),e,e1)); } } else { error(TYERR); /* should check compatible */ } } else { - gexpr(correct_type(e,cadr(fnptr->ty)),1); + g_expr(correct_type(e,cadr(fnptr->ty))); } // conv->return_end_(); retpending = 1; @@ -962,6 +962,7 @@ gen_inline(int e) { int svartable = pvartable; + NMTBL *sfnptr = fnptr; int sdisp = pdisp; int narg,arg; NMTBL *n = (NMTBL*)cadr(cadr(e)); @@ -971,6 +972,7 @@ int e3,t,e4,dots; int ret_type = function_type(cadddr(e),&dots); + fnptr = n; // st_return see this pvartable = p_vartable(e,arg_disp,caddr(e1)); /* inline function arguments */ narg = 0; @@ -992,6 +994,8 @@ pvartable = svartable; // how to handle return value? g_expr_u(e); + fnptr = sfnptr; + return ret_type; }