static mrb_value mrb_mod_method_defined(mrb_state *mrb, mrb_value mod) { mrb_sym id; mrb_bool method_defined_p; mrb_get_args(mrb, "n", &id); method_defined_p = mrb_obj_respond_to(mrb_class_ptr(mod), id); return mrb_bool_value(method_defined_p); }
static mrb_value mrb_mod_method_defined(mrb_state *mrb, mrb_value mod) { mrb_value id; mrb_bool method_defined_p; id = get_sym_or_str_arg(mrb); if (mrb_symbol_p(id)) { method_defined_p = mrb_obj_respond_to(mrb_class_ptr(mod), mrb_symbol(id)); } else { mrb_value sym = mrb_check_intern_str(mrb, id); if (mrb_nil_p(sym)) { method_defined_p = FALSE; } else { method_defined_p = mrb_obj_respond_to(mrb_class_ptr(mod), mrb_symbol(sym)); } } return mrb_bool_value(method_defined_p); }
static void undef_method(mrb_state *mrb, struct RClass *c, mrb_sym a) { mrb_value m; if (!mrb_obj_respond_to(c, a)) { mrb_name_error(mrb, a, "undefined method '%S' for class '%S'", mrb_sym2str(mrb, a), mrb_obj_value(c)); } else { MRB_SET_VALUE(m, MRB_TT_PROC, value.p, 0); mrb_define_method_vm(mrb, c, a, m); } }
static mrb_value read_userdef(MarshalContext *ctx) { mrb_state *mrb = ctx->mrb; mrb_value class_path = read_value(ctx); struct RClass *klass = mrb_class_from_path(mrb, class_path); /* Should check here if klass implements '_load()' */ if (!mrb_obj_respond_to(mrb, mrb_class(mrb, mrb_obj_value(klass)), mrb_intern_cstr(mrb, "_load"))) throw Exception(Exception::TypeError, "class %s needs to have method '_load'", RSTRING_PTR(class_path)); mrb_value data = read_string_value(ctx); mrb_value obj = mrb_funcall(mrb, mrb_obj_value(klass), "_load", 1, data); return obj; }
int mrb_respond_to(mrb_state *mrb, mrb_value obj, mrb_sym mid) { return mrb_obj_respond_to(mrb_class(mrb, obj), mid); }