From ae8dc9b72204679e78d6993f5cef8c5189b8b8d8 Mon Sep 17 00:00:00 2001 From: mame Date: Sun, 20 Dec 2009 12:31:26 +0000 Subject: * vm_eval.c (rb_iterate): pass current block when the argument bl_proc is NULL. This behavior can be used to make enumerator faster [ruby-dev:39874] * enumerator.c (enumerator_each): pass current block directly instead of trampoline block (enumerator_each_i). * io.c (argf_each_line, argf_each_byte, argf_each_char): ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@26128 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 11 +++++++++++ enumerator.c | 8 +------- io.c | 6 +++--- vm_eval.c | 18 +++++++++++------- 4 files changed, 26 insertions(+), 17 deletions(-) diff --git a/ChangeLog b/ChangeLog index efb5c4f22d..d10ab9bec4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +Sun Dec 20 21:26:05 2009 Yusuke Endoh + + * vm_eval.c (rb_iterate): pass current block when the argument bl_proc + is NULL. This behavior can be used to make enumerator faster + [ruby-dev:39874] + + * enumerator.c (enumerator_each): pass current block directly instead + of trampoline block (enumerator_each_i). + + * io.c (argf_each_line, argf_each_byte, argf_each_char): ditto. + Sat Dec 19 14:59:30 2009 Yukihiro Matsumoto * gem_prelude.rb (Kernel#gem): should make gem private. a patch diff --git a/enumerator.c b/enumerator.c index 7c50f3dda2..34d16c057e 100644 --- a/enumerator.c +++ b/enumerator.c @@ -329,12 +329,6 @@ enumerator_allocate(VALUE klass) return enum_obj; } -static VALUE -enumerator_each_i(VALUE v, VALUE enum_obj, int argc, VALUE *argv) -{ - return rb_yield_values2(argc, argv); -} - static VALUE enumerator_init(VALUE enum_obj, VALUE obj, VALUE meth, int argc, VALUE *argv) { @@ -473,7 +467,7 @@ static VALUE enumerator_each(VALUE obj) { if (!rb_block_given_p()) return obj; - return enumerator_block_call(obj, enumerator_each_i, obj); + return enumerator_block_call(obj, 0, obj); } static VALUE diff --git a/io.c b/io.c index 643455eca5..3b8bd2566f 100644 --- a/io.c +++ b/io.c @@ -9148,7 +9148,7 @@ argf_each_line(int argc, VALUE *argv, VALUE argf) RETURN_ENUMERATOR(argf, argc, argv); for (;;) { if (!next_argv()) return argf; - rb_block_call(ARGF.current_file, rb_intern("each_line"), argc, argv, rb_yield, 0); + rb_block_call(ARGF.current_file, rb_intern("each_line"), argc, argv, 0, 0); ARGF.next_p = 1; } } @@ -9182,7 +9182,7 @@ argf_each_byte(VALUE argf) RETURN_ENUMERATOR(argf, 0, 0); for (;;) { if (!next_argv()) return argf; - rb_block_call(ARGF.current_file, rb_intern("each_byte"), 0, 0, rb_yield, 0); + rb_block_call(ARGF.current_file, rb_intern("each_byte"), 0, 0, 0, 0); ARGF.next_p = 1; } } @@ -9212,7 +9212,7 @@ argf_each_char(VALUE argf) RETURN_ENUMERATOR(argf, 0, 0); for (;;) { if (!next_argv()) return argf; - rb_block_call(ARGF.current_file, rb_intern("each_char"), 0, 0, rb_yield, 0); + rb_block_call(ARGF.current_file, rb_intern("each_char"), 0, 0, 0, 0); ARGF.next_p = 1; } } diff --git a/vm_eval.c b/vm_eval.c index 4721de7c7d..f64aa4afe1 100644 --- a/vm_eval.c +++ b/vm_eval.c @@ -820,20 +820,24 @@ rb_iterate(VALUE (* it_proc) (VALUE), VALUE data1, { int state; volatile VALUE retval = Qnil; - NODE *node = NEW_IFUNC(bl_proc, data2); rb_thread_t *th = GET_THREAD(); rb_control_frame_t *volatile cfp = th->cfp; + rb_block_t *blockptr; + if (bl_proc) { + blockptr = RUBY_VM_GET_BLOCK_PTR_IN_CFP(th->cfp); + blockptr->iseq = (void *)NEW_IFUNC(bl_proc, data2); + blockptr->proc = 0; + } + else { + blockptr = GC_GUARDED_PTR_REF(th->cfp->lfp[0]); + } + *(rb_block_t *volatile *)&blockptr = blockptr; TH_PUSH_TAG(th); state = TH_EXEC_TAG(); if (state == 0) { iter_retry: - { - rb_block_t *blockptr = RUBY_VM_GET_BLOCK_PTR_IN_CFP(th->cfp); - blockptr->iseq = (void *)node; - blockptr->proc = 0; - th->passed_block = blockptr; - } + th->passed_block = *(rb_block_t *volatile *)&blockptr; retval = (*it_proc) (data1); } else { -- cgit v1.2.3