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/