ruby-changes:7209
From: nobu <ko1@a...>
Date: Wed, 20 Aug 2008 22:28:39 +0900 (JST)
Subject: [ruby-changes:7209] Ruby:r18728 (trunk): * proc.c (proc_new): use the given class.
nobu 2008-08-20 22:28:18 +0900 (Wed, 20 Aug 2008) New Revision: 18728 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=18728 Log: * proc.c (proc_new): use the given class. * vm.c (vm_make_proc): added an argument for the class. Modified files: trunk/ChangeLog trunk/proc.c trunk/vm.c trunk/vm_core.h trunk/vm_insnhelper.c Index: ChangeLog =================================================================== --- ChangeLog (revision 18727) +++ ChangeLog (revision 18728) @@ -1,3 +1,9 @@ +Wed Aug 20 22:28:15 2008 Nobuyoshi Nakada <nobu@r...> + + * 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 <nobu@r...> * enum.c (enum_take): get rid of extraneous iteration. Index: vm_core.h =================================================================== --- vm_core.h (revision 18727) +++ vm_core.h (revision 18728) @@ -668,7 +668,7 @@ 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 *)); Index: proc.c =================================================================== --- proc.c (revision 18727) +++ proc.c (revision 18728) @@ -379,11 +379,12 @@ } } - 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; Index: vm.c =================================================================== --- vm.c (revision 18727) +++ vm.c (revision 18728) @@ -373,25 +373,27 @@ 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 @@ 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 @@ 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 @@ 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; Index: vm_insnhelper.c =================================================================== --- vm_insnhelper.c (revision 18727) +++ vm_insnhelper.c (revision 18728) @@ -188,7 +188,7 @@ 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 @@ } if (blockptr) { - blockarg = vm_make_proc(th, th->cfp, blockptr); + blockarg = vm_make_proc(th, th->cfp, blockptr, rb_cProc); } else { blockarg = Qnil; -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/