summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorCarson McDonald <[email protected]>2013-06-08 10:43:34 -0400
committerCarson McDonald <[email protected]>2013-06-08 10:43:34 -0400
commitc75bfc93a3d8460a7355906ae080870aa152e32a (patch)
treedbe744576f14c7433ae14c97dea0c1464c3bca4c
parentab4ecac07b01c85342d477986d074279dad55021 (diff)
downloadmruby-c75bfc93a3d8460a7355906ae080870aa152e32a.tar.gz
mruby-c75bfc93a3d8460a7355906ae080870aa152e32a.zip
Raise a NameError when symbol isn't found.
-rw-r--r--src/class.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/src/class.c b/src/class.c
index 7e3402b79..eaf25916c 100644
--- a/src/class.c
+++ b/src/class.c
@@ -1414,14 +1414,20 @@ 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_value m, val;
- 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)) {
+ val = mrb_iv_remove(mrb, mrb_obj_value(c), a);
+ if (mrb_undef_p(val)) {
+ 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