commit 071fd2f00ef6e7990e8a69a1499840eb03574c34 Author: Eric Wong Date: Sat Mar 1 04:22:58 2014 +0000 bah diff --git a/.gdbinit b/.gdbinit index 17be7d8..da40f10 100644 --- a/.gdbinit +++ b/.gdbinit @@ -50,9 +50,6 @@ define rp end else set $flags = ((struct RBasic*)($arg0))->flags - if ($flags & RUBY_FL_PROMOTED) - printf "[PROMOTED] " - end if ($flags & RUBY_T_MASK) == RUBY_T_NONE printf "%sT_NONE%s: ", $color_type, $color_end print (struct RBasic *)($arg0) diff --git a/debug.c b/debug.c index 2f1e03c..dc5d935 100644 --- a/debug.c +++ b/debug.c @@ -34,7 +34,6 @@ const union { RUBY_ENC_CODERANGE_VALID = ENC_CODERANGE_VALID, RUBY_ENC_CODERANGE_BROKEN = ENC_CODERANGE_BROKEN, RUBY_FL_WB_PROTECTED = FL_WB_PROTECTED, - RUBY_FL_PROMOTED = FL_PROMOTED, RUBY_FL_FINALIZE = FL_FINALIZE, RUBY_FL_TAINT = FL_TAINT, RUBY_FL_EXIVAR = FL_EXIVAR, diff --git a/gc.c b/gc.c index 2df5682..bc4502c 100644 --- a/gc.c +++ b/gc.c @@ -577,6 +577,7 @@ struct heap_page { #if USE_RGENGC bits_t rememberset_bits[HEAP_BITMAP_LIMIT]; bits_t oldgen_bits[HEAP_BITMAP_LIMIT]; + bits_t promoted_bits[HEAP_BITMAP_LIMIT]; #endif }; @@ -586,6 +587,7 @@ struct heap_page { #define GET_HEAP_MARK_BITS(x) (&GET_HEAP_PAGE(x)->mark_bits[0]) #define GET_HEAP_REMEMBERSET_BITS(x) (&GET_HEAP_PAGE(x)->rememberset_bits[0]) #define GET_HEAP_OLDGEN_BITS(x) (&GET_HEAP_PAGE(x)->oldgen_bits[0]) +#define GET_HEAP_PROMOTED_BITS(x) (&GET_HEAP_PAGE(x)->promoted_bits[0]) #define NUM_IN_PAGE(p) (((bits_t)(p) & HEAP_ALIGN_MASK)/sizeof(RVALUE)) #define BITMAP_INDEX(p) (NUM_IN_PAGE(p) / BITS_BITLENGTH ) #define BITMAP_OFFSET(p) (NUM_IN_PAGE(p) & (BITS_BITLENGTH-1)) @@ -714,12 +716,63 @@ static void rgengc_rememberset_mark(rb_objspace_t *objspace, rb_heap_t *heap); static inline int is_pointer_to_heap(rb_objspace_t *objspace, void *ptr); static inline int gc_marked(rb_objspace_t *objspace, VALUE ptr); +static inline int +rb_promoted_test(VALUE obj) +{ + return MARKED_IN_BITMAP(GET_HEAP_PROMOTED_BITS(obj), obj); +} + +int +rb_promoted_p_internal(VALUE obj) +{ + if (is_pointer_to_heap(&rb_objspace, (void *)obj)) { + return rb_promoted_test(obj); + } + return 1; +} + +static inline void +rb_promoted_set(VALUE obj) +{ + MARK_IN_BITMAP(GET_HEAP_PROMOTED_BITS(obj), obj); +} + +static inline void +rb_promoted_clear(VALUE obj) +{ + CLEAR_IN_BITMAP(GET_HEAP_PROMOTED_BITS(obj), obj); +} + +static inline int +rb_promoted_test_checked(VALUE obj) +{ + if (RGENGC_CHECK_MODE && SPECIAL_CONST_P(obj)) + rb_bug("rb_promoted_test_checked: SPECIAL_CONST"); + return rb_promoted_test(obj); +} + +static inline void +rb_promoted_set_checked(VALUE obj) +{ + if (RGENGC_CHECK_MODE && SPECIAL_CONST_P(obj)) + rb_bug("rb_promoted_set_checked: SPECIAL_CONST"); + rb_promoted_set(obj); +} + +static inline void +rb_promoted_clear_checked(VALUE obj) +{ + if (RGENGC_CHECK_MODE && SPECIAL_CONST_P(obj)) + rb_bug("rb_promoted_clear_checked: SPECIAL_CONST"); + rb_promoted_clear(obj); +} + static inline VALUE check_gen_consistency(VALUE obj) { if (RGENGC_CHECK_MODE > 0) { int old_flag = RVALUE_OLDGEN_BITMAP(obj) != 0; - int promoted_flag = FL_TEST2(obj, FL_PROMOTED); + int promoted_flag = rb_promoted_test_checked(obj); rb_objspace_t *objspace = &rb_objspace; obj_memsize_of((VALUE)obj, FALSE); @@ -757,7 +810,7 @@ static inline VALUE RVALUE_INFANT_P(VALUE obj) { check_gen_consistency(obj); - return !FL_TEST2(obj, FL_PROMOTED); + return !rb_promoted_test_checked(obj); } static inline VALUE @@ -772,9 +825,9 @@ RVALUE_OLD_P(VALUE obj) { check_gen_consistency(obj); #if RGENGC_THREEGEN - return FL_TEST2(obj, FL_PROMOTED) && RVALUE_OLD_BITMAP_P(obj); + return rb_promoted_test_checked(obj) && RVALUE_OLD_BITMAP_P(obj); #else - return FL_TEST2(obj, FL_PROMOTED); + return rb_promoted_test_checked(obj); #endif } @@ -782,7 +835,7 @@ static inline VALUE RVALUE_PROMOTED_P(VALUE obj) { check_gen_consistency(obj); - return FL_TEST2(obj, FL_PROMOTED); + return rb_promoted_test_checked(obj); } static inline void @@ -790,7 +843,7 @@ RVALUE_PROMOTE_INFANT(VALUE obj) { check_gen_consistency(obj); if (RGENGC_CHECK_MODE && !RVALUE_INFANT_P(obj)) rb_bug("RVALUE_PROMOTE_INFANT: %p (%s) is not infant object.", (void *)obj, obj_type_name(obj)); - FL_SET2(obj, FL_PROMOTED); + rb_promoted_set_checked(obj); #if !RGENGC_THREEGEN MARK_IN_BITMAP(GET_HEAP_OLDGEN_BITS(obj), obj); #endif @@ -817,7 +870,7 @@ static inline VALUE RVALUE_YOUNG_P(VALUE obj) { check_gen_consistency(obj); - return FL_TEST2(obj, FL_PROMOTED) && (RVALUE_OLDGEN_BITMAP(obj) == 0); + return rb_promoted_test_checked(obj) && (RVALUE_OLDGEN_BITMAP(obj) == 0); } static inline void @@ -846,7 +899,7 @@ RVALUE_DEMOTE_FROM_YOUNG(VALUE obj) rb_bug("RVALUE_DEMOTE_FROM_YOUNG: %p (%s) is not young object.", (void *)obj, obj_type_name(obj)); check_gen_consistency(obj); - FL_UNSET2(obj, FL_PROMOTED); + rb_promoted_clear_checked(obj); check_gen_consistency(obj); } #endif @@ -858,7 +911,7 @@ RVALUE_DEMOTE_FROM_OLD(VALUE obj) rb_bug("RVALUE_DEMOTE_FROM_OLD: %p (%s) is not old object.", (void *)obj, obj_type_name(obj)); check_gen_consistency(obj); - FL_UNSET2(obj, FL_PROMOTED); + rb_promoted_clear_checked(obj); CLEAR_IN_BITMAP(GET_HEAP_OLDGEN_BITS(obj), obj); check_gen_consistency(obj); } diff --git a/include/ruby/ruby.h b/include/ruby/ruby.h index abd4b4b..6f24c83 100644 --- a/include/ruby/ruby.h +++ b/include/ruby/ruby.h @@ -1096,7 +1096,7 @@ struct RStruct { #define FL_SINGLETON FL_USER0 #define FL_WB_PROTECTED (((VALUE)1)<<5) -#define FL_PROMOTED (((VALUE)1)<<6) +#define FL_PERMANENT (((VALUE)1)<<6) #define FL_FINALIZE (((VALUE)1)<<7) #define FL_TAINT (((VALUE)1)<<8) #define FL_UNTRUSTED FL_TAINT @@ -1148,9 +1148,18 @@ struct RStruct { #define OBJ_FROZEN(x) (!!(FL_ABLE(x)?(RBASIC(x)->flags&(FL_FREEZE)):(FIXNUM_P(x)||FLONUM_P(x)||SYMBOL_P(x)))) #define OBJ_FREEZE(x) FL_SET((x), FL_FREEZE) +#define OBJ_PERMANENT(x) (!!FL_TEST((x), FL_PERMANENT)) #if USE_RGENGC -#define OBJ_PROMOTED(x) (SPECIAL_CONST_P(x) ? 0 : FL_TEST_RAW((x), FL_PROMOTED)) +int rb_promoted_p_internal(VALUE); /* should be internal, do not use directly */ +static inline int +rb_promoted_p(VALUE obj) +{ + /* if (OBJ_PERMANENT(obj)) return 0; */ + return rb_promoted_p_internal(obj); +} + +#define OBJ_PROMOTED(x) (SPECIAL_CONST_P(x) ? 0 : rb_promoted_p((x))) #define OBJ_WB_PROTECTED(x) (SPECIAL_CONST_P(x) ? 1 : FL_TEST_RAW((x), FL_WB_PROTECTED)) #define OBJ_WB_UNPROTECT(x) rb_obj_wb_unprotect(x, __FILE__, __LINE__) @@ -1196,7 +1205,7 @@ rb_obj_wb_unprotect(VALUE x, RB_UNUSED_VAR(const char *filename), RB_UNUSED_VAR( #if USE_RGENGC /* `x' should be an RVALUE object */ if (FL_TEST_RAW((x), FL_WB_PROTECTED)) { - if (FL_TEST_RAW((x), FL_PROMOTED)) { + if (rb_promoted_p(x)) { rb_gc_writebarrier_unprotect_promoted(x); } RBASIC(x)->flags &= ~FL_WB_PROTECTED; @@ -1214,7 +1223,7 @@ rb_obj_written(VALUE a, RB_UNUSED_VAR(VALUE oldv), VALUE b, RB_UNUSED_VAR(const #if USE_RGENGC /* `a' should be an RVALUE object */ - if (FL_TEST_RAW((a), FL_PROMOTED) && !SPECIAL_CONST_P(b)) { + if (rb_promoted_p(a) && !SPECIAL_CONST_P(b)) { rb_gc_writebarrier(a, b); } #endif diff --git a/load.c b/load.c index 811d035..dd90d39 100644 --- a/load.c +++ b/load.c @@ -204,7 +204,8 @@ features_index_add_single(VALUE short_feature, VALUE offset) feature_indexes[0] = this_feature_index; feature_indexes[1] = offset; this_feature_index = (VALUE)xcalloc(1, sizeof(struct RArray)); - RBASIC(this_feature_index)->flags = T_ARRAY; /* fake VALUE, do not mark/sweep */ + /* fake VALUE, do not mark/sweep */ + RBASIC(this_feature_index)->flags = T_ARRAY | FL_PERMANENT; rb_ary_cat(this_feature_index, feature_indexes, numberof(feature_indexes)); st_insert(features_index, (st_data_t)short_feature_cstr, (st_data_t)this_feature_index); } diff --git a/object.c b/object.c index 240b4f5..4208647 100644 --- a/object.c +++ b/object.c @@ -335,8 +335,8 @@ rb_obj_clone(VALUE obj) rb_raise(rb_eTypeError, "can't clone %s", rb_obj_classname(obj)); } clone = rb_obj_alloc(rb_obj_class(obj)); - RBASIC(clone)->flags &= (FL_TAINT|FL_PROMOTED|FL_WB_PROTECTED); - RBASIC(clone)->flags |= RBASIC(obj)->flags & ~(FL_PROMOTED|FL_FREEZE|FL_FINALIZE|FL_WB_PROTECTED); + RBASIC(clone)->flags &= (FL_TAINT|FL_WB_PROTECTED); + RBASIC(clone)->flags |= RBASIC(obj)->flags & ~(FL_FREEZE|FL_FINALIZE|FL_WB_PROTECTED); singleton = rb_singleton_class_clone_and_attach(obj, clone); RBASIC_SET_CLASS(clone, singleton); diff --git a/parse.y b/parse.y index 9b7869b..57306cf 100644 --- a/parse.y +++ b/parse.y @@ -10384,7 +10384,7 @@ static ID intern_str(VALUE str); static VALUE setup_fake_str(struct RString *fake_str, const char *name, long len) { - fake_str->basic.flags = T_STRING|RSTRING_NOEMBED; + fake_str->basic.flags = T_STRING|RSTRING_NOEMBED|FL_PERMANENT; RBASIC_SET_CLASS((VALUE)fake_str, rb_cString); fake_str->as.heap.len = len; fake_str->as.heap.ptr = (char *)name;