Mercurial > hg > CbC > old > device
changeset 503:3c95c69aa80e
*** empty log message ***
author | kono |
---|---|
date | Fri, 23 Dec 2005 19:44:26 +0900 |
parents | bc66e49e25a2 |
children | 48e4f6e6178c |
files | Changes mc-codegen.c mc-inline.c |
diffstat | 3 files changed, 28 insertions(+), 15 deletions(-) [+] |
line wrap: on
line diff
--- a/Changes Fri Dec 23 17:30:00 2005 +0900 +++ b/Changes Fri Dec 23 19:44:26 2005 +0900 @@ -7475,3 +7475,12 @@ recursive inline の検出はやらないといけないわけね。 + +(あぁ、なんかやっちゃったみたい.... また、風邪拾っちゃったよ〜) + +Fri Dec 23 19:37:42 JST 2005 + +ST_* 系列は、先に、cadr(e) を評価しちゃうのでif とかswitchとかの +スコープが狂ってしまう。 + +
--- a/mc-codegen.c Fri Dec 23 17:30:00 2005 +0900 +++ b/mc-codegen.c Fri Dec 23 19:44:26 2005 +0900 @@ -2871,6 +2871,9 @@ } else error(DCERR); nsc = car(ndsp); ndsp = cadr(ndsp); + } else if (inmode) { + nsc = IVAR; + ndsp = --disp; } else { /* local variable alignment is done by new_lvar */ nsc = LVAR;
--- a/mc-inline.c Fri Dec 23 17:30:00 2005 +0900 +++ b/mc-inline.c Fri Dec 23 19:44:26 2005 +0900 @@ -395,10 +395,10 @@ p_vartable(int e,int adisp,int ldisp) { int i; - pvartable = getfree(adisp+ldisp); + pvartable = getfree(adisp-ldisp); // have to be local heap pdisp = pvartable+adisp; - for(i=adisp+ldisp;i>=0;i--) { - pvartable = 0; + for(i=adisp-ldisp;i>=0;i--) { + heap[pvartable+i] = 0; } return 0; } @@ -560,7 +560,7 @@ case EXTRN: case EXTRN1: case STATIC: return pexpr(cadr(e)); default: - v = new_lvar(size(n->dsp)); + v = list3(LVAR,new_lvar(size(n->dsp)),(int)n); } if (heap[pdisp+dsp]) error(-1); heap[pdisp+dsp]=v; @@ -610,7 +610,7 @@ static int p_switch(int e) { - return list4(ST_SWITCH,pexpr(cadr(e)),caddr(e),pexpr(cadddr(e))); + return list4(ST_SWITCH,pexpr(cadr(e)),pexpr(caddr(e)),pexpr(cadddr(e))); } static int @@ -684,7 +684,7 @@ static int p_label(int e) { - return list3(ST_GOTO,pexpr(cadr(e)),caddr(e)); + return list3(ST_LABEL,pexpr(cadr(e)),caddr(e)); } static int @@ -728,6 +728,7 @@ #endif case STRING: case FNAME: + case FLABEL: case RSTRUCT: return e1; case LVAR: @@ -797,43 +798,43 @@ case UPREINC: if ((e3 = pexpr(e2))==e2) return e1; if (car(e3)==CONST) return list2(CONST,cadr(e3)+1); - return list2(car(e1),e3); + return list4(car(e1),e3,caddr(e1),cadddr(e1)); case POSTINC: case UPOSTINC: if ((e3 = pexpr(e2))==e2) return e1; if (car(e3)==CONST) return e3; - return list2(car(e1),e3); + return list4(car(e1),e3,caddr(e1),cadddr(e1)); #if FLOAT_CODE case DPREINC: /* ++d */ if ((e3 = pexpr(e2))==e2) return e1; if (car(e3)==FCONST) return dlist2(FCONST,dcadr(e3)+cadr(e2)); if (car(e3)==DCONST) return dlist2(DCONST,dcadr(e3)+cadr(e2)); - return list2(car(e1),e3); + return list4(car(e1),e3,caddr(e1),cadddr(e1)); case DPOSTINC: /* d++ */ if ((e3 = pexpr(e2))==e2) return e1; if (car(e3)==FCONST||car(e3)==DCONST) return e3; - return list2(car(e1),e3); + return list4(car(e1),e3,caddr(e1),cadddr(e1)); case FPREINC: /* ++f */ if ((e3 = pexpr(e2))==e2) return e1; if (car(e3)==FCONST) return dlist2(FCONST,dcadr(e3)+cadr(e2)); if (car(e3)==DCONST) return dlist2(DCONST,dcadr(e3)+cadr(e2)); - return list2(car(e1),e3); + return list4(car(e1),e3,caddr(e1),cadddr(e1)); case FPOSTINC: /* f++ */ if ((e3 = pexpr(e2))==e2) return e1; if (car(e3)==FCONST||car(e3)==DCONST) return e3; - return list2(car(e1),e3); + return list4(car(e1),e3,caddr(e1),cadddr(e1)); #endif #if LONGLONG_CODE case LPREINC: /* ++d */ case LUPREINC: /* ++d */ if ((e3 = pexpr(e2))==e2) return e1; if (car(e3)==LCONST) return llist2(LCONST,lcadr(e3)+cadr(e2)); - return list2(car(e1),e3); + return list4(car(e1),e3,caddr(e1),cadddr(e1)); case LPOSTINC: /* d++ */ case LUPOSTINC: /* d++ */ if ((e3 = pexpr(e2))==e2) return e1; if (car(e3)==LCONST) return e3; - return list2(car(e1),e3); + return list4(car(e1),e3,caddr(e1),cadddr(e1)); #endif case MUL: case UMUL: case DIV: case UDIV: @@ -950,7 +951,7 @@ int arg_disp = cadr(e1); // size of local variable int e3,t,e4; - pvartable = p_vartable(e,pdisp=arg_disp,caddr(e1)); + pvartable = p_vartable(e,arg_disp,caddr(e1)); /* inline function arguments */ narg = 0; for (e3 = e1 = reverse0(caddr(e)); e3; e3 = cadr(e3)) {