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));
     }
 }