summaryrefslogtreecommitdiffhomepage
path: root/src/class.c
diff options
context:
space:
mode:
authormirichi <[email protected]>2013-06-14 20:01:03 +0900
committermirichi <[email protected]>2013-06-14 20:01:03 +0900
commita5f63e486473595d67601851f00b6bb96b377a8d (patch)
tree8550bf598238104c6490d15ad2db20d4c103ea75 /src/class.c
parent4b2bdbe2cc0e3b1b0f6916bdc308933f17f74537 (diff)
parentdbc93621c94b9b2d2b437cde40d8efec7337a64d (diff)
downloadmruby-a5f63e486473595d67601851f00b6bb96b377a8d.tar.gz
mruby-a5f63e486473595d67601851f00b6bb96b377a8d.zip
Merge remote-tracking branch 'upstream/master'
Diffstat (limited to 'src/class.c')
-rw-r--r--src/class.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/src/class.c b/src/class.c
index 4264129b6..f94f9a933 100644
--- a/src/class.c
+++ b/src/class.c
@@ -1047,6 +1047,9 @@ mrb_instance_new(mrb_state *mrb, mrb_value cv)
mrb_value *argv;
int argc;
+ if (c->tt == MRB_TT_SCLASS)
+ mrb_raise(mrb, E_TYPE_ERROR, "can't create instance of singleton class");
+
if (ttype == 0) ttype = MRB_TT_OBJECT;
o = (struct RObject*)mrb_obj_alloc(mrb, ttype, c);
obj = mrb_obj_value(o);
@@ -1414,14 +1417,17 @@ mrb_mod_alias(mrb_state *mrb, mrb_value mod)
return mrb_nil_value();
}
-
static void
undef_method(mrb_state *mrb, struct RClass *c, mrb_sym a)
{
mrb_value m;
- MRB_SET_VALUE(m, MRB_TT_PROC, value.p, 0);
- mrb_define_method_vm(mrb, c, a, 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);
+ }
}
void
@@ -1873,7 +1879,6 @@ mrb_init_class(mrb_state *mrb)
mrb_name_class(mrb, mod, mrb_intern(mrb, "Module"));
mrb_name_class(mrb, cls, mrb_intern(mrb, "Class"));
- mrb_undef_method(mrb, mod, "new");
MRB_SET_INSTANCE_TT(cls, MRB_TT_CLASS);
mrb_define_method(mrb, bob, "initialize", mrb_bob_init, MRB_ARGS_NONE());
mrb_define_method(mrb, bob, "!", mrb_bob_not, MRB_ARGS_NONE());