[前][次][番号順一覧][スレッド一覧][生データ]

yarv-diff:268

From: ko1 atdot.net
Date: 16 Feb 2006 14:03:36 -0000
Subject: [yarv-diff:268] r431 - trunk

Author: ko1
Date: 2006-02-16 23:03:36 +0900 (Thu, 16 Feb 2006)
New Revision: 431

Modified:
   trunk/
   trunk/ChangeLog
   trunk/insns.def
   trunk/test.rb
   trunk/vm.c
Log:
 r652@lermite:  ko1 | 2006-02-16 23:03:41 +0900
 	* insns.def, vm.c : use th_yield_setup_args at yield and Proc#call
 



Property changes on: trunk
___________________________________________________________________
Name: svk:merge
   - 81cd9672-7512-7e48-ae48-6936450e977d:/local/yarv/trunk:650
   + 81cd9672-7512-7e48-ae48-6936450e977d:/local/yarv/trunk:652

Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2006-02-16 10:58:39 UTC (rev 430)
+++ trunk/ChangeLog	2006-02-16 14:03:36 UTC (rev 431)
@@ -4,6 +4,11 @@
 #  from Mon, 03 May 2004 01:24:19 +0900
 #
 
+2006-02-16(Thu) 22:58:27 +0900  Koichi Sasada  <ko1 atdot.net>
+
+	* insns.def, vm.c : use th_yield_setup_args at yield and Proc#call
+
+
 2006-02-16(Thu) 19:51:52 +0900  Koichi Sasada  <ko1 atdot.net>
 
 	* compile.c : fix analysis of block parameter

Modified: trunk/insns.def
===================================================================
--- trunk/insns.def	2006-02-16 10:58:39 UTC (rev 430)
+++ trunk/insns.def	2006-02-16 14:03:36 UTC (rev 431)
@@ -1309,79 +1309,15 @@
 	    }
 	}
 
-	if (0) {
-	    printf("     argc: %d\n", argc);
-	    printf("iseq argc: %d\n", iseq->argc);
-	    printf("iseq rest: %d\n", iseq->arg_rest);
-	    printf("iseq blck: %d\n", iseq->arg_block);
-	}
+	INC_SP(-argc);
+	argc = th_yield_setup_args(iseq, argc, GET_SP());
+	INC_SP(argc);
 
-	if (iseq->argc == 1 && iseq->arg_rest != -1) {
-	    /* TODO: for backward compatibility */
-	    if (argc > 1) {
-		INC_SP(1 - argc);
-		*(GET_SP() - 1) = rb_ary_new4(argc, GET_SP() - 1);
-		argc = 1;
-	    }
-	    else if (iseq->arg_rest > 0) {
-		INC_SP(1 - argc);
-		*(GET_SP() - 1) = rb_ary_new4(argc, GET_SP() - 1);
-		argc = 1;
-	    }
-	}
-	else {
-	    if (argc == 1) {
-		VALUE ary = TOPN(0);
-
-		if (TYPE(ary) == T_ARRAY) {
-		    int i;
-		    INC_SP(-1);
-		    argc = 0;
-		    for (i = 0; i < RARRAY(ary)->len; i++) {
-			*GET_SP() = RARRAY(ary)->ptr[i];
-			INC_SP(1);
-			argc++;
-		    }
-		}
-	    }
-	    if (iseq->arg_rest != 0) {
-		if (iseq->arg_rest == -1) {
-		}
-		else {
-		    /*
-		     * a1 a2 a3 r1 r2 r3 _
-		     *          ^r (=3)  ^sp, argc = 6
-		     */
-		    int rest = iseq->arg_rest - 1;
-		    int alen;
-		    VALUE *rv = GET_SP() - (argc - rest);
-
-		    if (argc > rest) {
-			alen = argc - rest;
-		    }
-		    else {
-			VALUE *p = GET_SP();
-			while (p != rv) {
-			    *p++ = Qnil;
-			}
-			alen = 0;
-		    }
-		    argc = rest + 1;
-		    *rv = rb_ary_new4(alen, rv);
-		    SET_SP(rv + 1);
-		}
-	    }
-	}
-
-	if (argc > iseq->argc) {
-	    INC_SP(iseq->argc - argc);
-	    argc -= argc - iseq->argc;
-	}
-
 	th_set_env(th, iseq,
 		   FRAME_MAGIC_BLOCK, block->self, (VALUE) block->dfp,
 		   iseq->iseq_encoded, GET_SP(), block->lfp,
 		   iseq->local_size - argc, 0, 0);
+
 	reg_cfp->sp -= argc;
 	RESTORE_REGS();
 	NEXT_INSN();

Modified: trunk/test.rb
===================================================================
--- trunk/test.rb	2006-02-16 10:58:39 UTC (rev 430)
+++ trunk/test.rb	2006-02-16 14:03:36 UTC (rev 431)
@@ -1,7 +1,25 @@
-lambda{|*x| p x}.call
 
+[[1, 2]].each{|a, b| p [a, b]}
+
 __END__
 
+proc{|a, b| p [a, b]}.call(:x, :y)
+
+__END__
+def iter
+  yield 1,2
+end
+
+iter{|a, b, c, *r|
+  p [a,b,c,r]
+}
+
+__END__
+p proc {|a, b| [a, b] }.call([1,2])
+
+
+__END__
+
 Proc.new{|a, b| p [a, b]}.call(1, 2, 3)
 
 __END__

