diff --git a/lib/fiddle/ffi_backend.rb b/lib/fiddle/ffi_backend.rb index 0c385510..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 + if size + @size = size + elsif ptr.size_limit? + @size = ptr.size + else + @size = 0 + end @free = free @ffi_ptr = ptr @freed = false @@ -413,6 +419,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 +494,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=