summaryrefslogtreecommitdiff
path: root/vm_eval.c
diff options
context:
space:
mode:
authorshugo <shugo@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-12-08 02:37:16 +0000
committershugo <shugo@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-12-08 02:37:16 +0000
commitdb051011d68950cd1261f91e724513282d419d9e (patch)
treed27e726831d1555253d08477275055f7b5de0cf0 /vm_eval.c
parent3adc9834d18ee6ff67dfca060eee170025ce3fef (diff)
* 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.c43
1 files changed, 19 insertions, 24 deletions
diff --git a/vm_eval.c b/vm_eval.c
index 66ff25d36b..190d2bc559 100644
--- a/vm_eval.c
+++ b/vm_eval.c
@@ -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)