diff --git a/object.c b/object.c index 81d1ed6f6fac5c..cde1d7b1d6beed 100644 --- a/object.c +++ b/object.c @@ -119,7 +119,8 @@ rb_obj_reveal(VALUE obj, VALUE klass) VALUE rb_obj_setup(VALUE obj, VALUE klass, VALUE type) { - RBASIC(obj)->flags = type; + VALUE ignored_flags = RUBY_FL_PROMOTED; + RBASIC(obj)->flags = (type & ~ignored_flags) | (RBASIC(obj)->flags & ignored_flags); RBASIC_SET_CLASS(obj, klass); return obj; } diff --git a/test/ruby/test_method.rb b/test/ruby/test_method.rb index 9f34164a774ef8..b22dd9cbee51b4 100644 --- a/test/ruby/test_method.rb +++ b/test/ruby/test_method.rb @@ -450,6 +450,17 @@ def m.bar; :bar; end assert_equal(:bar, m.clone.bar) end + def test_clone_under_gc_compact_stress + EnvUtil.under_gc_compact_stress do + o = Object.new + def o.foo; :foo; end + m = o.method(:foo) + def m.bar; :bar; end + assert_equal(:foo, m.clone.call) + assert_equal(:bar, m.clone.bar) + end + end + def test_inspect o = Object.new def o.foo; end; line_no = __LINE__