From 9f3a40a3057b2bfbc9711311821922f71ffaa714 Mon Sep 17 00:00:00 2001 From: Kitaiti Makoto Date: Sat, 22 Aug 2026 14:51:13 +0900 Subject: [PATCH 1/8] Change unsupported flag for Pointer from WRITABLE to INDIRECT --- test/fiddle/test_memory_view.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/fiddle/test_memory_view.rb b/test/fiddle/test_memory_view.rb index fa2e6840..b40352a6 100644 --- a/test/fiddle/test_memory_view.rb +++ b/test/fiddle/test_memory_view.rb @@ -49,7 +49,7 @@ 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 end From 7670df9dee4f46819680ad8689b324b04c1a2387 Mon Sep 17 00:00:00 2001 From: Kitaiti Makoto Date: Sat, 22 Aug 2026 14:54:33 +0900 Subject: [PATCH 2/8] Make Pointer's MemoryView's readonly false --- ext/fiddle/pointer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/fiddle/pointer.c b/ext/fiddle/pointer.c index 87abc864..c59abf85 100644 --- a/ext/fiddle/pointer.c +++ b/ext/fiddle/pointer.c @@ -140,7 +140,7 @@ fiddle_ptr_get_memory_view(VALUE obj, rb_memory_view_t *view, int flags) if (flags != RUBY_MEMORY_VIEW_SIMPLE) 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, false); return true; } From 068e38c6afd42dd0c3016bfc5f304977ef6df701 Mon Sep 17 00:00:00 2001 From: Kitaiti Makoto Date: Sat, 22 Aug 2026 14:54:42 +0900 Subject: [PATCH 3/8] Make test follow implementation change --- test/fiddle/test_memory_view.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/fiddle/test_memory_view.rb b/test/fiddle/test_memory_view.rb index b40352a6..a11a96f6 100644 --- a/test/fiddle/test_memory_view.rb +++ b/test/fiddle/test_memory_view.rb @@ -68,7 +68,7 @@ def test_memory_view_from_pointer begin assert_same(ptr, mview.obj) assert_equal(str.bytesize, mview.byte_size) - assert_equal(true, mview.readonly?) + assert_equal(false, mview.readonly?) assert_equal(nil, mview.format) assert_equal(1, mview.item_size) assert_equal(1, mview.ndim) From 824f063e8e11b3ac7c4b3ec5e81af2d02b28c8f6 Mon Sep 17 00:00:00 2001 From: Kitaiti Makoto Date: Sat, 22 Aug 2026 15:19:38 +0900 Subject: [PATCH 4/8] Make Pointer MemoryView accept WRITABLE flag --- ext/fiddle/pointer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/fiddle/pointer.c b/ext/fiddle/pointer.c index c59abf85..65806571 100644 --- a/ext/fiddle/pointer.c +++ b/ext/fiddle/pointer.c @@ -137,7 +137,7 @@ 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; + if (flags != RUBY_MEMORY_VIEW_SIMPLE && flags != RUBY_MEMORY_VIEW_WRITABLE) 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, false); From a316291e892ee047d6c67e7e2a1b375a06650cec Mon Sep 17 00:00:00 2001 From: Kitaiti Makoto Date: Sat, 22 Aug 2026 15:19:56 +0900 Subject: [PATCH 5/8] Make test follow implementation change --- test/fiddle/test_memory_view.rb | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/test/fiddle/test_memory_view.rb b/test/fiddle/test_memory_view.rb index a11a96f6..6f53b590 100644 --- a/test/fiddle/test_memory_view.rb +++ b/test/fiddle/test_memory_view.rb @@ -38,7 +38,7 @@ def test_available? def test_new_with_flags ptr = Pointer["hello world"] - mview = MemoryView.new(ptr, MemoryView::SIMPLE) + mview = MemoryView.new(ptr, MemoryView::WRITABLE) begin assert_equal(ptr.size, mview.byte_size) ensure @@ -51,6 +51,9 @@ def test_new_with_unsupported_flags assert_raise(ArgumentError) do MemoryView.new(ptr, MemoryView::INDIRECT) end + assert_raise(ArgumentError) do + MemoryView.new(ptr, MemoryView::WRITABLE | MemoryView::INDIRECT) + end end def test_export_with_flags From 3de5e8f791c0dbf1c0875797b7076e99a5e9219d Mon Sep 17 00:00:00 2001 From: Kitaiti Makoto Date: Sat, 22 Aug 2026 18:53:14 +0900 Subject: [PATCH 6/8] Make Pointer's MemoryView readonly when SIMPLE flags requested --- ext/fiddle/pointer.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ext/fiddle/pointer.c b/ext/fiddle/pointer.c index 65806571..2409e611 100644 --- a/ext/fiddle/pointer.c +++ b/ext/fiddle/pointer.c @@ -137,10 +137,11 @@ fiddle_ptr_memory_view_available_p(VALUE obj) static bool fiddle_ptr_get_memory_view(VALUE obj, rb_memory_view_t *view, int flags) { + bool writable_requested = flags & RUBY_MEMORY_VIEW_WRITABLE; if (flags != RUBY_MEMORY_VIEW_SIMPLE && flags != RUBY_MEMORY_VIEW_WRITABLE) 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, false); + rb_memory_view_init_as_byte_array(view, obj, data->ptr, data->size, !writable_requested); return true; } From d6b51258f8da411448d464c90d0c779f15b2242e Mon Sep 17 00:00:00 2001 From: Kitaiti Makoto Date: Sat, 22 Aug 2026 18:53:38 +0900 Subject: [PATCH 7/8] Make test follow implementation change --- test/fiddle/test_memory_view.rb | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/test/fiddle/test_memory_view.rb b/test/fiddle/test_memory_view.rb index 6f53b590..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 do + mview.readonly? + end + ensure + mview.release + end + mview = MemoryView.new(ptr, MemoryView::WRITABLE) begin - assert_equal(ptr.size, mview.byte_size) + assert do + !mview.readonly? + end ensure mview.release end @@ -71,7 +83,7 @@ def test_memory_view_from_pointer begin assert_same(ptr, mview.obj) assert_equal(str.bytesize, mview.byte_size) - assert_equal(false, mview.readonly?) + assert_equal(true, mview.readonly?) assert_equal(nil, mview.format) assert_equal(1, mview.item_size) assert_equal(1, mview.ndim) From a777f0c6f27d41c746161662ca053d49e4057f38 Mon Sep 17 00:00:00 2001 From: Kitaiti Makoto Date: Sun, 23 Aug 2026 12:40:51 +0900 Subject: [PATCH 8/8] Assign check result of flags to a variable for understandability --- ext/fiddle/pointer.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/ext/fiddle/pointer.c b/ext/fiddle/pointer.c index 2409e611..e0e43210 100644 --- a/ext/fiddle/pointer.c +++ b/ext/fiddle/pointer.c @@ -137,11 +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) { - bool writable_requested = flags & RUBY_MEMORY_VIEW_WRITABLE; - if (flags != RUBY_MEMORY_VIEW_SIMPLE && flags != RUBY_MEMORY_VIEW_WRITABLE) 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, !writable_requested); + rb_memory_view_init_as_byte_array(view, obj, data->ptr, data->size, read_only); return true; }