diff options
author | Jemma Issroff <jemmaissroff@gmail.com> | 2022-12-15 13:42:24 -0500 |
---|---|---|
committer | Aaron Patterson <aaron.patterson@gmail.com> | 2022-12-15 13:41:47 -0800 |
commit | e9ba3042e13313944fd2695731d0d7498532b80f (patch) | |
tree | f4a9c06093de20ad0f2ce8971db8dcb9cba260ac | |
parent | c505448cdbd4cd1a52ed7108095f6738d29b3419 (diff) |
Indicate if a shape is too_complex in ObjectSpace#dump
Notes
Notes:
Merged: https://github.com/ruby/ruby/pull/6939
-rw-r--r-- | ext/objspace/objspace_dump.c | 9 | ||||
-rw-r--r-- | test/objspace/test_objspace.rb | 29 |
2 files changed, 34 insertions, 4 deletions
diff --git a/ext/objspace/objspace_dump.c b/ext/objspace/objspace_dump.c index 228ed2fa7c..c3cc9a1e7b 100644 --- a/ext/objspace/objspace_dump.c +++ b/ext/objspace/objspace_dump.c @@ -406,10 +406,8 @@ dump_object(VALUE obj, struct dump_config *dc) dump_append(dc, "\""); size_t shape_id = rb_shape_get_shape_id(obj); - if (shape_id) { - dump_append(dc, ", \"shape_id\":"); - dump_append_sizet(dc, shape_id); - } + dump_append(dc, ", \"shape_id\":"); + dump_append_sizet(dc, shape_id); dump_append(dc, ", \"slot_size\":"); dump_append_sizet(dc, dc->cur_page_slot_size); @@ -548,6 +546,9 @@ dump_object(VALUE obj, struct dump_config *dc) case T_OBJECT: dump_append(dc, ", \"ivars\":"); dump_append_lu(dc, ROBJECT_IV_COUNT(obj)); + if (rb_shape_obj_too_complex(obj)) { + dump_append(dc, ", \"too_complex_shape\":true"); + } break; case T_FILE: diff --git a/test/objspace/test_objspace.rb b/test/objspace/test_objspace.rb index 7eda077260..f0f294c31a 100644 --- a/test/objspace/test_objspace.rb +++ b/test/objspace/test_objspace.rb @@ -272,6 +272,35 @@ class TestObjSpace < Test::Unit::TestCase JSON.parse(info) if defined?(JSON) end + def test_dump_too_complex_shape + if defined?(RubyVM::Shape) + RubyVM::Shape::SHAPE_MAX_VARIATIONS.times do + Object.new.instance_variable_set(:"@a#{_1}", 1) + end + + tc = Object.new + tc.instance_variable_set(:@new_ivar, 1) + info = ObjectSpace.dump(tc) + assert_match(/"too_complex_shape":true/, info) + if defined?(JSON) + assert_true(JSON.parse(info)["too_complex_shape"]) + end + end + end + + class NotTooComplex ; end + + def test_dump_not_too_complex_shape + tc = NotTooComplex.new + tc.instance_variable_set(:@new_ivar, 1) + info = ObjectSpace.dump(tc) + + assert_not_match(/"too_complex_shape"/, info) + if defined?(JSON) + assert_nil(JSON.parse(info)["too_complex_shape"]) + end + end + def test_dump_to_default line = nil info = nil |