summaryrefslogtreecommitdiff
path: root/vm.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-08-20 13:28:18 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-08-20 13:28:18 +0000
commit9286180079614b7f953a0c6832ad38c6d5a5af9f (patch)
treeb8d8894e8a76bb8d5c4c8350840ebe3294735597 /vm.c
parent51e0bcb72a332b121c524e926f0b08994fc963aa (diff)
* 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
Diffstat (limited to 'vm.c')
-rw-r--r--vm.c20
1 files changed, 11 insertions, 9 deletions
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;