[macruby-changes] [5069] MacRuby/trunk/error.c
source_changes at macosforge.org
source_changes at macosforge.org
Tue Dec 21 20:49:28 PST 2010
Revision: 5069
http://trac.macosforge.org/projects/ruby/changeset/5069
Author: lsansonetti at apple.com
Date: 2010-12-21 20:49:24 -0800 (Tue, 21 Dec 2010)
Log Message:
-----------
fix a bug in Exception#== when an infinite loop would be entered when comparing exceptions from different classes
Modified Paths:
--------------
MacRuby/trunk/error.c
Modified: MacRuby/trunk/error.c
===================================================================
--- MacRuby/trunk/error.c 2010-12-22 04:32:13 UTC (rev 5068)
+++ MacRuby/trunk/error.c 2010-12-22 04:49:24 UTC (rev 5069)
@@ -575,15 +575,31 @@
static VALUE
exc_equal(VALUE exc, SEL sel, VALUE obj)
{
+ VALUE mesg, backtrace;
+ if (exc == obj) {
+ return Qtrue;
+ }
ID id_mesg = rb_intern("mesg");
-
- if (exc == obj) return Qtrue;
- if (rb_obj_class(exc) != rb_obj_class(obj))
- return rb_equal(obj, exc);
- if (!rb_equal(rb_attr_get(exc, id_mesg), rb_attr_get(obj, id_mesg)))
- return Qfalse;
- if (!rb_equal(exc_backtrace(exc, 0), exc_backtrace(obj, 0)))
- return Qfalse;
+ if (rb_obj_class(exc) != rb_obj_class(obj)) {
+ SEL sel_message = sel_registerName("message");
+ SEL sel_backtrace = sel_registerName("backtrace");
+ if (!rb_vm_respond_to(obj, sel_message, false)
+ || !rb_vm_respond_to(obj, sel_backtrace, false)) {
+ return Qfalse;
+ }
+ mesg = rb_vm_call(obj, sel_message, 0, NULL);
+ backtrace = rb_vm_call(obj, sel_backtrace, 0, NULL);
+ }
+ else {
+ mesg = rb_attr_get(obj, id_mesg);
+ backtrace = exc_backtrace(obj, 0);
+ }
+ if (!rb_equal(rb_attr_get(exc, id_mesg), mesg)) {
+ return Qfalse;
+ }
+ if (!rb_equal(exc_backtrace(exc, 0), backtrace)) {
+ return Qfalse;
+ }
return Qtrue;
}
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20101221/485e435e/attachment.html>
More information about the macruby-changes
mailing list