[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]