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)) {