From 2d8841791facb07155c710d8a7db7b0bf8be0d21 Mon Sep 17 00:00:00 2001 From: knu Date: Sat, 5 Nov 2016 13:53:38 +0000 Subject: [PATCH] IPAddr#== and IPAddr#<=> no longer raise an exception if coercion fails * lib/ipaddr.rb (IPAddr#==): If coercion fails, return false instead of passing through the exception. [ruby-core:77451] [Bug #12799] * lib/ipaddr.rb (IPAddr#<=>): If coercion fails, return nil instead of passing through the exception. [ruby-core:77451] [Bug #12799] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@56594 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 10 ++++++++++ NEWS | 5 +++++ lib/ipaddr.rb | 13 ++++++++----- test/test_ipaddr.rb | 9 +++++++++ 4 files changed, 32 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index aeda10e39a..75f0bc1acd 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +Sat Nov 5 22:50:13 2016 Akinori MUSHA + + * lib/ipaddr.rb (IPAddr#==): If coercion fails, return false + instead of passing through the exception. [ruby-core:77451] + [Bug #12799] + + * lib/ipaddr.rb (IPAddr#<=>): If coercion fails, return nil + instead of passing through the exception. [ruby-core:77451] + [Bug #12799] + Sat Nov 5 22:11:33 2016 Kazuki Tsujimoto * vm_trace.c (tracepoint_attr_callee_id, rb_tracearg_callee_id): diff --git a/NEWS b/NEWS index 014e2141a0..806dc28fb4 100644 --- a/NEWS +++ b/NEWS @@ -181,6 +181,11 @@ with all sufficient information, see the ChangeLog file or Redmine * Add a liberal_parsing option. [Feature #11839] +* IPAddr + + * IPAddr#== and IPAddr#<=> no longer raise an exception if coercion fails. + [Bug #12799] + * Logger * Allow specifying logger parameters in constructor such diff --git a/lib/ipaddr.rb b/lib/ipaddr.rb index 458be58577..6f70ebf773 100644 --- a/lib/ipaddr.rb +++ b/lib/ipaddr.rb @@ -149,7 +149,10 @@ class IPAddr # Returns true if two ipaddrs are equal. def ==(other) other = coerce_other(other) - return @family == other.family && @addr == other.to_i + rescue + false + else + @family == other.family && @addr == other.to_i end # Returns a new ipaddr built by masking IP address with the given @@ -335,10 +338,10 @@ class IPAddr # Compares the ipaddr with another. def <=>(other) other = coerce_other(other) - - return nil if other.family != @family - - return @addr <=> other.to_i + rescue + nil + else + @addr <=> other.to_i if other.family == @family end include Comparable diff --git a/test/test_ipaddr.rb b/test/test_ipaddr.rb index b9209f72d9..86482a08bd 100644 --- a/test/test_ipaddr.rb +++ b/test/test_ipaddr.rb @@ -169,6 +169,8 @@ class TC_Operator < Test::Unit::TestCase @a = IPAddr.new("3ffe:505:2::/48") @b = IPAddr.new("0:0:0:1::") @c = IPAddr.new(IN6MASK32) + @inconvertible_range = 1..5 + @inconvertible_string = "sometext" end alias set_up setup @@ -220,6 +222,13 @@ class TC_Operator < Test::Unit::TestCase assert_equal(false, @a == IPAddr.new("3ffe:505:3::")) assert_equal(true, @a != IPAddr.new("3ffe:505:3::")) assert_equal(false, @a != IPAddr.new("3ffe:505:2::")) + assert_equal(false, @a == @inconvertible_range) + assert_equal(false, @a == @inconvertible_string) + end + + def test_compare + assert_equal(nil, @a <=> @inconvertible_range) + assert_equal(nil, @a <=> @inconvertible_string) end def test_mask