From 9286180079614b7f953a0c6832ad38c6d5a5af9f Mon Sep 17 00:00:00 2001 From: nobu Date: Wed, 20 Aug 2008 13:28:18 +0000 Subject: * proc.c (proc_new): use the given class. * vm.c (vm_make_proc): added an argument for the class. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@18728 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 6 ++++++ proc.c | 7 ++++--- vm.c | 20 +++++++++++--------- vm_core.h | 2 +- vm_insnhelper.c | 4 ++-- 5 files changed, 24 insertions(+), 15 deletions(-) diff --git a/ChangeLog b/ChangeLog index 00c36c8ca8..b0cd4a7b46 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +Wed Aug 20 22:28:15 2008 Nobuyoshi Nakada + + * proc.c (proc_new): use the given class. + + * vm.c (vm_make_proc): added an argument for the class. + Wed Aug 20 22:24:48 2008 Nobuyoshi Nakada * enum.c (enum_take): get rid of extraneous iteration. diff --git a/proc.c b/proc.c index 3bcb6cfbc8..710ab065d1 100644 --- a/proc.c +++ b/proc.c @@ -379,11 +379,12 @@ proc_new(VALUE klass, int is_lambda) } } - if (block->proc) { - return block->proc; + procval = block->proc; + if (procval && RBASIC(procval)->klass == klass) { + return procval; } - procval = vm_make_proc(th, cfp, block); + procval = vm_make_proc(th, cfp, block, klass); if (is_lambda) { rb_proc_t *proc; diff --git a/vm.c b/vm.c index 0272df2df2..730d89c6b8 100644 --- a/vm.c +++ b/vm.c @@ -373,25 +373,27 @@ vm_stack_to_heap(rb_thread_t * const th) static VALUE vm_make_proc_from_block(rb_thread_t *th, rb_control_frame_t *cfp, - rb_block_t *block) + rb_block_t *block, VALUE klass) { VALUE procval; rb_control_frame_t *bcfp; VALUE *bdfp; /* to gc mark */ - if (block->proc) { - return block->proc; + procval = block->proc; + if (procval && RBASIC(procval)->klass == klass) { + return procval; } bcfp = RUBY_VM_GET_CFP_FROM_BLOCK_PTR(block); bdfp = bcfp->dfp; - block->proc = procval = vm_make_proc(th, bcfp, block); + procval = vm_make_proc(th, bcfp, block, klass); + if (!block->proc) block->proc = procval; return procval; } VALUE -vm_make_proc(rb_thread_t *th, - rb_control_frame_t *cfp, const rb_block_t *block) +vm_make_proc(rb_thread_t *th, rb_control_frame_t *cfp, + const rb_block_t *block, VALUE klass) { VALUE procval, envval, blockprocval = 0; rb_proc_t *proc; @@ -401,7 +403,7 @@ vm_make_proc(rb_thread_t *th, rb_proc_t *p; blockprocval = vm_make_proc_from_block( - th, cfp, (rb_block_t *)GC_GUARDED_PTR_REF(*cfp->lfp)); + th, cfp, (rb_block_t *)GC_GUARDED_PTR_REF(*cfp->lfp), klass); GetProcPtr(blockprocval, p); *cfp->lfp = GC_GUARDED_PTR(&p->block); @@ -412,7 +414,7 @@ vm_make_proc(rb_thread_t *th, if (PROCDEBUG) { check_env_value(envval); } - procval = rb_proc_alloc(rb_cProc); + procval = rb_proc_alloc(klass); GetProcPtr(procval, proc); proc->blockprocval = blockprocval; proc->block.self = block->self; @@ -1743,7 +1745,7 @@ m_core_set_postexe(VALUE self, VALUE iseqval) blockptr->iseq = blockiseq; blockptr->proc = 0; - proc = vm_make_proc(th, cfp, blockptr); + proc = vm_make_proc(th, cfp, blockptr, rb_cProc); rb_set_end_proc(rb_call_end_proc, proc); }); return Qnil; diff --git a/vm_core.h b/vm_core.h index 2e8462422b..fc33302de6 100644 --- a/vm_core.h +++ b/vm_core.h @@ -668,7 +668,7 @@ int rb_thread_method_id_and_class(rb_thread_t *th, ID *idp, VALUE *klassp); VALUE vm_invoke_proc(rb_thread_t *th, rb_proc_t *proc, VALUE self, int argc, const VALUE *argv, rb_block_t *blockptr); -VALUE vm_make_proc(rb_thread_t *th, rb_control_frame_t *cfp, const rb_block_t *block); +VALUE vm_make_proc(rb_thread_t *th, rb_control_frame_t *cfp, const rb_block_t *block, VALUE klass); VALUE vm_make_env_object(rb_thread_t *th, rb_control_frame_t *cfp); NOINLINE(void rb_gc_save_machine_context(rb_thread_t *)); diff --git a/vm_insnhelper.c b/vm_insnhelper.c index a5967f736c..07fe32d2a2 100644 --- a/vm_insnhelper.c +++ b/vm_insnhelper.c @@ -188,7 +188,7 @@ vm_callee_setup_arg_complex(rb_thread_t *th, const rb_iseq_t * iseq, if (blockptr->proc == 0) { rb_proc_t *proc; - blockval = vm_make_proc(th, th->cfp, blockptr); + blockval = vm_make_proc(th, th->cfp, blockptr, rb_cProc); GetProcPtr(blockval, proc); *block = &proc->block; @@ -662,7 +662,7 @@ vm_yield_with_cfunc(rb_thread_t *th, const rb_block_t *block, } if (blockptr) { - blockarg = vm_make_proc(th, th->cfp, blockptr); + blockarg = vm_make_proc(th, th->cfp, blockptr, rb_cProc); } else { blockarg = Qnil; -- cgit v1.2.3