changeset 613:3b9e0e59ab97

*** empty log message ***
author kono
date Wed, 19 Apr 2006 14:32:36 +0900
parents 26daeeef30a0
children e4e007f4026d
files Changes mc-codegen.c
diffstat 2 files changed, 46 insertions(+), 20 deletions(-) [+]
line wrap: on
line diff
--- a/Changes	Sat Apr 15 22:21:52 2006 +0900
+++ b/Changes	Wed Apr 19 14:32:36 2006 +0900
@@ -8714,3 +8714,18 @@
     nptr->dsp = i;
 
 再利用を考えると、これじゃないか? (また、時間があったら、直そう...)
+
+Sun Apr 16 17:41:36 JST 2006
+
+やっぱり、list の実装が見えるのは良くない。GC を入れても良いし。
+そういう意味では、そろそろ捨ててもいいし、作り直しても良いんだよな。
+
+list のタグで要素の型がわかる方がいいけどね。ということは、
+Object で構成するってこと? Java で書き直してもいいけど。
+まぁ、いいろいろイキヅマリガあるよな。
+
+
+
+
+
+
--- a/mc-codegen.c	Sat Apr 15 22:21:52 2006 +0900
+++ b/mc-codegen.c	Wed Apr 19 14:32:36 2006 +0900
@@ -290,6 +290,12 @@
 	jump(e2,caddr(e1));
 	return VOID;
     case ARRAY:
+	if (chk==2) {
+	    g_expr0(e2);
+	    g_expr0(caddr(e1));
+	    code_gexpr(e1);
+	    return t;
+	}
 	e1=binop(ADD,e2,caddr(e1),cadddr(e1),caddddr(e1));
 	e1 = indop(e1); t = type;
 	g_expr0(e1);
@@ -2925,13 +2931,17 @@
 	if (car(e)<0) {
 	    mode = GDECL;
 	    switch (car(e)){
-	    case CONST: e=list2(car(e),cadr(e));
+	    case CONST: e=list2(car(e),cadr(e)); break;
 	    case FCONST: 
-	    case DCONST: e=dlist2(car(e),dcadr(e));
-	    case LCONST: e=llist2(car(e),lcadr(e));
-	    case STRING: e=list3(car(e),cadr(e),caddr(e));
+	    case DCONST: e=dlist2(car(e),dcadr(e)); break;
+	    case LCONST: e=llist2(car(e),lcadr(e)); break;
+	    case STRING: e=list3(car(e),cadr(e),caddr(e)); break;
 	    case STRUCT:  // for udpcl
-		e=glist3(car(e),copy_expr(cadr(e)),copy_expr(caddr(e)));
+		e=glist3(car(e),copy_expr(cadr(e)),copy_expr(caddr(e))); break;
+	    case ARRAY:
+		e= glist5(car(e),copy_expr(cadr(e)),
+		copy_expr(caddr(e)),cadddr(e),caddddr(e)); 
+		break;
 	    }
 	    mode = smode;
 	    return e;
@@ -2941,8 +2951,6 @@
 	case ARROW:
 	case PERIOD:
 	    return glist4(car(e),copy_expr(cadr(e)),caddr(e),cadddr(e));
-	case ARRAY:
-	    return glist5(car(e),copy_expr(cadr(e)),copy_expr(caddr(e)),cadddr(e),caddddr(e));
 	case LVAR: case RLVAR:
 	case GVAR: case RGVAR:
 	    return (e>=lfree)?glist3(car(e),cadr(e),caddr(e)):e;
@@ -3047,24 +3055,26 @@
 
 //    printf("## asm\n");
     e = reverse0(e);
+
     for(i=out;i;i=cadr(i)) {
-	p = ((NMTBL*)cadr(car(i)))->nm;
-	e1 = car(e); e = cadr(e);
-	repl = code_asm_operand(p,e1,ASM_OUTPUT,repl,0,0);
-	if (car(car(repl))==REGISTER) {
-	    assign = list2(assign_expr0(e1,car(repl),INT,INT),assign);
-	}
+        p = ((NMTBL*)cadr(car(i)))->nm;
+        e1 = car(e); e = cadr(e);
+        repl = code_asm_operand(p,e1,ASM_OUTPUT,repl,0,0);
+        if (!chk && car(car(repl))==REGISTER) {
+            assign = list2(assign_expr0(e1,car(repl),INT,INT),assign);
+        }
     }
     repl0 = repl;
     n = length(repl0);
     for(i=in;i;i=cadr(i)) {
-	p = ((NMTBL*)cadr(car(i)))->nm;
-	e1 = car(e); e = cadr(e);
-	repl = code_asm_operand(p,e1,ASM_INPUT,repl,n,repl0);
-	if (car(car(repl))==REGISTER) {
-	    g_expr_u(assign_expr0(car(repl),e1,INT,INT));
-	}
+        p = ((NMTBL*)cadr(car(i)))->nm;
+        e1 = car(e); e = cadr(e);
+        repl = code_asm_operand(p,e1,ASM_INPUT,repl,n,repl0);
+        if (!chk && car(car(repl))==REGISTER) {
+            g_expr_u(assign_expr0(car(repl),e1,INT,INT));
+        }
     }
+
     repl = reverse0(repl);
     p = ((NMTBL*)cadr(asm0))->nm;
     code_asm(p,repl);
@@ -4530,7 +4540,8 @@
     }
     if ((t1=type_value(type))>0 && 
 	    car(type_value(type))==ARRAY && car(e)==GVAR) {
-	e=list2(ADDRESS,e);
+	if (!chk)
+	    e=list2(ADDRESS,e);
     }
     if (t>0) {
 	switch(car(t)) {