ruby-changes:73901
From: Sutou <ko1@a...>
Date: Fri, 7 Oct 2022 15:21:00 +0900 (JST)
Subject: [ruby-changes:73901] 7c33141293 (master): [ruby/fiddle] test: ensure freeing closure
https://git.ruby-lang.org/ruby.git/commit/?id=7c33141293 From 7c3314129368fdfcf104e489f16538b531ed6d3d Mon Sep 17 00:00:00 2001 From: Sutou Kouhei <kou@c...> Date: Thu, 15 Sep 2022 06:38:52 +0900 Subject: [ruby/fiddle] test: ensure freeing closure GitHub: GH-102 This also improves freed closures assertions. https://github.com/ruby/fiddle/commit/f6431f3cf8 --- test/fiddle/test_closure.rb | 7 +++++-- 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 https://github.com/ruby/ruby/blob/trunk/test/fiddle/test_closure.rb#L10 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 https://github.com/ruby/ruby/blob/trunk/test/fiddle/test_func.rb#L60 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 -- cgit v1.2.1 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/