From cff7d57e9c2c4fe0f2181d4851352272c95d3edf Mon Sep 17 00:00:00 2001 From: himura467 Date: Thu, 23 Jul 2026 23:41:30 +0900 Subject: [PATCH] Add `Fiddle::MemoryView.available?` Fiddle had no binding for `rb_memory_view_available_p()`, which callers can use to check whether an object supports the memory view protocol. --- ext/fiddle/memory_view.c | 7 +++++++ test/fiddle/test_memory_view.rb | 6 ++++++ 2 files changed, 13 insertions(+) diff --git a/ext/fiddle/memory_view.c b/ext/fiddle/memory_view.c index 5fd7b9b4..f5a7ddde 100644 --- a/ext/fiddle/memory_view.c +++ b/ext/fiddle/memory_view.c @@ -96,6 +96,12 @@ rb_fiddle_memview_release(VALUE obj) return Qnil; } +static VALUE +rb_fiddle_memview_s_available_p(VALUE klass, VALUE target) +{ + return rb_memory_view_available_p(target) ? Qtrue : Qfalse; +} + static VALUE rb_fiddle_memview_s_export(VALUE klass, VALUE target) { @@ -307,6 +313,7 @@ Init_fiddle_memory_view(void) { rb_cMemoryView = rb_define_class_under(mFiddle, "MemoryView", rb_cObject); rb_define_alloc_func(rb_cMemoryView, rb_fiddle_memview_s_allocate); + rb_define_singleton_method(rb_cMemoryView, "available?", rb_fiddle_memview_s_available_p, 1); rb_define_singleton_method(rb_cMemoryView, "export", rb_fiddle_memview_s_export, 1); rb_define_method(rb_cMemoryView, "initialize", rb_fiddle_memview_initialize, 1); rb_define_method(rb_cMemoryView, "release", rb_fiddle_memview_release, 0); diff --git a/test/fiddle/test_memory_view.rb b/test/fiddle/test_memory_view.rb index da00d66c..c141daf9 100644 --- a/test/fiddle/test_memory_view.rb +++ b/test/fiddle/test_memory_view.rb @@ -30,6 +30,12 @@ def test_memory_view_from_unsupported_obj end end + def test_available? + assert {MemoryView.available?(Pointer["hello world"])} + assert {!MemoryView.available?(Fiddle::NULL)} + assert {!MemoryView.available?(Object.new)} + end + def test_memory_view_from_pointer str = Marshal.load(Marshal.dump("hello world")) ptr = Pointer[str]