diff options
-rw-r--r-- | test/fiddle/test_closure.rb | 7 | ||||
-rw-r--r-- | test/fiddle/test_func.rb | 36 |
2 files changed, 25 insertions, 18 deletions
diff --git a/test/fiddle/test_closure.rb b/test/fiddle/test_closure.rb index d248b9cbdd..1726db7a78 100644 --- a/test/fiddle/test_closure.rb +++ b/test/fiddle/test_closure.rb @@ -10,8 +10,11 @@ module Fiddle super # Ensure freeing all closures. # See https://github.com/ruby/fiddle/issues/102#issuecomment-1241763091 . - GC.start - assert_equal(0, ObjectSpace.each_object(Fiddle::Closure) {}) + not_freed_closures = [] + ObjectSpace.each_object(Fiddle::Closure) do |closure| + not_freed_closures << closure unless closure.freed? + end + assert_equal([], not_freed_closures) end def test_argument_errors diff --git a/test/fiddle/test_func.rb b/test/fiddle/test_func.rb index 45fed916ba..ff52f727d0 100644 --- a/test/fiddle/test_func.rb +++ b/test/fiddle/test_func.rb @@ -60,31 +60,35 @@ module Fiddle end def test_qsort1 - cb = Class.new(Closure) { + closure_class = Class.new(Closure) do def call(x, y) Pointer.new(x)[0] <=> Pointer.new(y)[0] end - }.new(TYPE_INT, [TYPE_VOIDP, TYPE_VOIDP]) + end - qsort = Function.new(@libc['qsort'], - [TYPE_VOIDP, TYPE_SIZE_T, TYPE_SIZE_T, TYPE_VOIDP], - TYPE_VOID) - buff = "9341" - qsort.call(buff, buff.size, 1, cb) - assert_equal("1349", buff) + closure_class.create(TYPE_INT, [TYPE_VOIDP, TYPE_VOIDP]) do |callback| + qsort = Function.new(@libc['qsort'], + [TYPE_VOIDP, TYPE_SIZE_T, TYPE_SIZE_T, TYPE_VOIDP], + TYPE_VOID) + buff = "9341" + qsort.call(buff, buff.size, 1, callback) + assert_equal("1349", buff) - bug4929 = '[ruby-core:37395]' - buff = "9341" - under_gc_stress do - qsort.call(buff, buff.size, 1, cb) + bug4929 = '[ruby-core:37395]' + buff = "9341" + under_gc_stress do + qsort.call(buff, buff.size, 1, callback) + end + assert_equal("1349", buff, bug4929) end - assert_equal("1349", buff, bug4929) ensure # Ensure freeing all closures. # See https://github.com/ruby/fiddle/issues/102#issuecomment-1241763091 . - cb = nil - GC.start - assert_equal(0, ObjectSpace.each_object(Fiddle::Closure) {}) + not_freed_closures = [] + ObjectSpace.each_object(Fiddle::Closure) do |closure| + not_freed_closures << closure unless closure.freed? + end + assert_equal([], not_freed_closures) end def test_snprintf |