changeset 508:d8102a46b78d

inline test routine first compile passed.
author kono
date Sun, 25 Dec 2005 10:52:54 +0900
parents 425f768aba68
children e58848f6ebc1
files Changes mc-codegen.c mc-inline.c mc-parse.c
diffstat 4 files changed, 33 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- a/Changes	Sat Dec 24 22:12:10 2005 +0900
+++ b/Changes	Sun Dec 25 10:52:54 2005 +0900
@@ -7496,6 +7496,12 @@
 pfdecl で、inline を生成するんだけど、そこで引数のn->dspが arg_register
 などで破壊されてしまう。すると、inline がinlineを含んでいた時に破綻します。
 
-
-
-
+inline return は、まだ、ちゃんとつくってないね。代入になる
+場合があるから、ret_var みたいなので取っておけば良いか。
+
+gen_inline なんだけど、最初は、partial evaluation だけやるつもり
+だったみたいだね。g_expr_u したのは間違いなのか。(そもそも、_u
+じゃないし) 部分的なpartial evaluation は、やってもやらなくても、
+どっちでもいいはず。
+
+
--- a/mc-codegen.c	Sat Dec 24 22:12:10 2005 +0900
+++ b/mc-codegen.c	Sun Dec 25 10:52:54 2005 +0900
@@ -252,7 +252,7 @@
 	jump(e2,caddr(e1));
 	return VOID;
     case INLINE:
-	return g_expr0(pexpr(e1));
+	return gen_inline(e1);
     case INDIRECT:
 	return g_expr0(e2);
     case RINDIRECT:  
--- a/mc-inline.c	Sat Dec 24 22:12:10 2005 +0900
+++ b/mc-inline.c	Sun Dec 25 10:52:54 2005 +0900
@@ -705,6 +705,20 @@
     return list3(ST_COMMENT,pexpr(cadr(e)),caddr(e));
 }
 
+static int
+pgen_inline(int e)
+{
+    int e3;
+    int narg;
+
+    /* inline function arguments */
+    narg = 0;
+    for (e3 = caddr(e); e3; e3 = cadr(e3)) {
+	narg=list3(pexpr(car(e3)),narg,caddr(e3));
+    }
+    return list4(INLINE,cadr(e),reverse0(narg),cadddr(e));
+}
+
 extern int
 pexpr(int e1)
 {
@@ -752,7 +766,7 @@
     case CODE:
 	return list2(car(e1),pexpr(e2));
     case INLINE:
-	return gen_inline(e1);
+	return pgen_inline(e1);
     case INDIRECT:
 	return prindirect(e1);
     case RINDIRECT:  case URINDIRECT:  
@@ -954,7 +968,8 @@
     int e1 = attr_value(n,INLINE);
     int parse = car(e1);      // inline parse tree
     int arg_disp = cadr(e1);  // size of local variable
-    int e3,t,e4;
+    int e3,t,e4,dots;
+    int ret_type = function_type(cadddr(e),&dots);
 
     pvartable = p_vartable(e,arg_disp,caddr(e1));
     /* inline function arguments */
@@ -970,11 +985,11 @@
 	}
 	narg ++;
     }
-    caddr(e) = reverse0(caddr(e));  // make it normal
+    caddr(e) = reverse0(e1);  // make it normal
     e = pexpr(parse);
     pdisp = sdisp;
     pvartable = svartable;
-    return e;
+    return ret_type;
 }
 
 /* end */
--- a/mc-parse.c	Sat Dec 24 22:12:10 2005 +0900
+++ b/mc-parse.c	Sun Dec 25 10:52:54 2005 +0900
@@ -1788,7 +1788,7 @@
 	a = (NMTBL*)caddr(args);
 	n1->ty = a->ty;
 	n1->nm = a->nm;
-	n1->sc = a->sc;
+	n1->sc = a->sc==IVAR?LVAR:a->sc;
 	n1->attr = a->attr;
 
 	n1->dsp = a->dsp; // def have to be called?
@@ -1809,7 +1809,7 @@
         e=list3(a->sc==IVAR?LVAR:a->sc,a->dsp,(int)a);
 	cargs = list3(e,cargs,a->ty);
     }
-    e = list4(INLINE,list2(FNAME,(int)fnptr),reverse0(cargs),
+    e = list4(INLINE,list2(FNAME,(int)n),reverse0(cargs),
 	list3(car(fnptr->ty),cadr(fnptr->ty),caddr(fnptr->ty)));
 
     typedefed=0;
@@ -1820,7 +1820,7 @@
     control=1;
     cslabel = -1;
 
-    gen_inline(e);
+    if(!chk) gen_inline(e);
     if(!chk) gen_leave(control,n->nm);
 
     retpending = 0;
@@ -3483,10 +3483,7 @@
     }
     if (car(e1)==FNAME) {
 	if (is_inline((NMTBL *)cadr(e1))) {
-	    if (inmode)
-		return list4(INLINE,e1,arglist,ftype);
-	    else /* partial evaluation */
-		return gen_inline(list4(INLINE,e1,arglist,ftype));
+	    return list4(INLINE,e1,arglist,ftype);
 	}
     }
     return list4(FUNCTION,e1,arglist,ftype);