changeset 511:14c7faf78910

inline continue (first binary run)
author kono
date Sun, 25 Dec 2005 17:40:11 +0900
parents 2bd6ff6ee9a8
children 53ec17a8af7d
files Changes mc-codegen.c mc-inline.c mc-parse.c
diffstat 4 files changed, 17 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/Changes	Sun Dec 25 16:29:40 2005 +0900
+++ b/Changes	Sun Dec 25 17:40:11 2005 +0900
@@ -7506,8 +7506,10 @@
 
 Sun Dec 25 16:26:03 JST 2005
 
-あぁ、確かに goto のラベルは、inline の中ではlocal なscopeに
-しないといけないのであった。で、どうすれば良いわけ?
-
-
-
+あぁ、確かに goto のラベルは、inline の中ではlocal なscope
+にしないといけないのであった。で、どうすれば良いわけ? 
+
+うまく直せない。scope 関係を見直せば良いんだけど.... enter_top_scope とか。
+マルチレベルscopeになるわけね。
+
+
--- a/mc-codegen.c	Sun Dec 25 16:29:40 2005 +0900
+++ b/mc-codegen.c	Sun Dec 25 17:40:11 2005 +0900
@@ -2811,6 +2811,7 @@
 	nsc = FLABEL;
 	if (!inmode)
 	    ndsp = fwdlabel();
+	// で、inmode の時は?
 	break;
     case ADECL:                 // funcion arguments
 	if(!integral(type0)&&type0>0&&(car(type0)==FUNCTION||car(type0)==CODE)) {
--- a/mc-inline.c	Sun Dec 25 16:29:40 2005 +0900
+++ b/mc-inline.c	Sun Dec 25 17:40:11 2005 +0900
@@ -969,9 +969,11 @@
     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,dots;
+    int e2,e3,t,e4,dots;
     int ret_type = function_type(cadddr(e),&dots);
 
+    enter_scope(); // to make label scope happy
+
     fnptr = n;   // st_return see this
     pvartable = p_vartable(e,arg_disp,caddr(e1));
     /* inline function arguments */
@@ -989,13 +991,14 @@
 	narg ++;
     }
     caddr(e) = reverse0(e1);  // make it normal
-    e = pexpr(parse);
+    e2 = pexpr(parse);
     pdisp = sdisp;
     pvartable = svartable;
     // how to handle return value?
-    g_expr_u(e);
+    g_expr_u(e2);
     fnptr = sfnptr;
 
+    leave_scope();
     return ret_type;
 }
 
--- a/mc-parse.c	Sun Dec 25 16:29:40 2005 +0900
+++ b/mc-parse.c	Sun Dec 25 17:40:11 2005 +0900
@@ -2547,11 +2547,13 @@
 	parse = list3(ST_LABEL,parse,(int)get_name(nptr->nm,0,0));
     else {
 	if(nptr->sc == FLABEL) {
+	    // already used by goto with fwdlabel
 	    fwddef(nptr->dsp);
 	} else if(nptr->sc != EMPTY && nptr->sc != EXTRN1) {
-	    error(TYERR);
+	    error(TYERR); // duplicate label
 	} else {
 	    nptr->sc=EMPTY;
+	    // define this label in top level scope
 	    nptr1=l_top_search(nptr->nm,0);
 	    nptr1->sc = BLABEL;
 	    nptr1->dsp = backdef();