diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-08-28 14:14:11 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-08-28 14:14:11 +0000 |
commit | 88ba175ab0c87882e446a5290ddc84880310d6d3 (patch) | |
tree | 09692f360f32ef7d36ba22a4008a9455829343d7 /error.c | |
parent | 55bf54a9c062b30492b328345ab3c68449e3f676 (diff) | |
download | ruby-88ba175ab0c87882e446a5290ddc84880310d6d3.tar.gz |
* bignum.c (rb_big_and): protect parameters from GC.
[ruby-talk:110664]
* error.c (exc_equal): exceptions are equal if they share same
class, message and backtrace. [ruby-talk:110354]
* error.c (name_err_mesg_equal): ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@6826 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'error.c')
-rw-r--r-- | error.c | 52 |
1 files changed, 51 insertions, 1 deletions
@@ -535,6 +535,32 @@ exc_set_backtrace(exc, bt) } /* + * call-seq: + * exc == obj => true or false + * + * Equality---If <i>obj</i> is not an <code>Exception</code>, returns + * <code>false</code>. Otherwise, returns <code>true</code> if <i>exc</i> and + * <i>obj</i> share same class, messages, and backtrace. + */ + +static VALUE +exc_equal(exc, obj) + VALUE exc; + VALUE obj; +{ + ID id_mesg = rb_intern("mesg"); + + if (exc == obj) return Qtrue; + if (rb_obj_class(exc) != rb_obj_class(obj)) + return Qfalse; + if (!rb_equal(rb_attr_get(exc, id_mesg), rb_attr_get(obj, id_mesg))) + return Qfalse; + if (!rb_equal(exc_backtrace(exc), exc_backtrace(obj))) + return Qfalse; + return Qtrue; +} + +/* * call-seq: * SystemExit.new(status=0) => system_exit * @@ -662,7 +688,8 @@ static VALUE name_err_to_s(exc) VALUE exc; { - VALUE mesg = rb_attr_get(exc, rb_intern("mesg")), str = mesg; + VALUE mesg = rb_attr_get(exc, rb_intern("mesg")); + VALUE str = mesg; if (NIL_P(mesg)) return rb_class_name(CLASS_OF(exc)); StringValue(str); @@ -718,6 +745,27 @@ name_err_mesg_new(obj, mesg, recv, method) /* :nodoc: */ static VALUE +name_err_mesg_equal(obj1, obj2) + VALUE obj1, obj2; +{ + VALUE *ptr1, *ptr2; + int i; + + if (obj1 == obj2) return Qtrue; + if (rb_obj_class(obj2) != rb_cNameErrorMesg) + return Qfalse; + + Data_Get_Struct(obj1, VALUE, ptr1); + Data_Get_Struct(obj2, VALUE, ptr2); + for (i=0; i<3; i++) { + if (!rb_equal(ptr1[i], ptr2[i])) + return Qfalse; + } + return Qtrue; +} + +/* :nodoc: */ +static VALUE name_err_mesg_to_str(obj) VALUE obj; { @@ -984,6 +1032,7 @@ Init_Exception() rb_define_singleton_method(rb_eException, "exception", rb_class_new_instance, -1); rb_define_method(rb_eException, "exception", exc_exception, -1); rb_define_method(rb_eException, "initialize", exc_initialize, -1); + rb_define_method(rb_eException, "==", exc_equal, 1); rb_define_method(rb_eException, "to_s", exc_to_s, 0); rb_define_method(rb_eException, "message", exc_message, 0); rb_define_method(rb_eException, "inspect", exc_inspect, 0); @@ -1010,6 +1059,7 @@ Init_Exception() rb_define_method(rb_eNameError, "to_s", name_err_to_s, 0); rb_cNameErrorMesg = rb_define_class_under(rb_eNameError, "message", rb_cData); rb_define_singleton_method(rb_cNameErrorMesg, "!", name_err_mesg_new, 3); + rb_define_method(rb_cNameErrorMesg, "==", name_err_mesg_equal, 1); rb_define_method(rb_cNameErrorMesg, "to_str", name_err_mesg_to_str, 0); rb_define_method(rb_cNameErrorMesg, "_dump", name_err_mesg_to_str, 1); rb_define_singleton_method(rb_cNameErrorMesg, "_load", name_err_mesg_load, 1); |