# HG changeset patch # User kono # Date 1135737142 -32400 # Node ID d84cea14dbdc09df8c3efd11ffc6ecd4b8b194eb # Parent 135afeb2e1342b49838dd9dc47a8c18b3bdf4ef9 *** empty log message *** diff -r 135afeb2e134 -r d84cea14dbdc Changes --- 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 を diff -r 135afeb2e134 -r d84cea14dbdc mc-codegen.c --- 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)); diff -r 135afeb2e134 -r d84cea14dbdc mc-inline.c --- 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)); } }