diff options
author | Sutou Kouhei <[email protected]> | 2024-09-28 21:23:36 +0900 |
---|---|---|
committer | Hiroshi SHIBATA <[email protected]> | 2024-10-02 14:36:11 +0900 |
commit | d2ec0e8039ccb24af28570d4944db39050df817c (patch) | |
tree | 92696645ff58c2e04d5c13f593d37ddc152bdb87 /test | |
parent | c99108517655db33b45edd5d74e488e2f60dfe66 (diff) |
[ruby/fiddle] test memory-view: ensure releasing in test
It's for avoiding calling release on exit via GC. If it's happen, Ruby
will be crashed because Fiddle::MemoryView's finalizer may refer other
Ruby object. In exit phrase, the referred Ruby object may be already
freed.
https://github.com/ruby/fiddle/commit/02915f13de
Diffstat (limited to 'test')
-rw-r--r-- | test/fiddle/test_memory_view.rb | 114 |
1 files changed, 67 insertions, 47 deletions
diff --git a/test/fiddle/test_memory_view.rb b/test/fiddle/test_memory_view.rb index 240cda37df..d44c42d239 100644 --- a/test/fiddle/test_memory_view.rb +++ b/test/fiddle/test_memory_view.rb @@ -34,18 +34,22 @@ module Fiddle str = Marshal.load(Marshal.dump("hello world")) ptr = Pointer[str] mview = MemoryView.new(ptr) - assert_same(ptr, mview.obj) - assert_equal(str.bytesize, mview.byte_size) - assert_equal(true, mview.readonly?) - assert_equal(nil, mview.format) - assert_equal(1, mview.item_size) - assert_equal(1, mview.ndim) - assert_equal(nil, mview.shape) - assert_equal(nil, mview.strides) - assert_equal(nil, mview.sub_offsets) + begin + assert_same(ptr, mview.obj) + assert_equal(str.bytesize, mview.byte_size) + assert_equal(true, mview.readonly?) + assert_equal(nil, mview.format) + assert_equal(1, mview.item_size) + assert_equal(1, mview.ndim) + assert_equal(nil, mview.shape) + assert_equal(nil, mview.strides) + assert_equal(nil, mview.sub_offsets) - codes = str.codepoints - assert_equal(codes, (0...str.bytesize).map {|i| mview[i] }) + codes = str.codepoints + assert_equal(codes, (0...str.bytesize).map {|i| mview[i] }) + ensure + mview.release + end end def test_memory_view_multi_dimensional @@ -57,17 +61,21 @@ module Fiddle shape = [3, 4] md = MemoryViewTestUtils::MultiDimensionalView.new(buf, "l!", shape, nil) mview = Fiddle::MemoryView.new(md) - assert_equal(buf.bytesize, mview.byte_size) - assert_equal("l!", mview.format) - assert_equal(Fiddle::SIZEOF_LONG, mview.item_size) - assert_equal(2, mview.ndim) - assert_equal(shape, mview.shape) - assert_equal([Fiddle::SIZEOF_LONG*4, Fiddle::SIZEOF_LONG], mview.strides) - assert_equal(nil, mview.sub_offsets) - assert_equal(1, mview[0, 0]) - assert_equal(4, mview[0, 3]) - assert_equal(6, mview[1, 1]) - assert_equal(10, mview[2, 1]) + begin + assert_equal(buf.bytesize, mview.byte_size) + assert_equal("l!", mview.format) + assert_equal(Fiddle::SIZEOF_LONG, mview.item_size) + assert_equal(2, mview.ndim) + assert_equal(shape, mview.shape) + assert_equal([Fiddle::SIZEOF_LONG*4, Fiddle::SIZEOF_LONG], mview.strides) + assert_equal(nil, mview.sub_offsets) + assert_equal(1, mview[0, 0]) + assert_equal(4, mview[0, 3]) + assert_equal(6, mview[1, 1]) + assert_equal(10, mview[2, 1]) + ensure + mview.release + end end def test_memory_view_multi_dimensional_with_strides @@ -79,17 +87,21 @@ module Fiddle strides = [4*Fiddle::SIZEOF_LONG*2, Fiddle::SIZEOF_LONG*2] md = MemoryViewTestUtils::MultiDimensionalView.new(buf, "l!", shape, strides) mview = Fiddle::MemoryView.new(md) - assert_equal("l!", mview.format) - assert_equal(Fiddle::SIZEOF_LONG, mview.item_size) - assert_equal(buf.bytesize, mview.byte_size) - assert_equal(2, mview.ndim) - assert_equal(shape, mview.shape) - assert_equal(strides, mview.strides) - assert_equal(nil, mview.sub_offsets) - assert_equal(1, mview[0, 0]) - assert_equal(5, mview[0, 2]) - assert_equal(9, mview[1, 0]) - assert_equal(15, mview[1, 3]) + begin + assert_equal("l!", mview.format) + assert_equal(Fiddle::SIZEOF_LONG, mview.item_size) + assert_equal(buf.bytesize, mview.byte_size) + assert_equal(2, mview.ndim) + assert_equal(shape, mview.shape) + assert_equal(strides, mview.strides) + assert_equal(nil, mview.sub_offsets) + assert_equal(1, mview[0, 0]) + assert_equal(5, mview[0, 2]) + assert_equal(9, mview[1, 0]) + assert_equal(15, mview[1, 3]) + ensure + mview.release + end end def test_memory_view_multi_dimensional_with_multiple_members @@ -101,17 +113,21 @@ module Fiddle strides = [4*Fiddle::SIZEOF_SHORT*2, Fiddle::SIZEOF_SHORT*2] md = MemoryViewTestUtils::MultiDimensionalView.new(buf, "ss", shape, strides) mview = Fiddle::MemoryView.new(md) - assert_equal("ss", mview.format) - assert_equal(Fiddle::SIZEOF_SHORT*2, mview.item_size) - assert_equal(buf.bytesize, mview.byte_size) - assert_equal(2, mview.ndim) - assert_equal(shape, mview.shape) - assert_equal(strides, mview.strides) - assert_equal(nil, mview.sub_offsets) - assert_equal([1, 2], mview[0, 0]) - assert_equal([5, 6], mview[0, 2]) - assert_equal([-1, -2], mview[1, 0]) - assert_equal([-7, -8], mview[1, 3]) + begin + assert_equal("ss", mview.format) + assert_equal(Fiddle::SIZEOF_SHORT*2, mview.item_size) + assert_equal(buf.bytesize, mview.byte_size) + assert_equal(2, mview.ndim) + assert_equal(shape, mview.shape) + assert_equal(strides, mview.strides) + assert_equal(nil, mview.sub_offsets) + assert_equal([1, 2], mview[0, 0]) + assert_equal([5, 6], mview[0, 2]) + assert_equal([-1, -2], mview[1, 0]) + assert_equal([-7, -8], mview[1, 3]) + ensure + mview.release + end end def test_export @@ -135,9 +151,13 @@ module Fiddle data = "\u{3042}" ptr = Pointer[data] mview = MemoryView.new(ptr) - string = mview.to_s - assert_equal([data.b, true], - [string, string.frozen?]) + begin + string = mview.to_s + assert_equal([data.b, true], + [string, string.frozen?]) + ensure + mview.release + end end end end |