diff options
author | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2014-12-11 10:15:30 +0000 |
---|---|---|
committer | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2014-12-11 10:15:30 +0000 |
commit | 1b6aa03eb91c13a78d6a13158f04a5930fc9c3ef (patch) | |
tree | 26484e82c5e7f2e4d2130abd638baa29dae2183e /gc.c | |
parent | 3977132bbb31dd2439b5d7431ef3b2aebb795eeb (diff) | |
download | ruby-1b6aa03eb91c13a78d6a13158f04a5930fc9c3ef.tar.gz |
* class.c (class_alloc): Strat from age == 2.
Class and Module objects can be living long life.
* iseq.c: Same for ISeq objects.
* gc.c (RVALUE_AGE_RESET): added.
* gc.c (newobj_of): allow to generate (age != 0) objects.
* gc.c (rb_copy_wb_protected_attribute): reset age for wb unprotected
objects.
* include/ruby/ruby.h: add RUBY_TYPED_PROMOTED1 as an unrecommended
flag.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@48771 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'gc.c')
-rw-r--r-- | gc.c | 21 |
1 files changed, 17 insertions, 4 deletions
@@ -1152,13 +1152,17 @@ RVALUE_DEMOTE(rb_objspace_t *objspace, VALUE obj) } static inline void +RVALUE_AGE_RESET_RAW(VALUE obj) +{ + RBASIC(obj)->flags = RVALUE_FLAGS_AGE_SET(RBASIC(obj)->flags, 0); +} + +static inline void RVALUE_AGE_RESET(VALUE obj) { check_rvalue_consistency(obj); if (RGENGC_CHECK_MODE) assert(!RVALUE_OLD_P(obj)); - - RBASIC(obj)->flags = RVALUE_FLAGS_AGE_SET(RBASIC(obj)->flags, 0); - + RVALUE_AGE_RESET_RAW(obj); check_rvalue_consistency(obj); } @@ -1653,7 +1657,13 @@ newobj_of(VALUE klass, VALUE flags, VALUE v1, VALUE v2, VALUE v3) assert(RVALUE_MARKING(obj) == FALSE); assert(RVALUE_OLD_P(obj) == FALSE); assert(RVALUE_WB_UNPROTECTED(obj) == FALSE); - if (RVALUE_AGE(obj) > 0) rb_bug("newobj: %s of age (%d) > 0.", obj_info(obj), RVALUE_AGE(obj)); + + if (flags & FL_PROMOTED1) { + if (RVALUE_AGE(obj) != 2) rb_bug("newobj: %s of age (%d) != 2.", obj_info(obj), RVALUE_AGE(obj)); + } + else { + if (RVALUE_AGE(obj) > 0) rb_bug("newobj: %s of age (%d) > 0.", obj_info(obj), RVALUE_AGE(obj)); + } if (rgengc_remembered(objspace, (VALUE)obj)) rb_bug("newobj: %s is remembered.", obj_info(obj)); #endif @@ -5556,7 +5566,10 @@ rb_copy_wb_protected_attribute(VALUE dest, VALUE obj) #if USE_RGENGC if (RVALUE_WB_UNPROTECTED(obj)) { MARK_IN_BITMAP(GET_HEAP_WB_UNPROTECTED_BITS(dest), dest); + RVALUE_AGE_RESET_RAW(dest); } + + check_rvalue_consistency(dest); #endif } |