[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