diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2014-06-27 22:39:39 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2014-06-27 22:39:39 +0900 |
| commit | 919af61766b1d06cd0e747c1d6257ada14c09eff (patch) | |
| tree | 332087073a21f4bced2f20bc83a2f5d2257ca604 | |
| parent | 4ce0a7653be6b52120a8b12c4cc5abf1bdb25572 (diff) | |
| download | mruby-919af61766b1d06cd0e747c1d6257ada14c09eff.tar.gz mruby-919af61766b1d06cd0e747c1d6257ada14c09eff.zip | |
initialize nomem_err->mesg->c before exposing to Ruby world; close #2428
| -rw-r--r-- | src/error.c | 40 |
1 files changed, 8 insertions, 32 deletions
diff --git a/src/error.c b/src/error.c index 2eebdd033..dcb6063f8 100644 --- a/src/error.c +++ b/src/error.c @@ -91,8 +91,15 @@ static mrb_value exc_to_s(mrb_state *mrb, mrb_value exc) { mrb_value mesg = mrb_attr_get(mrb, exc, mrb_intern_lit(mrb, "mesg")); + struct RObject *p; - if (mrb_nil_p(mesg)) return mrb_str_new_cstr(mrb, mrb_obj_classname(mrb, exc)); + if (!mrb_string_p(mesg)) { + return mrb_str_new_cstr(mrb, mrb_obj_classname(mrb, exc)); + } + p = mrb_obj_ptr(mesg); + if (!p->c) { + p->c = mrb->string_class; + } return mesg; } @@ -167,36 +174,6 @@ exc_inspect(mrb_state *mrb, mrb_value exc) } -static mrb_value -exc_equal(mrb_state *mrb, mrb_value exc) -{ - mrb_value obj; - mrb_value mesg; - mrb_bool equal_p; - mrb_sym id_mesg = mrb_intern_lit(mrb, "mesg"); - - mrb_get_args(mrb, "o", &obj); - if (mrb_obj_equal(mrb, exc, obj)) { - equal_p = TRUE; - } - else { - if (mrb_obj_class(mrb, exc) != mrb_obj_class(mrb, obj)) { - if (mrb_respond_to(mrb, obj, mrb_intern_lit(mrb, "message"))) { - mesg = mrb_funcall(mrb, obj, "message", 0); - } - else - return mrb_false_value(); - } - else { - mesg = mrb_attr_get(mrb, obj, id_mesg); - } - - equal_p = mrb_equal(mrb, mrb_attr_get(mrb, exc, id_mesg), mesg); - } - - return mrb_bool_value(equal_p); -} - static void exc_debug_info(mrb_state *mrb, struct RObject *exc) { @@ -468,7 +445,6 @@ mrb_init_exception(mrb_state *mrb) mrb_define_class_method(mrb, exception, "exception", mrb_instance_new, MRB_ARGS_ANY()); mrb_define_method(mrb, exception, "exception", exc_exception, MRB_ARGS_ANY()); mrb_define_method(mrb, exception, "initialize", exc_initialize, MRB_ARGS_ANY()); - mrb_define_method(mrb, exception, "==", exc_equal, MRB_ARGS_REQ(1)); mrb_define_method(mrb, exception, "to_s", exc_to_s, MRB_ARGS_NONE()); mrb_define_method(mrb, exception, "message", exc_message, MRB_ARGS_NONE()); mrb_define_method(mrb, exception, "inspect", exc_inspect, MRB_ARGS_NONE()); |
