diff options
| author | Jean Boussier <jean.boussier@gmail.com> | 2024-11-03 09:27:59 +0100 |
|---|---|---|
| committer | Jean Boussier <jean.boussier@gmail.com> | 2024-11-05 18:00:36 +0100 |
| commit | ed22e6837941b429538cff5c8110b2caf2634474 (patch) | |
| tree | 5c086bcd4f9f867e0579a8a7c76fc54202efec93 /test | |
| parent | 241a03483c7eecfba008500df78716eb083d808b (diff) | |
[ruby/json] JSON::Ext::Parser mark the name cache entries when not on the heap
This is somewhat dead code as unless you are using `JSON::Parser.new`
direcltly we never allocate `JSON::Ext::Parser` anymore.
But still, we should mark all its reference in case some code out there
uses that.
Followup: #675
https://github.com/ruby/json/commit/8bf74a977b
Notes
Notes:
Merged: https://github.com/ruby/ruby/pull/12003
Diffstat (limited to 'test')
| -rw-r--r-- | test/json/json_ext_parser_test.rb | 20 | ||||
| -rw-r--r-- | test/json/test_helper.rb | 18 |
2 files changed, 38 insertions, 0 deletions
diff --git a/test/json/json_ext_parser_test.rb b/test/json/json_ext_parser_test.rb index ff6598f490..9db8ae772f 100644 --- a/test/json/json_ext_parser_test.rb +++ b/test/json/json_ext_parser_test.rb @@ -27,6 +27,26 @@ class JSONExtParserTest < Test::Unit::TestCase assert_equal "unexpected token at 'NaN'", ex.message end + if GC.respond_to?(:stress=) + def test_gc_stress_parser_new + payload = JSON.dump([{ foo: 1, bar: 2, baz: 3, egg: { spam: 4 } }] * 10) + + previous_stress = GC.stress + JSON::Parser.new(payload).parse + ensure + GC.stress = previous_stress + end + + def test_gc_stress + payload = JSON.dump([{ foo: 1, bar: 2, baz: 3, egg: { spam: 4 } }] * 10) + + previous_stress = GC.stress + JSON.parse(payload) + ensure + GC.stress = previous_stress + end + end + def parse(json) JSON::Ext::Parser.new(json).parse end diff --git a/test/json/test_helper.rb b/test/json/test_helper.rb index 7bff9b3391..6fcb76edf8 100644 --- a/test/json/test_helper.rb +++ b/test/json/test_helper.rb @@ -19,6 +19,24 @@ begin rescue LoadError end +if GC.respond_to?(:verify_compaction_references) + # This method was added in Ruby 3.0.0. Calling it this way asks the GC to + # move objects around, helping to find object movement bugs. + begin + GC.verify_compaction_references(double_heap: true, toward: :empty) + rescue NotImplementedError + # Some platforms don't support compaction + end +end + +if GC.respond_to?(:auto_compact=) + begin + GC.auto_compact = true + rescue NotImplementedError + # Some platforms don't support compaction + end +end + unless defined?(Test::Unit::CoreAssertions) require "core_assertions" Test::Unit::TestCase.include Test::Unit::CoreAssertions |
