diff options
author | Sutou Kouhei <kou@clear-code.com> | 2022-09-15 06:38:52 +0900 |
---|---|---|
committer | Hiroshi SHIBATA <hsbt@ruby-lang.org> | 2022-10-07 15:18:52 +0900 |
commit | 7c3314129368fdfcf104e489f16538b531ed6d3d (patch) | |
tree | 8f9a99aad7fb038c7b61e588035e9945179e8eb8 | |
parent | 255e617bc38f714c943c932e7df2b709313fd6bf (diff) | |
download | ruby-7c3314129368fdfcf104e489f16538b531ed6d3d.tar.gz |
[ruby/fiddle] test: ensure freeing closure
GitHub: GH-102
This also improves freed closures assertions.
https://github.com/ruby/fiddle/commit/f6431f3cf8
-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 |