Feature #5007 ยป proc_call_under.patch
proc.c | ||
---|---|---|
return vret;
|
||
}
|
||
VALUE rb_proc_call_under(VALUE procval, VALUE under, VALUE self, VALUE values);
|
||
static VALUE
|
||
proc_call_under(int argc, VALUE *argv, VALUE procval)
|
||
{
|
||
VALUE self, klass, values;
|
||
rb_scan_args(argc, argv, "1*", &self, &values);
|
||
if (SPECIAL_CONST_P(self)) {
|
||
klass = Qnil;
|
||
}
|
||
else {
|
||
klass = rb_singleton_class(self);
|
||
}
|
||
return rb_proc_call_under(procval, klass, self, values);
|
||
}
|
||
#if SIZEOF_LONG > SIZEOF_INT
|
||
static inline int
|
||
check_argc(long argc)
|
||
... | ... | |
rb_define_method(rb_cProc, "[]", proc_call, -1);
|
||
rb_define_method(rb_cProc, "===", proc_call, -1);
|
||
rb_define_method(rb_cProc, "yield", proc_call, -1);
|
||
rb_define_method(rb_cProc, "call_under", proc_call_under, -1);
|
||
#endif
|
||
rb_define_method(rb_cProc, "to_proc", proc_to_proc, 0);
|
||
rb_define_method(rb_cProc, "arity", proc_arity, 0);
|
vm_eval.c | ||
---|---|---|
}
|
||
}
|
||
static inline VALUE
|
||
invoke_block_from_c(rb_thread_t *th, const rb_block_t *block,
|
||
VALUE self, int argc, const VALUE *argv,
|
||
const rb_block_t *blockptr, const NODE *cref);
|
||
VALUE
|
||
rb_proc_call_under(VALUE procval, VALUE under, VALUE self, VALUE values)
|
||
{
|
||
rb_thread_t *th = GET_THREAD();
|
||
rb_block_t block;
|
||
NODE *cref;
|
||
rb_proc_t *proc;
|
||
GetProcPtr(procval, proc);
|
||
block = proc->block;
|
||
block.self = self;
|
||
cref = vm_cref_push(th, under, NOEX_PUBLIC, &proc->block);
|
||
cref->flags |= NODE_FL_CREF_PUSHED_BY_EVAL;
|
||
return invoke_block_from_c(th, &block, self,
|
||
RARRAY_LENINT(values), RARRAY_PTR(values),
|
||
GC_GUARDED_PTR_REF(th->cfp->lfp[0]), cref);
|
||
}
|
||
/* string eval under the class/module context */
|
||
static VALUE
|
||
eval_under(VALUE under, VALUE self, VALUE src, const char *file, int line)
|