Skip to content

Commit

Permalink
range.c: covered for linear objects
Browse files Browse the repository at this point in the history
* range.c (linear_object_p, range_include): test if covered for
  linear objects.  [ruby-core:69052] [Bug #11113]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@50421 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
  • Loading branch information
nobu committed May 3, 2015
1 parent 06cb320 commit b061634
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 2 deletions.
5 changes: 5 additions & 0 deletions ChangeLog
@@ -1,3 +1,8 @@
Sun May 3 10:02:12 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>

* range.c (linear_object_p, range_include): test if covered for
linear objects. [ruby-core:69052] [Bug #11113]

Fri May 1 13:30:24 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>

* dln.c (dln_load): check if a different libruby is loaded by the
Expand Down
18 changes: 16 additions & 2 deletions range.c
Expand Up @@ -331,6 +331,21 @@ discrete_object_p(VALUE obj)
return rb_respond_to(obj, id_succ);
}

static int
linear_object_p(VALUE obj)
{
if (FIXNUM_P(obj) || FLONUM_P(obj)) return TRUE;
if (SPECIAL_CONST_P(obj)) return FALSE;
switch (BUILTIN_TYPE(obj)) {
case T_FLOAT:
case T_BIGNUM:
return TRUE;
}
if (rb_obj_is_kind_of(obj, rb_cNumeric)) return TRUE;
if (rb_obj_is_kind_of(obj, rb_cTime)) return TRUE;
return FALSE;
}

static VALUE
range_step_size(VALUE range, VALUE args, VALUE eobj)
{
Expand Down Expand Up @@ -1156,8 +1171,7 @@ range_include(VALUE range, VALUE val)
VALUE beg = RANGE_BEG(range);
VALUE end = RANGE_END(range);
int nv = FIXNUM_P(beg) || FIXNUM_P(end) ||
rb_obj_is_kind_of(beg, rb_cNumeric) ||
rb_obj_is_kind_of(end, rb_cNumeric);
linear_object_p(beg) || linear_object_p(end);

if (nv ||
!NIL_P(rb_check_to_integer(beg, "to_int")) ||
Expand Down
8 changes: 8 additions & 0 deletions test/ruby/test_range.rb
Expand Up @@ -283,6 +283,14 @@ def test_eqq
assert_not_operator(0..10, :===, 11)
end

def test_eqq_time
bug11113 = '[ruby-core:69052] [Bug #11113]'
t = Time.now
assert_nothing_raised(TypeError, bug11113) {
assert_operator(t..(t+10), :===, t+5)
}
end

def test_include
assert_include("a".."z", "c")
assert_not_include("a".."z", "5")
Expand Down

0 comments on commit b061634

Please sign in to comment.