summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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