From 94040b2a7547200ed31fd0207b0a91c8ad14aaf9 Mon Sep 17 00:00:00 2001 From: ko1 Date: Wed, 24 Jun 2015 18:38:36 +0000 Subject: * gc.c (RGENGC_OBJ_INFO, obj_info): add a macro to enable/disable rich obj_info() output. At the default, the value of RGENGC_OBJ_INFO is (RGENGC_DEBUG | RGENGC_CHECK_MODE). * gc.c (RGENGC_OBJ_INFO): force enable it to debug #11244. * gc.c (gc_mark_ptr): print more details with obj_info(). * gc.c (gc_mark_children): remove useless debug prints. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@51018 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- gc.c | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) (limited to 'gc.c') diff --git a/gc.c b/gc.c index d5719fe7b1..d0def041c5 100644 --- a/gc.c +++ b/gc.c @@ -305,6 +305,12 @@ static ruby_gc_params_t gc_params = { #define GC_DEBUG_STRESS_TO_CLASS 0 #endif +#define RGENGC_OBJ_INFO 1 + +#ifndef RGENGC_OBJ_INFO +#define RGENGC_OBJ_INFO (RGENGC_DEBUG | RGENGC_CHECK_MODE) +#endif + typedef enum { GPR_FLAG_NONE = 0x000, /* major reason */ @@ -4192,11 +4198,18 @@ static void gc_mark_ptr(rb_objspace_t *objspace, VALUE obj) { if (LIKELY(objspace->mark_func_data == NULL)) { - rgengc_check_relation(objspace, obj); - /* check code for Bug #11244 */ - if (BUILTIN_TYPE(obj) == T_NONE) rb_bug("gc_mark_ptr: obj is T_NONE"); + if (BUILTIN_TYPE(obj) == T_NONE) { + if (objspace->rgengc.parent_object) { + rb_bug("gc_mark_ptr: obj is %s (parent: %s)", obj_info(obj), + obj_info(objspace->rgengc.parent_object)); + } + else { + rb_bug("gc_mark_ptr: obj is %s (parent is not old)", obj_info(obj)); + } + } + rgengc_check_relation(objspace, obj); if (!gc_mark_set(objspace, obj)) return; /* already marked */ gc_aging(objspace, obj); gc_grey(objspace, obj); @@ -4304,10 +4317,6 @@ gc_mark_children(rb_objspace_t *objspace, VALUE obj) if (!RCLASS_EXT(obj)) break; mark_tbl(objspace, RCLASS_IV_TBL(obj)); mark_const_tbl(objspace, RCLASS_CONST_TBL(obj)); - - /* TODO: remove it. check code for Bug #11244 */ - if (RB_TYPE_P(RCLASS_SUPER(obj), T_NONE)) rb_bug("gc_mark_children: super is T_NONE (%s)", obj_info(obj)); - gc_mark(objspace, RCLASS_SUPER((VALUE)obj)); break; @@ -8828,7 +8837,7 @@ obj_type_name(VALUE obj) return type_name(TYPE(obj), obj); } -#if RGENGC_DEBUG || RGENGC_CHECK_MODE +#if RGENGC_OBJ_INFO #define OBJ_INFO_BUFFERS_NUM 10 #define OBJ_INFO_BUFFERS_SIZE 0x100 static int obj_info_buffers_index = 0; -- cgit v1.2.3