From 69c8fd073faf694a3443d14bca0b3a7eebd2dc26 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: http://svn.ruby-lang.org/repos/ruby/trunk@26128 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- vm_eval.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) (limited to 'vm_eval.c') diff --git a/vm_eval.c b/vm_eval.c index 4721de7c7..f64aa4afe 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