diff --git a/ext/fiddle/pointer.c b/ext/fiddle/pointer.c index 87abc864..e0e43210 100644 --- a/ext/fiddle/pointer.c +++ b/ext/fiddle/pointer.c @@ -137,10 +137,12 @@ fiddle_ptr_memory_view_available_p(VALUE obj) static bool fiddle_ptr_get_memory_view(VALUE obj, rb_memory_view_t *view, int flags) { - if (flags != RUBY_MEMORY_VIEW_SIMPLE) return false; + bool flags_supported = (flags == RUBY_MEMORY_VIEW_SIMPLE) || (flags == RUBY_MEMORY_VIEW_WRITABLE); + bool read_only = !(flags & RUBY_MEMORY_VIEW_WRITABLE); + if (!flags_supported) return false; struct ptr_data *data = fiddle_ptr_check_memory_view(obj); - rb_memory_view_init_as_byte_array(view, obj, data->ptr, data->size, true); + rb_memory_view_init_as_byte_array(view, obj, data->ptr, data->size, read_only); return true; } diff --git a/test/fiddle/test_memory_view.rb b/test/fiddle/test_memory_view.rb index fa2e6840..da41c71b 100644 --- a/test/fiddle/test_memory_view.rb +++ b/test/fiddle/test_memory_view.rb @@ -38,9 +38,21 @@ def test_available? def test_new_with_flags ptr = Pointer["hello world"] + mview = MemoryView.new(ptr, MemoryView::SIMPLE) begin - assert_equal(ptr.size, mview.byte_size) + assert do + mview.readonly? + end + ensure + mview.release + end + + mview = MemoryView.new(ptr, MemoryView::WRITABLE) + begin + assert do + !mview.readonly? + end ensure mview.release end @@ -49,7 +61,10 @@ def test_new_with_flags def test_new_with_unsupported_flags ptr = Pointer["hello world"] assert_raise(ArgumentError) do - MemoryView.new(ptr, MemoryView::WRITABLE) + MemoryView.new(ptr, MemoryView::INDIRECT) + end + assert_raise(ArgumentError) do + MemoryView.new(ptr, MemoryView::WRITABLE | MemoryView::INDIRECT) end end