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