mirror of
https://github.com/ruby/ruby.git
synced 2025-08-28 07:26:00 +02:00
[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.
02915f13de
This commit is contained in:
parent
c991085176
commit
d2ec0e8039
1 changed files with 67 additions and 47 deletions
|
@ -34,6 +34,7 @@ module Fiddle
|
||||||
str = Marshal.load(Marshal.dump("hello world"))
|
str = Marshal.load(Marshal.dump("hello world"))
|
||||||
ptr = Pointer[str]
|
ptr = Pointer[str]
|
||||||
mview = MemoryView.new(ptr)
|
mview = MemoryView.new(ptr)
|
||||||
|
begin
|
||||||
assert_same(ptr, mview.obj)
|
assert_same(ptr, mview.obj)
|
||||||
assert_equal(str.bytesize, mview.byte_size)
|
assert_equal(str.bytesize, mview.byte_size)
|
||||||
assert_equal(true, mview.readonly?)
|
assert_equal(true, mview.readonly?)
|
||||||
|
@ -46,6 +47,9 @@ module Fiddle
|
||||||
|
|
||||||
codes = str.codepoints
|
codes = str.codepoints
|
||||||
assert_equal(codes, (0...str.bytesize).map {|i| mview[i] })
|
assert_equal(codes, (0...str.bytesize).map {|i| mview[i] })
|
||||||
|
ensure
|
||||||
|
mview.release
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_memory_view_multi_dimensional
|
def test_memory_view_multi_dimensional
|
||||||
|
@ -57,6 +61,7 @@ module Fiddle
|
||||||
shape = [3, 4]
|
shape = [3, 4]
|
||||||
md = MemoryViewTestUtils::MultiDimensionalView.new(buf, "l!", shape, nil)
|
md = MemoryViewTestUtils::MultiDimensionalView.new(buf, "l!", shape, nil)
|
||||||
mview = Fiddle::MemoryView.new(md)
|
mview = Fiddle::MemoryView.new(md)
|
||||||
|
begin
|
||||||
assert_equal(buf.bytesize, mview.byte_size)
|
assert_equal(buf.bytesize, mview.byte_size)
|
||||||
assert_equal("l!", mview.format)
|
assert_equal("l!", mview.format)
|
||||||
assert_equal(Fiddle::SIZEOF_LONG, mview.item_size)
|
assert_equal(Fiddle::SIZEOF_LONG, mview.item_size)
|
||||||
|
@ -68,6 +73,9 @@ module Fiddle
|
||||||
assert_equal(4, mview[0, 3])
|
assert_equal(4, mview[0, 3])
|
||||||
assert_equal(6, mview[1, 1])
|
assert_equal(6, mview[1, 1])
|
||||||
assert_equal(10, mview[2, 1])
|
assert_equal(10, mview[2, 1])
|
||||||
|
ensure
|
||||||
|
mview.release
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_memory_view_multi_dimensional_with_strides
|
def test_memory_view_multi_dimensional_with_strides
|
||||||
|
@ -79,6 +87,7 @@ module Fiddle
|
||||||
strides = [4*Fiddle::SIZEOF_LONG*2, Fiddle::SIZEOF_LONG*2]
|
strides = [4*Fiddle::SIZEOF_LONG*2, Fiddle::SIZEOF_LONG*2]
|
||||||
md = MemoryViewTestUtils::MultiDimensionalView.new(buf, "l!", shape, strides)
|
md = MemoryViewTestUtils::MultiDimensionalView.new(buf, "l!", shape, strides)
|
||||||
mview = Fiddle::MemoryView.new(md)
|
mview = Fiddle::MemoryView.new(md)
|
||||||
|
begin
|
||||||
assert_equal("l!", mview.format)
|
assert_equal("l!", mview.format)
|
||||||
assert_equal(Fiddle::SIZEOF_LONG, mview.item_size)
|
assert_equal(Fiddle::SIZEOF_LONG, mview.item_size)
|
||||||
assert_equal(buf.bytesize, mview.byte_size)
|
assert_equal(buf.bytesize, mview.byte_size)
|
||||||
|
@ -90,6 +99,9 @@ module Fiddle
|
||||||
assert_equal(5, mview[0, 2])
|
assert_equal(5, mview[0, 2])
|
||||||
assert_equal(9, mview[1, 0])
|
assert_equal(9, mview[1, 0])
|
||||||
assert_equal(15, mview[1, 3])
|
assert_equal(15, mview[1, 3])
|
||||||
|
ensure
|
||||||
|
mview.release
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_memory_view_multi_dimensional_with_multiple_members
|
def test_memory_view_multi_dimensional_with_multiple_members
|
||||||
|
@ -101,6 +113,7 @@ module Fiddle
|
||||||
strides = [4*Fiddle::SIZEOF_SHORT*2, Fiddle::SIZEOF_SHORT*2]
|
strides = [4*Fiddle::SIZEOF_SHORT*2, Fiddle::SIZEOF_SHORT*2]
|
||||||
md = MemoryViewTestUtils::MultiDimensionalView.new(buf, "ss", shape, strides)
|
md = MemoryViewTestUtils::MultiDimensionalView.new(buf, "ss", shape, strides)
|
||||||
mview = Fiddle::MemoryView.new(md)
|
mview = Fiddle::MemoryView.new(md)
|
||||||
|
begin
|
||||||
assert_equal("ss", mview.format)
|
assert_equal("ss", mview.format)
|
||||||
assert_equal(Fiddle::SIZEOF_SHORT*2, mview.item_size)
|
assert_equal(Fiddle::SIZEOF_SHORT*2, mview.item_size)
|
||||||
assert_equal(buf.bytesize, mview.byte_size)
|
assert_equal(buf.bytesize, mview.byte_size)
|
||||||
|
@ -112,6 +125,9 @@ module Fiddle
|
||||||
assert_equal([5, 6], mview[0, 2])
|
assert_equal([5, 6], mview[0, 2])
|
||||||
assert_equal([-1, -2], mview[1, 0])
|
assert_equal([-1, -2], mview[1, 0])
|
||||||
assert_equal([-7, -8], mview[1, 3])
|
assert_equal([-7, -8], mview[1, 3])
|
||||||
|
ensure
|
||||||
|
mview.release
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_export
|
def test_export
|
||||||
|
@ -135,9 +151,13 @@ module Fiddle
|
||||||
data = "\u{3042}"
|
data = "\u{3042}"
|
||||||
ptr = Pointer[data]
|
ptr = Pointer[data]
|
||||||
mview = MemoryView.new(ptr)
|
mview = MemoryView.new(ptr)
|
||||||
|
begin
|
||||||
string = mview.to_s
|
string = mview.to_s
|
||||||
assert_equal([data.b, true],
|
assert_equal([data.b, true],
|
||||||
[string, string.frozen?])
|
[string, string.frozen?])
|
||||||
|
ensure
|
||||||
|
mview.release
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue