diff options
Diffstat (limited to 'array.rb')
| -rw-r--r-- | array.rb | 55 |
1 files changed, 39 insertions, 16 deletions
@@ -212,20 +212,20 @@ class Array indexes end - with_yjit do + with_jit do if Primitive.rb_builtin_basic_definition_p(:each) undef :each def each # :nodoc: - Primitive.attr! :inline_block, :c_trace + Primitive.attr! :inline_block, :c_trace, :without_interrupts unless defined?(yield) return Primitive.cexpr! 'SIZED_ENUMERATOR(self, 0, 0, ary_enum_length)' end - _i = 0 - value = nil - while Primitive.cexpr!(%q{ ary_fetch_next(self, LOCAL_PTR(_i), LOCAL_PTR(value)) }) - yield value + i = 0 + until Primitive.rb_jit_ary_at_end(i) + yield Primitive.rb_jit_ary_at(i) + i = Primitive.rb_jit_fixnum_inc(i) end self end @@ -235,17 +235,18 @@ class Array undef :map def map # :nodoc: - Primitive.attr! :inline_block, :c_trace + Primitive.attr! :inline_block, :c_trace, :without_interrupts unless defined?(yield) return Primitive.cexpr! 'SIZED_ENUMERATOR(self, 0, 0, ary_enum_length)' end - _i = 0 - value = nil + i = 0 result = Primitive.ary_sized_alloc - while Primitive.cexpr!(%q{ ary_fetch_next(self, LOCAL_PTR(_i), LOCAL_PTR(value)) }) - result << yield(value) + until Primitive.rb_jit_ary_at_end(i) + value = yield(Primitive.rb_jit_ary_at(i)) + Primitive.rb_jit_ary_push(result, value) + i = Primitive.rb_jit_fixnum_inc(i) end result end @@ -260,17 +261,20 @@ class Array undef :select def select # :nodoc: - Primitive.attr! :inline_block, :c_trace + Primitive.attr! :inline_block, :c_trace, :without_interrupts unless defined?(yield) return Primitive.cexpr! 'SIZED_ENUMERATOR(self, 0, 0, ary_enum_length)' end - _i = 0 - value = nil + i = 0 result = Primitive.ary_sized_alloc - while Primitive.cexpr!(%q{ ary_fetch_next(self, LOCAL_PTR(_i), LOCAL_PTR(value)) }) - result << value if yield value + until Primitive.rb_jit_ary_at_end(i) + value = Primitive.rb_jit_ary_at(i) + if yield value + Primitive.rb_jit_ary_push(result, value) + end + i = Primitive.rb_jit_fixnum_inc(i) end result end @@ -280,5 +284,24 @@ class Array alias filter select end end + + if Primitive.rb_builtin_basic_definition_p(:find) + undef :find + + def find(if_none_proc = nil) # :nodoc: + Primitive.attr! :inline_block, :c_trace, :without_interrupts + + unless defined?(yield) + return Primitive.cexpr! 'SIZED_ENUMERATOR(self, 0, 0, ary_enum_length)' + end + i = 0 + until Primitive.rb_jit_ary_at_end(i) + value = Primitive.rb_jit_ary_at(i) + return value if yield(value) + i = Primitive.rb_jit_fixnum_inc(i) + end + if_none_proc&.call + end + end end end |
