diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-05-24 13:39:57 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-05-24 13:39:57 +0000 |
commit | 582da7dac70c7fd9c9927cd57587e0cebfebfb3d (patch) | |
tree | e0bdac054327f84e64068a4c9d03f76061c3722f | |
parent | 8707a6ff4b380790549aee1d7c6f023461580f6c (diff) | |
download | ruby-582da7dac70c7fd9c9927cd57587e0cebfebfb3d.tar.gz |
* error.c (exc_equal): == operator should be transitional.
[ruby-dev:34808]
* error.c (syserr_eqq): === should be able to handle delegated
objects as well.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@16572 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | error.c | 16 |
2 files changed, 15 insertions, 9 deletions
@@ -34,6 +34,14 @@ Fri May 23 12:23:05 2008 Nobuyoshi Nakada <nobu@ruby-lang.org> tool/instruction.rb (RubyVM::VmBodyGenerator#make_header_operands): omit unused variables. +Fri May 23 08:47:02 2008 Yukihiro Matsumoto <matz@ruby-lang.org> + + * error.c (exc_equal): == operator should be transitional. + [ruby-dev:34808] + + * error.c (syserr_eqq): === should be able to handle delegated + objects as well. + Fri May 23 06:15:20 2008 Nobuyoshi Nakada <nobu@ruby-lang.org> * iseq.c (rb_iseq_compile_with_option): get rid of segv. @@ -556,7 +556,7 @@ exc_equal(VALUE exc, VALUE obj) if (exc == obj) return Qtrue; if (rb_obj_class(exc) != rb_obj_class(obj)) - return Qfalse; + 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), exc_backtrace(obj))) @@ -963,18 +963,16 @@ static VALUE syserr_eqq(VALUE self, VALUE exc) { VALUE num, e; + ID en = rb_intern("errno"); - if (!rb_obj_is_kind_of(exc, rb_eSystemCallError)) return Qfalse; - if (self == rb_eSystemCallError) return Qtrue; + if (!rb_obj_is_kind_of(exc, rb_eSystemCallError)) { + if (!rb_respond_to(exc, en)) return Qfalse; + } + else if (self == rb_eSystemCallError) return Qtrue; num = rb_attr_get(exc, rb_intern("errno")); if (NIL_P(num)) { - VALUE klass = CLASS_OF(exc); - - while (TYPE(klass) == T_ICLASS || FL_TEST(klass, FL_SINGLETON)) { - klass = (VALUE)RCLASS_SUPER(klass); - } - num = rb_const_get(klass, rb_intern("Errno")); + num = rb_funcall(exc, en, 0, 0); } e = rb_const_get(self, rb_intern("Errno")); if (FIXNUM_P(num) ? num == e : rb_equal(num, e)) |