From dde8c9f8524806ad19b0b07ab1a084640ee6547d Mon Sep 17 00:00:00 2001 From: Andrew Kane Date: Mon, 21 Apr 2025 22:52:09 -0700 Subject: [PATCH 1/2] Make pointer size consistent between backends --- lib/fiddle/ffi_backend.rb | 5 ++++- test/fiddle/test_pointer.rb | 8 ++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/lib/fiddle/ffi_backend.rb b/lib/fiddle/ffi_backend.rb index 0c385510..e0d63bb9 100644 --- a/lib/fiddle/ffi_backend.rb +++ b/lib/fiddle/ffi_backend.rb @@ -323,7 +323,7 @@ def initialize(addr, size = nil, free = nil) FFI::Pointer.new(Integer(addr)) end - @size = size ? size : ptr.size + @size = size ? size : (ptr.size_limit? ? ptr.size : 0) @free = free @ffi_ptr = ptr @freed = false @@ -413,6 +413,8 @@ def to_i def to_s(len = nil) if len ffi_ptr.read_string(len) + elsif @size == 0 + ffi_ptr.read_string else ffi_ptr.get_string(0, @size) end @@ -486,6 +488,7 @@ def -@ def ref cptr = Pointer.malloc(FFI::Type::POINTER.size, RUBY_FREE) cptr.ffi_ptr.put_pointer(0, ffi_ptr) + cptr.size = 0 cptr end end diff --git a/test/fiddle/test_pointer.rb b/test/fiddle/test_pointer.rb index ebb5451f..6f086f00 100644 --- a/test/fiddle/test_pointer.rb +++ b/test/fiddle/test_pointer.rb @@ -81,6 +81,9 @@ def test_to_str ptr[5] = 0 assert_equal "hello\0world", ptr.to_str + + ptr.size = 0 + assert_equal "", ptr.to_str end def test_to_s @@ -93,6 +96,9 @@ def test_to_s ptr[5] = 0 assert_equal 'hello', ptr.to_s assert_equal "hello\0", ptr.to_s(6) + + ptr.size = 0 + assert_equal "hello", ptr.to_s end def test_minus @@ -256,6 +262,8 @@ def test_size Pointer.malloc(4, Fiddle::RUBY_FREE) do |ptr| assert_equal 4, ptr.size end + assert_equal 0, Pointer.new(0).size + assert_equal 0, Pointer.new(0).ref.size end def test_size= From 66203d45c9b2dc0535f4aa91f2ba9472cab7b48e Mon Sep 17 00:00:00 2001 From: Andrew Kane Date: Mon, 21 Apr 2025 23:19:16 -0700 Subject: [PATCH 2/2] Update lib/fiddle/ffi_backend.rb Co-authored-by: Sutou Kouhei --- lib/fiddle/ffi_backend.rb | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/fiddle/ffi_backend.rb b/lib/fiddle/ffi_backend.rb index e0d63bb9..fc1746fd 100644 --- a/lib/fiddle/ffi_backend.rb +++ b/lib/fiddle/ffi_backend.rb @@ -323,7 +323,13 @@ def initialize(addr, size = nil, free = nil) FFI::Pointer.new(Integer(addr)) end - @size = size ? size : (ptr.size_limit? ? ptr.size : 0) + if size + @size = size + elsif ptr.size_limit? + @size = ptr.size + else + @size = 0 + end @free = free @ffi_ptr = ptr @freed = false