diff options
author | Jeremy Evans <code@jeremyevans.net> | 2020-07-16 10:11:35 -0700 |
---|---|---|
committer | Marc-Andre Lafortune <github@marc-andre.ca> | 2020-07-19 10:25:55 -0400 |
commit | 05bf811c2839628aaef3d565daedb28be80d47ef (patch) | |
tree | 7d698b91dbd823306db5efc752e9cae3e4f6b569 /range.c | |
parent | d637208abd0ae7ccf0539679ca52df1caada4db7 (diff) |
Special case Range#max for integer beginning and Float::Infinity end
Popular Ruby libraries such as Rails and Rubocop relying on the
previous behavior, even though it is technically a bug. The
correct behavior is probably raising RangeError, since that is what
an endless range raises.
Related to [Bug #17017]
Diffstat (limited to 'range.c')
-rw-r--r-- | range.c | 9 |
1 files changed, 9 insertions, 0 deletions
@@ -1255,6 +1255,15 @@ range_max(int argc, VALUE *argv, VALUE range) return rb_funcall(e, '-', 1, INT2FIX(1)); } if (RB_INTEGER_TYPE_P(b) && !RB_INTEGER_TYPE_P(e)) { + if (RB_TYPE_P(e, T_FLOAT)) { + VALUE inf = rb_funcall(e, rb_intern("infinite?"), 0); + if (inf != Qnil) { + /* For backwards compatibility, return end if the end + * is Float::Infinity and the beginning is integer. + If end is -Float::Infinity, return nil. */ + return(inf == INT2FIX(1) ? e : Qnil); + } + } e = rb_funcall(e, rb_intern("floor"), 0); } return e; |