[前][次][番号順一覧][スレッド一覧]

ruby-changes:9486

From: yugui <ko1@a...>
Date: Thu, 25 Dec 2008 18:57:28 +0900 (JST)
Subject: [ruby-changes:9486] Ruby:r21025 (ruby_1_9_1): merges r20866 and r20968 from trunk into ruby_1_9_1.

yugui	2008-12-25 18:55:46 +0900 (Thu, 25 Dec 2008)

  New Revision: 21025

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=21025

  Log:
    merges r20866 and r20968 from trunk into ruby_1_9_1.
    * error.c (exc_equal): duck typing equal to make it transitive.
      [ruby-dev:34880]
    --
    * error.c (exc_equal): == method should not raise Exception.
      [ruby-dev:37519]
    * sample/test.rb: fix test

  Modified files:
    branches/ruby_1_9_1/ChangeLog
    branches/ruby_1_9_1/error.c
    branches/ruby_1_9_1/sample/test.rb

Index: ruby_1_9_1/ChangeLog
===================================================================
--- ruby_1_9_1/ChangeLog	(revision 21024)
+++ ruby_1_9_1/ChangeLog	(revision 21025)
@@ -1,3 +1,15 @@
+Wed Dec 24 20:59:12 2008  Koichi Sasada  <ko1@a...>
+
+	* error.c (exc_equal): == method should not raise Exception.
+	  [ruby-dev:37519]
+
+	* sample/test.rb: fix test
+
+Fri Dec 19 07:45:37 2008  Yukihiro Matsumoto  <matz@r...>
+
+	* error.c (exc_equal): duck typing equal to make it transitive.
+	  [ruby-dev:34880]
+
 Wed Dec 24 20:33:45 2008  Koichi Sasada  <ko1@a...>
 
 	* vm_insnhelper.c (vm_call_method): use class of method defined
Index: ruby_1_9_1/sample/test.rb
===================================================================
--- ruby_1_9_1/sample/test.rb	(revision 21024)
+++ ruby_1_9_1/sample/test.rb	(revision 21025)
@@ -660,10 +660,12 @@
     raise $string
   end
   test_ok(false)
-rescue
-  test_ok(true) if $! == $string
+rescue => e
+  test_ok($! == e)
+  test_ok(e.message == $string)
+  test_ok(e != $string)
 end
-  
+
 # exception in ensure clause
 begin
   begin
Index: ruby_1_9_1/error.c
===================================================================
--- ruby_1_9_1/error.c	(revision 21024)
+++ ruby_1_9_1/error.c	(revision 21025)
@@ -554,15 +554,33 @@
 static VALUE
 exc_equal(VALUE exc, VALUE obj)
 {
+    VALUE mesg, backtrace;
     ID id_mesg;
 
     if (exc == obj) return Qtrue;
-    if (rb_obj_class(exc) != rb_obj_class(obj))
-	return Qfalse;
     CONST_ID(id_mesg, "mesg");
-    if (!rb_equal(rb_attr_get(exc, id_mesg), rb_attr_get(obj, id_mesg)))
+
+    if (rb_obj_class(exc) != rb_obj_class(obj)) {
+	ID id_message, id_backtrace;
+	CONST_ID(id_message, "message");
+	CONST_ID(id_backtrace, "backtrace");
+
+	if (rb_respond_to(obj, id_message) && rb_respond_to(obj, id_backtrace)) {
+	    mesg = rb_funcall(obj, id_message, 0, 0);
+	    backtrace = rb_funcall(obj, id_backtrace, 0, 0);
+	}
+	else {
+	    return Qfalse;
+	}
+    }
+    else {
+	mesg = rb_attr_get(obj, id_mesg);
+	backtrace = exc_backtrace(obj);
+    }
+
+    if (!rb_equal(rb_attr_get(exc, id_mesg), mesg))
 	return Qfalse;
-    if (!rb_equal(exc_backtrace(exc), exc_backtrace(obj)))
+    if (!rb_equal(exc_backtrace(exc), backtrace))
 	return Qfalse;
     return Qtrue;
 }

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]