static void vm_caller_setup_arg_block(const rb_thread_t *th, rb_control_frame_t *reg_cfp, struct rb_calling_info *calling, const struct rb_call_info *ci, rb_iseq_t *blockiseq, const int is_super) { if (ci->flag & VM_CALL_ARGS_BLOCKARG) { rb_proc_t *po; VALUE proc; proc = *(--reg_cfp->sp); if (NIL_P(proc)) { calling->blockptr = NULL; } else if (SYMBOL_P(proc) && rb_method_basic_definition_p(rb_cSymbol, idTo_proc)) { calling->blockptr = RUBY_VM_GET_BLOCK_PTR_IN_CFP(reg_cfp); calling->blockptr->iseq = (rb_iseq_t *)proc; calling->blockptr->proc = proc; } else if (RUBY_VM_IFUNC_P(proc)) { calling->blockptr = RUBY_VM_GET_BLOCK_PTR_IN_CFP(reg_cfp); calling->blockptr->iseq = (rb_iseq_t *)proc; calling->blockptr->proc = proc; } else { if (!rb_obj_is_proc(proc)) { VALUE b; b = rb_check_convert_type(proc, T_DATA, "Proc", "to_proc"); if (NIL_P(b) || !rb_obj_is_proc(b)) { rb_raise(rb_eTypeError, "wrong argument type %s (expected Proc)", rb_obj_classname(proc)); } proc = b; } GetProcPtr(proc, po); calling->blockptr = &po->block; RUBY_VM_GET_BLOCK_PTR_IN_CFP(reg_cfp)->proc = proc; } } else if (blockiseq != 0) { /* likely */ rb_block_t *blockptr = calling->blockptr = RUBY_VM_GET_BLOCK_PTR_IN_CFP(reg_cfp); blockptr->iseq = blockiseq; blockptr->proc = 0; } else { if (is_super) { calling->blockptr = GET_BLOCK_PTR(); } else { calling->blockptr = NULL; } } }
int rb_obj_respond_to(VALUE obj, ID id, int priv) { VALUE klass = CLASS_OF(obj); if (rb_method_basic_definition_p(klass, idRespond_to)) { return basic_obj_respond_to(obj, id, !RTEST(priv)); } else { return RTEST(rb_funcall(obj, idRespond_to, priv ? 2 : 1, ID2SYM(id), Qtrue)); } }
static void set_backtrace(VALUE info, VALUE bt) { ID set_backtrace = rb_intern("set_backtrace"); if (rb_backtrace_p(bt)) { if (rb_method_basic_definition_p(CLASS_OF(info), set_backtrace)) { rb_exc_set_backtrace(info, bt); return; } else { bt = rb_backtrace_to_str_ary(bt); } } rb_check_funcall(info, set_backtrace, 1, &bt); }
int rb_obj_respond_to(VALUE obj, ID id, int priv) { VALUE klass = CLASS_OF(obj); if (rb_method_basic_definition_p(klass, idRespond_to)) { return rb_method_boundp(klass, id, !priv); } else { VALUE args[2]; int n = 0; args[n++] = ID2SYM(id); if (priv) args[n++] = Qtrue; return RTEST(rb_funcall2(obj, idRespond_to, n, args)); } }
static VALUE obj_respond_to(int argc, VALUE *argv, VALUE obj) { VALUE mid, priv; ID id; rb_scan_args(argc, argv, "11", &mid, &priv); if (!(id = rb_check_id(&mid))) { if (!rb_method_basic_definition_p(CLASS_OF(obj), idRespond_to_missing)) { VALUE args[2]; args[0] = rb_to_symbol(mid); args[1] = priv; return rb_funcall2(obj, idRespond_to_missing, 2, args); } return Qfalse; } if (basic_obj_respond_to(obj, id, !RTEST(priv))) return Qtrue; return Qfalse; }
int rb_obj_respond_to(VALUE obj, ID id, int priv) { VALUE klass = CLASS_OF(obj); if (rb_method_basic_definition_p(klass, idRespond_to)) { return basic_obj_respond_to(obj, id, !priv); } else { int argc = 1; VALUE args[2]; args[0] = ID2SYM(id); args[1] = Qtrue; if (priv) { if (rb_obj_method_arity(obj, idRespond_to) != 1) { argc = 2; } else if (!NIL_P(ruby_verbose)) { VALUE klass = CLASS_OF(obj); VALUE location = rb_mod_method_location(klass, idRespond_to); rb_warn("%"PRIsVALUE"%c""respond_to?(:%"PRIsVALUE") is" " old fashion which takes only one parameter", (FL_TEST(klass, FL_SINGLETON) ? obj : klass), (FL_TEST(klass, FL_SINGLETON) ? '.' : '#'), QUOTE_ID(id)); if (!NIL_P(location)) { VALUE path = RARRAY_AREF(location, 0); VALUE line = RARRAY_AREF(location, 1); if (!NIL_P(path)) { rb_compile_warn(RSTRING_PTR(path), NUM2INT(line), "respond_to? is defined here"); } } } } return RTEST(rb_funcall2(obj, idRespond_to, argc, args)); } }
static inline int basic_to_f_p(VALUE klass) { return rb_method_basic_definition_p(klass, id_to_f); }