diff options
author | shugo <shugo@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-12-08 02:37:16 +0000 |
---|---|---|
committer | shugo <shugo@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-12-08 02:37:16 +0000 |
commit | db051011d68950cd1261f91e724513282d419d9e (patch) | |
tree | d27e726831d1555253d08477275055f7b5de0cf0 /vm_eval.c | |
parent | 3adc9834d18ee6ff67dfca060eee170025ce3fef (diff) | |
download | ruby-db051011d68950cd1261f91e724513282d419d9e.tar.gz |
* eval.c (rb_mod_refine), vm_eval.c (rb_yield_refine_block):
Module#refine activates all refinements defined in that module
only in a given block.
* string.c (sym_to_proc, sym_call): don't use refinements.
* test/ruby/test_refinement.rb: related test.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@38269 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'vm_eval.c')
-rw-r--r-- | vm_eval.c | 43 |
1 files changed, 19 insertions, 24 deletions
@@ -784,30 +784,6 @@ rb_funcall_passing_block(VALUE recv, ID mid, int argc, const VALUE *argv) return rb_call(recv, mid, argc, argv, CALL_PUBLIC); } -VALUE -rb_funcall_passing_block_with_refinements(VALUE recv, ID mid, int argc, - const VALUE *argv, - VALUE refinements) -{ - VALUE defined_class; - rb_method_entry_t *me = - rb_search_method_entry(recv, mid, &defined_class); - rb_thread_t *th; - int call_status; - - if (me && me->def->type == VM_METHOD_TYPE_REFINED) { - me = rb_resolve_refined_method(refinements, me, &defined_class); - } - PASS_PASSED_BLOCK_TH(GET_THREAD()); - th = GET_THREAD(); - call_status = rb_method_call_status(th, me, CALL_PUBLIC, th->cfp->self); - if (call_status != NOEX_OK) { - return method_missing(recv, mid, argc, argv, call_status); - } - stack_check(); - return vm_call0(th, recv, mid, argc, argv, me, defined_class); -} - static VALUE send_internal(int argc, const VALUE *argv, VALUE recv, call_type scope) { @@ -1462,6 +1438,25 @@ yield_under(VALUE under, VALUE self, VALUE values) } } +VALUE +rb_yield_refine_block(VALUE refinement, VALUE refinements) +{ + rb_thread_t *th = GET_THREAD(); + rb_block_t block, *blockptr; + NODE *cref; + + if ((blockptr = VM_CF_BLOCK_PTR(th->cfp)) != 0) { + block = *blockptr; + block.self = refinement; + VM_CF_LEP(th->cfp)[0] = VM_ENVVAL_BLOCK_PTR(&block); + } + cref = vm_cref_push(th, refinement, NOEX_PUBLIC, blockptr); + cref->flags |= NODE_FL_CREF_PUSHED_BY_EVAL; + cref->nd_refinements = refinements; + + return vm_yield_with_cref(th, 0, NULL, cref); +} + /* string eval under the class/module context */ static VALUE eval_under(VALUE under, VALUE self, VALUE src, const char *file, int line) |