summaryrefslogtreecommitdiffhomepage
path: root/src/error.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2014-06-27 22:39:39 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2014-06-27 22:39:39 +0900
commit919af61766b1d06cd0e747c1d6257ada14c09eff (patch)
tree332087073a21f4bced2f20bc83a2f5d2257ca604 /src/error.c
parent4ce0a7653be6b52120a8b12c4cc5abf1bdb25572 (diff)
downloadmruby-919af61766b1d06cd0e747c1d6257ada14c09eff.tar.gz
mruby-919af61766b1d06cd0e747c1d6257ada14c09eff.zip
initialize nomem_err->mesg->c before exposing to Ruby world; close #2428
Diffstat (limited to 'src/error.c')
-rw-r--r--src/error.c40
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());