summaryrefslogtreecommitdiff
path: root/test/bigdecimal/test_bigdecimal.rb
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-05-27 08:02:28 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2015-05-27 08:02:28 +0000
commitbdf07741f3c9e2aa522026ca116d55f257013c41 (patch)
tree070f03193ada1f335cd8bc5870a929aa9f5242a3 /test/bigdecimal/test_bigdecimal.rb
parent2df5bb9ac14426a707a05d61db1b5ce8dd0fd52d (diff)
bigdecimal.c: wrapper object before alloc
* ext/bigdecimal/bigdecimal.c (VpNewRbClass): make wrapper object before result structs allocation and manage refcount for each elements to get rid of potential memory leak. * ext/bigdecimal/bigdecimal.c (BigDecimal_global_new): ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@50650 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'test/bigdecimal/test_bigdecimal.rb')
-rw-r--r--test/bigdecimal/test_bigdecimal.rb27
1 files changed, 27 insertions, 0 deletions
diff --git a/test/bigdecimal/test_bigdecimal.rb b/test/bigdecimal/test_bigdecimal.rb
index 042d11da0f..ad48d70799 100644
--- a/test/bigdecimal/test_bigdecimal.rb
+++ b/test/bigdecimal/test_bigdecimal.rb
@@ -1552,4 +1552,31 @@ class TestBigDecimal < Test::Unit::TestCase
Thread.current.keys.to_s
EOS
end
+
+ def assert_no_memory_leak(code, *rest, **opt)
+ code = "5.times {1_000.times {begin #{code}; rescue NoMemoryError; end; GC.start}} if b"
+ super(["-rbigdecimal"],
+ "b = BigDecimal('10'); b.nil?; " \
+ "GC.add_stress_to_class(BigDecimal); "\
+ "#{code}", code, *rest, rss: true, **opt)
+ end
+
+ if EnvUtil.gc_stress_to_class?
+ def test_no_memory_leak_allocate
+ assert_no_memory_leak("BigDecimal.allocate")
+ end
+
+ def test_no_memory_leak_initialize
+ assert_no_memory_leak("BigDecimal.new")
+ end
+
+ def test_no_memory_leak_global_new
+ assert_no_memory_leak("BigDecimal('10')")
+ assert_no_memory_leak("BigDecimal(b)")
+ end
+
+ def test_no_memory_leak_create
+ assert_no_memory_leak("b + 10")
+ end
+ end
end