From 2e770cdf773d79327cfdeb8178a1cb9b340f4560 Mon Sep 17 00:00:00 2001 From: TOMITA Masahiro Date: Thu, 27 Nov 2025 11:10:43 +0900 Subject: Fix argument handling in `IO::Buffer#each_byte` (#15309) The method incorrectly ignored its first argument and treated the second argument as offset and the third as count. This change makes the first argument be treated as offset and the second as count. Also fix incorrect block parameter in comments. --- io_buffer.c | 4 ++-- test/ruby/test_io_buffer.rb | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/io_buffer.c b/io_buffer.c index abe7832bee..89f169176f 100644 --- a/io_buffer.c +++ b/io_buffer.c @@ -2231,7 +2231,7 @@ io_buffer_values(int argc, VALUE *argv, VALUE self) /* * call-seq: - * each_byte([offset, [count]]) {|offset, byte| ...} -> self + * each_byte([offset, [count]]) {|byte| ...} -> self * each_byte([offset, [count]]) -> enumerator * * Iterates over the buffer, yielding each byte starting from +offset+. @@ -2255,7 +2255,7 @@ io_buffer_each_byte(int argc, VALUE *argv, VALUE self) rb_io_buffer_get_bytes_for_reading(self, &base, &size); size_t offset, count; - io_buffer_extract_offset_count(RB_IO_BUFFER_DATA_TYPE_U8, size, argc-1, argv+1, &offset, &count); + io_buffer_extract_offset_count(RB_IO_BUFFER_DATA_TYPE_U8, size, argc, argv, &offset, &count); for (size_t i = 0; i < count; i++) { unsigned char *value = (unsigned char *)base + i + offset; diff --git a/test/ruby/test_io_buffer.rb b/test/ruby/test_io_buffer.rb index 997ed52640..1e4a6e2fd8 100644 --- a/test/ruby/test_io_buffer.rb +++ b/test/ruby/test_io_buffer.rb @@ -473,6 +473,7 @@ class TestIOBuffer < Test::Unit::TestCase buffer = IO::Buffer.for(string) assert_equal string.bytes, buffer.each_byte.to_a + assert_equal string.bytes[3, 5], buffer.each_byte(3, 5).to_a end def test_zero_length_each_byte -- cgit v1.2.3