* range.c: Use div instead of / for bsearch

* test/ruby/test_range.rb: Test showing bug when requiring mathn

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@39059 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
marcandre 2013-02-05 03:51:09 +00:00
Родитель 1677cbce9d
Коммит e29e4b55ab
3 изменённых файлов: 14 добавлений и 2 удалений

Просмотреть файл

@ -1,3 +1,9 @@
Tue Feb 5 12:50:47 2013 Marc-Andre Lafortune <ruby-core@marc-andre.ca>
* range.c: Use div instead of / for bsearch
* test/ruby/test_range.rb: Test showing bug when requiring mathn
Tue Feb 5 12:48:38 2013 Marc-Andre Lafortune <ruby-core@marc-andre.ca>
* enumerator.c: Use to_enum for Enumerable methods returning

Просмотреть файл

@ -20,7 +20,7 @@
#include <math.h>
VALUE rb_cRange;
static ID id_cmp, id_succ, id_beg, id_end, id_excl, id_integer_p;
static ID id_cmp, id_succ, id_beg, id_end, id_excl, id_integer_p, id_div;
#define RANGE_BEG(r) (RSTRUCT(r)->as.ary[0])
#define RANGE_END(r) (RSTRUCT(r)->as.ary[1])
@ -656,7 +656,7 @@ range_bsearch(VALUE range)
org_high = high;
while (rb_cmpint(rb_funcall(low, id_cmp, 1, high), low, high) < 0) {
mid = rb_funcall(rb_funcall(high, '+', 1, low), '/', 1, INT2FIX(2));
mid = rb_funcall(rb_funcall(high, '+', 1, low), id_div, 1, INT2FIX(2));
BSEARCH_CHECK(mid);
if (smaller) {
high = mid;
@ -1311,6 +1311,7 @@ Init_Range(void)
id_end = rb_intern("end");
id_excl = rb_intern("excl");
id_integer_p = rb_intern("integer?");
id_div = rb_intern("div");
rb_cRange = rb_struct_define_without_accessor(
"Range", rb_cObject, range_alloc,

Просмотреть файл

@ -2,6 +2,7 @@ require 'test/unit'
require 'delegate'
require 'timeout'
require 'bigdecimal'
require_relative 'envutil'
class TestRange < Test::Unit::TestCase
def test_range_string
@ -535,4 +536,8 @@ class TestRange < Test::Unit::TestCase
assert_raise(TypeError) { ("a".."z").bsearch {} }
end
def test_bsearch_with_mathn
assert_in_out_err ['-r', 'mathn', '-e', 'puts (1..(1<<100)).bsearch{|x| raise "#{x} should be integer" unless x.integer?; x >= 42}'], "", ["42"], [], '[ruby-core:25740]'
end
end