From: Marc-Andre Lafortune Date: 2009-06-25T03:25:16+09:00 Subject: [ruby-core:24017] [Bug #1686] Enumerable#first broken Bug #1686: Enumerable#first broken http://redmine.ruby-lang.org/issues/show/1686 Author: Marc-Andre Lafortune Status: Open, Priority: High Category: core, Target version: 1.9.2 ruby -v: ruby 1.9.2dev (2009-06-24 trunk 23840) [i386-darwin9.7.0] Enumerable#first is broken in the current HEAD. If 4 <= n < enum_length + 4, enum.first(n) returns the (n-4)th element instead of an array of n elements. E.g.: to6 = (1..6).to_enum # necessary so Enumerable#first is used p to6.first(2) # ==> [1, 2] p to6.first(4) # ==> 1 p to6.first(9) # ==> 6 p to6.first(10) # ==> [1, 2, 3, 4, 5, 6] This is due to http://redmine.ruby-lang.org/repositories/diff/ruby-19/enum.c?rev=23622 , after which ary[0] holds "n" as a long instead of a Fixnum. The comparison to Qnil isn't working as desired. Either ary[0] holds INT2NUM(len) and first_i calls NUM2LONG + INT2NUM (as per my original patch, see http://redmine.ruby-lang.org/issues/show/1554 ) or alternatively, enum_first could use take_i or enum_take when there is an argument, since they behave the same way in that case. ---------------------------------------- http://redmine.ruby-lang.org