diff options
author | yugui <yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-12-25 09:56:55 +0000 |
---|---|---|
committer | yugui <yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-12-25 09:56:55 +0000 |
commit | dcc293e053ee845446396b85950fd95cf62bbcb3 (patch) | |
tree | 7f26b6fc5b8798184b0828c44fbb880200a9fe1c /vm.c | |
parent | eaf7ad9d5a5e210bde9ec7643ef0b54da64ee3a1 (diff) |
merges r20980 from trunk into ruby_1_9_1.
* proc.c (proc_new): should use proc_dup() if block has Proc.
* vm.c (vm_make_proc_from_block): should use rb_cProc for block.
* vm.c (vm_make_proc): add an assertion.
* bootstraptest/test_proc.rb: add a test.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_9_1@21033 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'vm.c')
-rw-r--r-- | vm.c | 24 |
1 files changed, 13 insertions, 11 deletions
@@ -385,20 +385,18 @@ vm_stack_to_heap(rb_thread_t * const th) /* Proc */ static VALUE -vm_make_proc_from_block(rb_thread_t *th, rb_block_t *block, VALUE klass) +vm_make_proc_from_block(rb_thread_t *th, rb_block_t *block) { - VALUE procval; + VALUE proc = block->proc; - procval = block->proc; - if (procval && RBASIC(procval)->klass == klass) { - return procval; + if (block->proc) { + return block->proc; } - procval = vm_make_proc(th, block, klass); - if (!block->proc) { - block->proc = procval; - } - return procval; + proc = vm_make_proc(th, block, rb_cProc); + block->proc = proc; + + return proc; } VALUE @@ -408,12 +406,16 @@ vm_make_proc(rb_thread_t *th, const rb_block_t *block, VALUE klass) rb_proc_t *proc; rb_control_frame_t *cfp = RUBY_VM_GET_CFP_FROM_BLOCK_PTR(block); + if (block->proc) { + rb_bug("vm_make_proc: Proc value is already created."); + } + if (GC_GUARDED_PTR_REF(cfp->lfp[0])) { if (!RUBY_VM_CLASS_SPECIAL_P(cfp->lfp[0])) { rb_proc_t *p; blockprocval = vm_make_proc_from_block( - th, (rb_block_t *)GC_GUARDED_PTR_REF(*cfp->lfp), klass); + th, (rb_block_t *)GC_GUARDED_PTR_REF(*cfp->lfp)); GetProcPtr(blockprocval, p); *cfp->lfp = GC_GUARDED_PTR(&p->block); |