summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--object.c3
-rw-r--r--test/ruby/test_method.rb11
2 files changed, 13 insertions, 1 deletions
diff --git a/object.c b/object.c
index 81d1ed6f6f..cde1d7b1d6 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 9f34164a77..b22dd9cbee 100644
--- a/test/ruby/test_method.rb
+++ b/test/ruby/test_method.rb
@@ -450,6 +450,17 @@ class TestMethod < Test::Unit::TestCase
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__