diff options
author | Samuel Williams <samuel.williams@oriontransfer.co.nz> | 2021-12-20 09:43:22 +1300 |
---|---|---|
committer | Samuel Williams <samuel.williams@oriontransfer.co.nz> | 2021-12-21 12:25:42 +1300 |
commit | 71bf5cef75b9d244a06261c9fc0b84fbe5a1592f (patch) | |
tree | 9ecde04f340d154b4860d8004b5e9bf345bf8afb | |
parent | 9de5c4ec761aad3edc50b38d9824b40665d18911 (diff) | |
download | ruby-71bf5cef75b9d244a06261c9fc0b84fbe5a1592f.tar.gz |
Fix handling of frozens strings.
-rw-r--r-- | io_buffer.c | 7 | ||||
-rw-r--r-- | test/ruby/test_io_buffer.rb | 8 |
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 |