Commit 77aa261f authored by Yukihiro Matsumoto's avatar Yukihiro Matsumoto

mrb_singleton_class should raise TypeError for immediate objects

parent f121558f
...@@ -807,11 +807,16 @@ mrb_singleton_class(mrb_state *mrb, mrb_value v) ...@@ -807,11 +807,16 @@ mrb_singleton_class(mrb_state *mrb, mrb_value v)
switch (mrb_type(v)) { switch (mrb_type(v)) {
case MRB_TT_FALSE: 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: case MRB_TT_TRUE:
return mrb_obj_value(mrb->true_class);
case MRB_TT_SYMBOL: case MRB_TT_SYMBOL:
case MRB_TT_FIXNUM: case MRB_TT_FIXNUM:
case MRB_TT_FLOAT: case MRB_TT_FLOAT:
return mrb_nil_value(); /* should raise TypeError */ mrb_raise(mrb, E_TYPE_ERROR, "can't define singleton");
return mrb_nil_value(); /* not reached */
default: default:
break; break;
} }
......
...@@ -550,12 +550,22 @@ mrb_obj_instance_eval(mrb_state *mrb, mrb_value self) ...@@ -550,12 +550,22 @@ mrb_obj_instance_eval(mrb_state *mrb, mrb_value self)
{ {
mrb_value a, b; mrb_value a, b;
mrb_value cv; mrb_value cv;
struct RClass *c;
if (mrb_get_args(mrb, "|S&", &a, &b) == 1) { if (mrb_get_args(mrb, "|S&", &a, &b) == 1) {
mrb_raise(mrb, E_NOTIMP_ERROR, "instance_eval with string not implemented"); mrb_raise(mrb, E_NOTIMP_ERROR, "instance_eval with string not implemented");
} }
cv = mrb_singleton_class(mrb, self); switch (mrb_type(self)) {
return mrb_yield_internal(mrb, b, 0, 0, self, mrb_class_ptr(cv)); case MRB_TT_SYMBOL:
case MRB_TT_FIXNUM:
case MRB_TT_FLOAT:
c = 0;
break;
default:
cv = mrb_singleton_class(mrb, self);
c = mrb_class_ptr(cv);
}
return mrb_yield_internal(mrb, b, 0, 0, self, c);
} }
int int
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment