Mercurial > hg > CbC > old > device
changeset 525:d84cea14dbdc
*** empty log message ***
author | kono |
---|---|
date | Wed, 28 Dec 2005 11:32:22 +0900 |
parents | 135afeb2e134 |
children | 9ff5cd7afe2f |
files | Changes mc-codegen.c mc-inline.c |
diffstat | 3 files changed, 12 insertions(+), 14 deletions(-) [+] |
line wrap: on
line diff
--- a/Changes Wed Dec 28 11:07:17 2005 +0900 +++ b/Changes Wed Dec 28 11:32:22 2005 +0900 @@ -7557,6 +7557,8 @@ const でreplaceする時がまずいな。RIVARみたいなのを作ると、 ちょっとcaseが増えすぎるが... pindirect でいんちきするか。 +(で、あとで、やっぱりだめで、const replace を諦めてるし) + const で置換したIVARのアドレスを取られると気まずいなぁ。 このあたりはマルチパスでないとできない。まぁ、parse tree を
--- a/mc-codegen.c Wed Dec 28 11:07:17 2005 +0900 +++ b/mc-codegen.c Wed Dec 28 11:32:22 2005 +0900 @@ -3267,13 +3267,13 @@ e1=e3; } } - return list3(t,e1,offset); + return list4(t,e1,offset,type); } extern int rvalue(int e) { - int op,c; + int op,c,e1; NMTBL *n; int type0 = type_value(type); @@ -3334,6 +3334,7 @@ } return(list3(RLVAR+op,cadr(e),caddr(e))); case INDIRECT: + e1=cadr(e); return(indirect(RINDIRECT+op,cadr(e))); case IVAR: return(indirect(RINDIRECT+op,e));
--- a/mc-inline.c Wed Dec 28 11:07:17 2005 +0900 +++ b/mc-inline.c Wed Dec 28 11:32:22 2005 +0900 @@ -446,18 +446,13 @@ static int prindirect(int e) { - if (cadr(e) && car(cadr(e))==IVAR) { - int lvar=p_lvar(cadr(e)); - if (car(lvar)!=LVAR) { - if (caddr(e)) { - return list3(ADD,lvar,caddr(e)); - } else { - return lvar; - } - } else { - return list3(car(e),lvar,caddr(e)); - } - } else { + int lvar; + if (car(lvar=cadr(e))==IVAR) + lvar=p_lvar(cadr(e)); // can be anything.... + switch(car(lvar)) { + case LVAR: + return rvalue_t(lvar,cadddr(e)); + default: return list3(car(e),pexpr(cadr(e)),caddr(e)); } }