mrb_value mrb_singleton_class(mrb_state *mrb, mrb_value v) { struct RBasic *obj; switch (mrb_type(v)) { case MRB_TT_FALSE: if (mrb_nil_p(v)) return mrb_obj_value(mrb->nil_class); return mrb_obj_value(mrb->false_class); case MRB_TT_TRUE: return mrb_obj_value(mrb->true_class); case MRB_TT_MAIN: return mrb_obj_value(mrb->object_class); case MRB_TT_SYMBOL: case MRB_TT_FIXNUM: case MRB_TT_FLOAT: mrb_raise(mrb, E_TYPE_ERROR, "can't define singleton"); return mrb_nil_value(); /* not reached */ default: break; } obj = mrb_object(v); obj->c = mrb_singleton_class_ptr(mrb, obj->c); return mrb_obj_value(obj->c); }
mrb_value mrb_singleton_class(mrb_state *mrb, mrb_value v) { struct RBasic *obj; switch (mrb_type(v)) { case MRB_TT_FALSE: case MRB_TT_TRUE: case MRB_TT_SYMBOL: case MRB_TT_FIXNUM: case MRB_TT_FLOAT: return mrb_nil_value(); /* should raise TypeError */ default: break; } obj = (struct RBasic*)mrb_object(v); obj->c = mrb_singleton_class_ptr(mrb, obj->c); return mrb_obj_value(obj->c); }
void mrb_define_singleton_method(mrb_state *mrb, struct RObject *o, const char *name, mrb_func_t func, int aspec) { mrb_define_method_id(mrb, mrb_singleton_class_ptr(mrb, o->c), mrb_intern(mrb, name), func, aspec); }