summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Williams <samuel.williams@oriontransfer.co.nz>2021-12-20 09:43:22 +1300
committerSamuel Williams <samuel.williams@oriontransfer.co.nz>2021-12-21 12:25:42 +1300
commit71bf5cef75b9d244a06261c9fc0b84fbe5a1592f (patch)
tree9ecde04f340d154b4860d8004b5e9bf345bf8afb
parent9de5c4ec761aad3edc50b38d9824b40665d18911 (diff)
downloadruby-71bf5cef75b9d244a06261c9fc0b84fbe5a1592f.tar.gz
Fix handling of frozens strings.
-rw-r--r--io_buffer.c7
-rw-r--r--test/ruby/test_io_buffer.rb8
2 files changed, 14 insertions, 1 deletions
diff --git a/io_buffer.c b/io_buffer.c
index a97c687239..d2a12b98fb 100644
--- a/io_buffer.c
+++ b/io_buffer.c
@@ -279,7 +279,12 @@ rb_io_buffer_type_for(VALUE klass, VALUE string)
rb_str_locktmp(string);
- io_buffer_initialize(data, RSTRING_PTR(string), RSTRING_LEN(string), RB_IO_BUFFER_EXTERNAL, string);
+ enum rb_io_buffer_flags flags = RB_IO_BUFFER_EXTERNAL;
+
+ if (RB_OBJ_FROZEN(string))
+ flags |= RB_IO_BUFFER_IMMUTABLE;
+
+ io_buffer_initialize(data, RSTRING_PTR(string), RSTRING_LEN(string), flags, string);
return instance;
}
diff --git a/test/ruby/test_io_buffer.rb b/test/ruby/test_io_buffer.rb
index 385a133421..76fa1bd774 100644
--- a/test/ruby/test_io_buffer.rb
+++ b/test/ruby/test_io_buffer.rb
@@ -83,6 +83,7 @@ class TestIOBuffer < Test::Unit::TestCase
def test_string_mapped
string = "Hello World"
buffer = IO::Buffer.for(string)
+ refute buffer.immutable?
# Cannot modify string as it's locked by the buffer:
assert_raise RuntimeError do
@@ -99,6 +100,13 @@ class TestIOBuffer < Test::Unit::TestCase
assert_equal "Hello World", string
end
+ def test_string_mapped_frozen
+ string = "Hello World".freeze
+ buffer = IO::Buffer.for(string)
+
+ assert buffer.immutable?
+ end
+
def test_non_string
not_string = Object.new