From d19d683a354530a27b4cbb049223f8dc70c75849 Mon Sep 17 00:00:00 2001 From: Jean Boussier Date: Fri, 9 Feb 2024 13:54:06 +0100 Subject: [PATCH] rb_obj_setup: do not copy RUBY_FL_SEEN_OBJ_ID [Bug #20250] We're seting up a new instance, so it never had an associated object_id. --- object.c | 2 +- test/ruby/test_clone.rb | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/object.c b/object.c index a0783e9ef7..26ced2c8d8 100644 --- a/object.c +++ b/object.c @@ -120,7 +120,7 @@ rb_obj_reveal(VALUE obj, VALUE klass) VALUE rb_obj_setup(VALUE obj, VALUE klass, VALUE type) { - VALUE ignored_flags = RUBY_FL_PROMOTED; + VALUE ignored_flags = RUBY_FL_PROMOTED | RUBY_FL_SEEN_OBJ_ID; RBASIC(obj)->flags = (type & ~ignored_flags) | (RBASIC(obj)->flags & ignored_flags); RBASIC_SET_CLASS(obj, klass); return obj; diff --git a/test/ruby/test_clone.rb b/test/ruby/test_clone.rb index 216eaa39d2..775c9ed848 100644 --- a/test/ruby/test_clone.rb +++ b/test/ruby/test_clone.rb @@ -73,6 +73,13 @@ class TestClone < Test::Unit::TestCase assert_equal(cloned_obj.instance_variable_get(:@a), 1) end + def test_proc_obj_id_flag_reset + # [Bug #20250] + proc = Proc.new { } + proc.object_id + proc.clone.object_id # Would crash with RUBY_DEBUG=1 + end + def test_user_flags assert_separately([], <<-EOS) #