From b4efa4b7005efee484e61fbc6af9c652fee36db2 Mon Sep 17 00:00:00 2001 From: Peter Zhu Date: Sun, 24 Dec 2023 21:26:37 -0500 Subject: Don't copy RUBY_FL_PROMOTED flag in rb_obj_setup RUBY_FL_PROMOTED is used by the garbage collector to track when an object becomes promoted to the old generation. rb_obj_setup must not copy that flag over because then it may become out-of-sync with the age of the object. This fixes a bug in Method#clone where the cloned Method object may get RUBY_FL_PROMOTED incorrectly set. --- object.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'object.c') 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; } -- cgit v1.2.3