1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

numeric.c: fix up r55891

* numeric.c (num_funcall1): check recursion by inverse pair, to
  fix fake infinite recursion.  [ruby-core:77713] [Bug #12864]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@56474 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2016-10-22 13:33:34 +00:00
parent 4154b96068
commit bd3eb8afec
3 changed files with 36 additions and 4 deletions

View file

@ -1,3 +1,8 @@
Sat Oct 22 22:33:32 2016 Nobuyoshi Nakada <nobu@ruby-lang.org>
* numeric.c (num_funcall1): check recursion by inverse pair, to
fix fake infinite recursion. [ruby-core:77713] [Bug #12864]
Sat Oct 22 18:52:32 2016 Nobuyoshi Nakada <nobu@ruby-lang.org> Sat Oct 22 18:52:32 2016 Nobuyoshi Nakada <nobu@ruby-lang.org>
* hash.c (rb_hash_compact_bang): should return nil if no elements * hash.c (rb_hash_compact_bang): should return nil if no elements

View file

@ -294,10 +294,10 @@ num_funcall0(VALUE x, ID func)
} }
static VALUE static VALUE
num_funcall_op_1(VALUE x, VALUE arg, int recursive) num_funcall_op_1(VALUE y, VALUE arg, int recursive)
{ {
ID func = (ID)((VALUE *)arg)[0]; ID func = (ID)((VALUE *)arg)[0];
VALUE y = ((VALUE *)arg)[1]; VALUE x = ((VALUE *)arg)[1];
if (recursive) { if (recursive) {
const char *name = rb_id2name(func); const char *name = rb_id2name(func);
if (ISALNUM(name[0])) { if (ISALNUM(name[0])) {
@ -317,8 +317,8 @@ num_funcall1(VALUE x, ID func, VALUE y)
{ {
VALUE args[2]; VALUE args[2];
args[0] = (VALUE)func; args[0] = (VALUE)func;
args[1] = y; args[1] = x;
return rb_exec_recursive_paired(num_funcall_op_1, x, y, (VALUE)args); return rb_exec_recursive_paired(num_funcall_op_1, y, x, (VALUE)args);
} }
/* /*

View file

@ -353,4 +353,31 @@ class TestNumeric < Test::Unit::TestCase
assert_raise(ArgumentError) {1.remainder(x)} assert_raise(ArgumentError) {1.remainder(x)}
end; end;
end end
def test_comparison_comparable
bug12864 = '[ruby-core:77713] [Bug #12864]'
myinteger = Class.new do
include Comparable
def initialize(i)
@i = i.to_i
end
attr_reader :i
def <=>(other)
@i <=> (other.is_a?(self.class) ? other.i : other)
end
end
all_assertions(bug12864) do |a|
[5, 2**62, 2**61].each do |i|
a.for("%#x"%i) do
m = myinteger.new(i)
assert_equal(i, m)
assert_equal(m, i)
end
end
end
end
end end