summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNARUSE, Yui <nurse@users.noreply.github.com>2024-02-04 22:54:36 +0900
committerGitHub <noreply@github.com>2024-02-04 13:54:36 +0000
commitd7dc57a545d75c01313a9020b162ebb648a3ea18 (patch)
treea2643d1691ca967289a76d836e2e76fdd8c0295a
parenta065b68bd8d93505304f90bbb1855c864e17ad61 (diff)
merge revision(s) c5cf4d4e129f64cb69aaf0a829aed068ef1943c4: [Backport#19542] (#9829)
merge revision(s) c5cf4d4e129f64cb69aaf0a829aed068ef1943c4: [Backport #19542] Improve behavioural consistency of unallocated (zero length) `IO::Buffer`. (#9532) This makes the behaviour of IO::Buffer.new(0) and IO::Buffer.new.slice(0, 0) consistent. Fixes https://bugs.ruby-lang.org/issues/19542 and https://bugs.ruby-lang.org/issues/18805. --- io_buffer.c | 14 ++++++-------- test/ruby/test_io_buffer.rb | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 8 deletions(-)
-rw-r--r--io_buffer.c14
-rw-r--r--test/ruby/test_io_buffer.rb35
-rw-r--r--version.h2
3 files changed, 42 insertions, 9 deletions
diff --git a/io_buffer.c b/io_buffer.c
index 7e580c8633..7715aa0d37 100644
--- a/io_buffer.c
+++ b/io_buffer.c
@@ -854,11 +854,10 @@ io_buffer_get_bytes_for_writing(struct rb_io_buffer *buffer, void **base, size_t
if (buffer->base) {
*base = buffer->base;
*size = buffer->size;
-
- return;
+ } else {
+ *base = NULL;
+ *size = 0;
}
-
- rb_raise(rb_eIOBufferAllocationError, "The buffer is not allocated!");
}
void
@@ -880,11 +879,10 @@ io_buffer_get_bytes_for_reading(struct rb_io_buffer *buffer, const void **base,
if (buffer->base) {
*base = buffer->base;
*size = buffer->size;
-
- return;
+ } else {
+ *base = NULL;
+ *size = 0;
}
-
- rb_raise(rb_eIOBufferAllocationError, "The buffer is not allocated!");
}
void
diff --git a/test/ruby/test_io_buffer.rb b/test/ruby/test_io_buffer.rb
index 321b6534ee..7a58ec0c5a 100644
--- a/test/ruby/test_io_buffer.rb
+++ b/test/ruby/test_io_buffer.rb
@@ -199,6 +199,14 @@ class TestIOBuffer < Test::Unit::TestCase
assert_positive buffer2 <=> buffer1
end
+ def test_compare_zero_length
+ buffer1 = IO::Buffer.new(0)
+ buffer2 = IO::Buffer.new(1)
+
+ assert_negative buffer1 <=> buffer2
+ assert_positive buffer2 <=> buffer1
+ end
+
def test_slice
buffer = IO::Buffer.new(128)
slice = buffer.slice(8, 32)
@@ -270,6 +278,14 @@ class TestIOBuffer < Test::Unit::TestCase
end
end
+ def test_zero_length_get_string
+ buffer = IO::Buffer.new.slice(0, 0)
+ assert_equal "", buffer.get_string
+
+ buffer = IO::Buffer.new(0)
+ assert_equal "", buffer.get_string
+ end
+
# We check that values are correctly round tripped.
RANGES = {
:U8 => [0, 2**8-1],
@@ -316,6 +332,13 @@ class TestIOBuffer < Test::Unit::TestCase
end
end
+ def test_zero_length_get_set_values
+ buffer = IO::Buffer.new(0)
+
+ assert_equal [], buffer.get_values([], 0)
+ assert_equal 0, buffer.set_values([], 0, [])
+ end
+
def test_values
buffer = IO::Buffer.new(128)
@@ -340,6 +363,12 @@ class TestIOBuffer < Test::Unit::TestCase
end
end
+ def test_zero_length_each
+ buffer = IO::Buffer.new(0)
+
+ assert_equal [], buffer.each(:U8).to_a
+ end
+
def test_each_byte
string = "The quick brown fox jumped over the lazy dog."
buffer = IO::Buffer.for(string)
@@ -347,6 +376,12 @@ class TestIOBuffer < Test::Unit::TestCase
assert_equal string.bytes, buffer.each_byte.to_a
end
+ def test_zero_length_each_byte
+ buffer = IO::Buffer.new(0)
+
+ assert_equal [], buffer.each_byte.to_a
+ end
+
def test_clear
buffer = IO::Buffer.new(16)
buffer.set_string("Hello World!")
diff --git a/version.h b/version.h
index 9b9fde34c4..d5097e2003 100644
--- a/version.h
+++ b/version.h
@@ -11,7 +11,7 @@
# define RUBY_VERSION_MINOR RUBY_API_VERSION_MINOR
#define RUBY_VERSION_TEENY 0
#define RUBY_RELEASE_DATE RUBY_RELEASE_YEAR_STR"-"RUBY_RELEASE_MONTH_STR"-"RUBY_RELEASE_DAY_STR
-#define RUBY_PATCHLEVEL 9
+#define RUBY_PATCHLEVEL 10
#include "ruby/version.h"
#include "ruby/internal/abi.h"