diff options
| author | Yukihiro Matsumoto <[email protected]> | 2012-08-03 19:56:14 +0900 |
|---|---|---|
| committer | Yukihiro Matsumoto <[email protected]> | 2012-08-03 19:56:14 +0900 |
| commit | 77aa261f3bcb9ab93e1ea9a9d89f8cba51b98873 (patch) | |
| tree | 5712441fc04b74c7cd9735b657db75b021cceede /src | |
| parent | f121558f9379c92a20051e3d87489d4c8125e9f9 (diff) | |
| download | mruby-77aa261f3bcb9ab93e1ea9a9d89f8cba51b98873.tar.gz mruby-77aa261f3bcb9ab93e1ea9a9d89f8cba51b98873.zip | |
mrb_singleton_class should raise TypeError for immediate objects
Diffstat (limited to 'src')
| -rw-r--r-- | src/class.c | 7 | ||||
| -rw-r--r-- | src/kernel.c | 14 |
2 files changed, 18 insertions, 3 deletions
diff --git a/src/class.c b/src/class.c index 13c2d0469..29ec18e13 100644 --- a/src/class.c +++ b/src/class.c @@ -807,11 +807,16 @@ mrb_singleton_class(mrb_state *mrb, mrb_value v) 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_SYMBOL: case MRB_TT_FIXNUM: 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: break; } diff --git a/src/kernel.c b/src/kernel.c index 740960f80..6327f967d 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -550,12 +550,22 @@ mrb_obj_instance_eval(mrb_state *mrb, mrb_value self) { mrb_value a, b; mrb_value cv; + struct RClass *c; if (mrb_get_args(mrb, "|S&", &a, &b) == 1) { mrb_raise(mrb, E_NOTIMP_ERROR, "instance_eval with string not implemented"); } - cv = mrb_singleton_class(mrb, self); - return mrb_yield_internal(mrb, b, 0, 0, self, mrb_class_ptr(cv)); + switch (mrb_type(self)) { + 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 |
