From 78029f00d5e330ea7bb594d1abef54e490effc2d Mon Sep 17 00:00:00 2001 From: ko1 Date: Tue, 5 Jun 2007 17:26:00 +0000 Subject: * parse.y (new_yield), compile.c (iseq_compile_each): fix passing parameter. * eval.c, eval_jump.h: simplify rb_yield*. * proc.c (proc_mark): fix to mark proc->block.proc. * proc.c (Init_Proc): add Proc#lambda? * test/ruby/test_lambda.rb: add some tests. * vm.c (invoke_block): fix to check lambda block or not. * vm.c (th_yield_setup_args): fix to check arguments size when lambda block. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12441 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- eval.c | 70 +++++++++++++++++++++++++++--------------------------------------- 1 file changed, 28 insertions(+), 42 deletions(-) (limited to 'eval.c') diff --git a/eval.c b/eval.c index 7452b9e566..38c8b84cdc 100644 --- a/eval.c +++ b/eval.c @@ -35,9 +35,9 @@ VALUE rb_eSysStackError; extern int ruby_nerrs; extern VALUE ruby_top_self; -static VALUE eval _((VALUE, VALUE, VALUE, char *, int)); +static VALUE eval(VALUE, VALUE, VALUE, char *, int); -static VALUE rb_yield_0 _((VALUE, VALUE, VALUE, int, int)); +static inline VALUE rb_yield_0(int argc, VALUE *argv); static VALUE rb_call(VALUE, VALUE, ID, int, const VALUE *, int); #include "eval_error.h" @@ -903,67 +903,53 @@ rb_need_block() } } -static VALUE -rb_yield_0(VALUE val, VALUE self, VALUE klass /* OK */ , int flags, - int avalue) +static inline VALUE +rb_yield_0(int argc, VALUE *argv) { - if (avalue) { - return th_yield(GET_THREAD(), RARRAY_LEN(val), RARRAY_PTR(val)); - } - else { - int argc = (val == Qundef) ? 0 : 1; - VALUE *argv = &val; - - /* TODO: - if (argc == 1 && CLASS_OF(argv[0]) == rb_cValues) { - argc = RARRAY_LEN(argv[0]); - argv = RARRAY_PTR(argv[0]); - } - */ - return th_yield(GET_THREAD(), argc, argv); - } + return th_yield(GET_THREAD(), argc, argv); } VALUE rb_yield(VALUE val) { - return rb_yield_0(val, 0, 0, 0, Qfalse); + volatile VALUE tmp = val; + tmp = rb_yield_0(1, &val); + return tmp; } VALUE rb_yield_values(int n, ...) { int i; + VALUE *argv; va_list args; - VALUE val; if (n == 0) { - return rb_yield_0(Qundef, 0, 0, 0, Qfalse); + return rb_yield_0(0, 0); } - val = rb_ary_new2(n); - va_start(args, n); + + argv = ALLOCA_N(VALUE, n); + + va_init_list(args, n); for (i=0; i