Modified: trunk/vm.c
===================================================================
--- trunk/vm.c	2006-02-16 10:58:39 UTC (rev 430)
+++ trunk/vm.c	2006-02-16 14:03:36 UTC (rev 431)
@@ -543,10 +543,12 @@
     return val;
 }
 
-static int
-th_yield_setup_args(yarv_iseq_t *iseq, int argc, VALUE *argv, VALUE **ret)
+static inline int
+th_yield_setup_args(yarv_iseq_t *iseq, int argc, VALUE *argv)
 {
-    if (0) {
+    int i;
+    
+    if (0) { // for debug
 	printf("     argc: %d\n", argc);
 	printf("iseq argc: %d\n", iseq->argc);
 	printf("iseq rest: %d\n", iseq->arg_rest);
@@ -564,26 +566,41 @@
 	}
     }
     else {
-	if (argc == 1 && !SPECIAL_CONST_P(argv[0]) &&
-	    BUILTIN_TYPE(argv[0]) == T_ARRAY) {
-	    argc = RARRAY(argv[0])->len;
-	    argv = RARRAY(argv[0])->ptr;
+	if (argc == 1 && TYPE(argv[0]) == T_ARRAY) {
+	    VALUE ary = argv[0];
+	    argc = RARRAY(ary)->len;
+
+	    /* TODO: check overflow */
+	    for (i=0; i<argc; i++) {
+		argv[i] = RARRAY(ary)->ptr[i];
+	    }
 	}
-	
+
 	if (iseq->arg_rest != 0) {
 	    if (iseq->arg_rest == -1) {
 		/* */
 	    }
 	    else {
 		int rest = iseq->arg_rest - 1;
-
 		if (argc <= rest) {
-		    VALUE ary = rb_ary_new4(argc, argv);
-		    rb_ary_store(ary, rest, rb_ary_new());
-		    argc = RARRAY(ary)->len;
-		    argv = RARRAY(ary)->ptr;
+		    /*  param: a, b, c, *r
+		     *  args : x, y
+		     * =>
+		     *       : x, y, nil, []
+		     */
+		    for (i=argc; i<rest; i++) {
+			argv[i] = Qnil; /* initialize */
+		    }
+		    argv[rest] = rb_ary_new();
+		    argc = rest + 1;
 		}
 		else {
+		    /*  param: a, *r
+		     *  args : x, y, z
+		     * =>
+		     *       : x, [y, z]
+		     */
+		    /* TODO: check overflow */
 		    argv[rest] = rb_ary_new4(argc - rest, &argv[rest]);
 		    argc = rest + 1;
 		}
@@ -594,9 +611,6 @@
 	argc = iseq->argc;
     }
 
-    if (ret) {
-	*ret = argv;
-    }
     return argc;
 }
 
@@ -612,13 +626,20 @@
     else {
 	if (BUILTIN_TYPE(block->iseq) != T_NODE) {
 	    yarv_iseq_t *iseq = block->iseq;
-	    argc = th_yield_setup_args(iseq, argc, argv, &argv);
+	    int i;
+	    th_set_finish_env(th);
 
-	    th_set_finish_env(th);
+	    /* TODO: check overflow */
+	    for (i=0; i<argc; i++) {
+		th->cfp->sp[i] = argv[i];
+	    }
+	    argc = th_yield_setup_args(iseq, argc, th->cfp->sp);
+	    th->cfp->sp += argc;
+
 	    th_set_env(th, iseq, FRAME_MAGIC_BLOCK,
 		       block->self, GC_GUARDED_PTR(block->dfp),
 		       iseq->iseq_encoded, th->cfp->sp, block->lfp,
-		       iseq->local_size, argc, argv);
+		       iseq->local_size - argc, 0, 0);
 	    val = th_eval_body(th);
 	}
 	else {
@@ -636,14 +657,23 @@
 	return th_invoke_yield_cfunc(th, &proc->block, argc, argv);
     }
     else {
-	argc = th_yield_setup_args(proc->block.iseq, argc, argv, &argv);
+	yarv_iseq_t *iseq = proc->block.iseq;
+	int i;
 	th_set_finish_env(th);
-	th_set_env(th, proc->block.iseq,
+
+	/* TODO: check overflow */
+	for (i=0; i<argc; i++) {
+	    th->cfp->sp[i] = argv[i];
+	}
+	argc = th_yield_setup_args(iseq, argc, th->cfp->sp);
+	th->cfp->sp += argc;
+
+	th_set_env(th, iseq,
 		   FRAME_MAGIC_PROC, self, (VALUE)proc->block.dfp,
-		   proc->block.iseq->iseq_encoded, th->cfp->sp,
-		   proc->block.lfp, proc->block.iseq->local_size, argc, argv);
+		   iseq->iseq_encoded, th->cfp->sp, proc->block.lfp,
+		   iseq->local_size - argc, 0, 0);
+	return th_eval_body(th);
     }
-    return th_eval_body(th);
 }
 
 VALUE


-- 
ML: yarv-diff quickml.atdot.net
Info: http://www.atdot.net/~ko1/quickml

[前][次][番号順一覧][スレッド一覧][生データ]