Index: vm/gc_gen/src/finalizer_weakref/finalizer_weakref.cpp =================================================================== --- vm/gc_gen/src/finalizer_weakref/finalizer_weakref.cpp (revision 590662) +++ vm/gc_gen/src/finalizer_weakref/finalizer_weakref.cpp (working copy) @@ -45,6 +45,10 @@ for(; !vector_block_iterator_end(block, iter); iter = vector_block_iterator_advance(block, iter)){ REF *p_ref = (REF*)iter; Partial_Reveal_Object *p_obj = read_slot(p_ref); + + assert( p_obj >= gc_heap_base_address() && p_obj < gc_heap_ceiling_address()); + assert(obj_get_vt_raw(p_obj)); + if(*p_ref && obj_need_move(gc, p_obj)) finref_repset_add_entry(gc, p_ref); } @@ -58,6 +62,8 @@ assert(IS_FALLBACK_COMPACTION); Partial_Reveal_Object *p_obj = read_slot(p_ref); + assert(obj_get_vt_raw(p_obj)); + if(obj_belongs_to_nos(p_obj) && obj_is_fw_in_oi(p_obj)){ assert(!obj_is_marked_in_vt(p_obj)); assert(obj_get_vt(p_obj) == obj_get_vt(obj_get_fw_in_oi(p_obj))); @@ -259,6 +265,9 @@ REF *p_ref = (REF*)iter; Partial_Reveal_Object *p_obj = read_slot(p_ref); assert(p_obj); + assert( p_obj >= gc_heap_base_address() && p_obj < gc_heap_ceiling_address()); + assert(obj_get_vt_raw(p_obj)); + REF *p_referent_field = obj_get_referent_field(p_obj); if(IS_FALLBACK_COMPACTION) fallback_update_fw_ref(p_referent_field); @@ -332,10 +341,14 @@ for(; !vector_block_iterator_end(block, iter); iter = vector_block_iterator_advance(block, iter)){ Partial_Reveal_Object **p_ref = (Partial_Reveal_Object **)iter; Partial_Reveal_Object *p_obj = read_slot((REF*)p_ref); + assert(p_obj); + assert( p_obj >= gc_heap_base_address() && p_obj < gc_heap_ceiling_address()); + assert(obj_get_vt_raw(p_obj)); + REF *p_referent_field = obj_get_referent_field(p_obj); if(IS_FALLBACK_COMPACTION) - fallback_update_fw_ref(p_referent_field); + fallback_update_fw_ref(p_referent_field); Partial_Reveal_Object *p_referent = read_slot(p_referent_field); if(!p_referent){ // referent field has been cleared @@ -720,6 +733,8 @@ else p_ref = (REF*)iter; p_obj = read_slot(p_ref); + assert(obj_get_vt_raw(p_obj)); + if(IS_MOVE_COMPACT){ move_compaction_update_ref(gc, p_ref); Index: vm/gc_gen/src/finalizer_weakref/finalizer_weakref_metadata.cpp =================================================================== --- vm/gc_gen/src/finalizer_weakref/finalizer_weakref_metadata.cpp (revision 590662) +++ vm/gc_gen/src/finalizer_weakref/finalizer_weakref_metadata.cpp (working copy) @@ -297,6 +297,7 @@ { GC *gc = mutator->gc; Finref_Metadata *metadata = gc->finref_metadata; + assert(obj_get_vt_raw(p_obj)); mutator->obj_with_fin = finref_metadata_add_entry(gc, mutator->obj_with_fin, metadata->obj_with_fin_pool, (POINTER_SIZE_INT)obj_ptr_to_ref(p_obj)); } @@ -304,12 +305,14 @@ Vector_Block *gc_add_finalizer(GC *gc, Vector_Block *vector_block_in_use, Partial_Reveal_Object *p_obj) { Finref_Metadata *metadata = gc->finref_metadata; + assert(obj_get_vt_raw(p_obj)); return finref_metadata_add_entry(gc, vector_block_in_use, metadata->obj_with_fin_pool, (POINTER_SIZE_INT)obj_ptr_to_ref(p_obj)); } void gc_add_finalizable_obj(GC *gc, Partial_Reveal_Object *p_obj) { Finref_Metadata *metadata = gc->finref_metadata; + assert(obj_get_vt_raw(p_obj)); metadata->finalizable_obj_set = finref_metadata_add_entry(gc, metadata->finalizable_obj_set, metadata->finalizable_obj_pool, (POINTER_SIZE_INT)obj_ptr_to_ref(p_obj)); } @@ -317,6 +320,7 @@ { GC *gc = collector->gc; Finref_Metadata *metadata = gc->finref_metadata; + assert(obj_get_vt_raw(ref)); collector->softref_set = finref_metadata_add_entry(gc, collector->softref_set, metadata->softref_pool, (POINTER_SIZE_INT)obj_ptr_to_ref(ref)); } @@ -324,6 +328,7 @@ { GC *gc = collector->gc; Finref_Metadata *metadata = gc->finref_metadata; + assert(obj_get_vt_raw(ref)); collector->weakref_set = finref_metadata_add_entry(gc, collector->weakref_set, metadata->weakref_pool, (POINTER_SIZE_INT)obj_ptr_to_ref(ref)); } @@ -331,6 +336,7 @@ { GC *gc = collector->gc; Finref_Metadata *metadata = gc->finref_metadata; + assert(obj_get_vt_raw(ref)); collector->phanref_set = finref_metadata_add_entry(gc, collector->phanref_set, metadata->phanref_pool, (POINTER_SIZE_INT)obj_ptr_to_ref(ref)); } @@ -338,6 +344,7 @@ { assert(*p_ref); assert(read_slot(p_ref)); + assert(obj_get_vt_raw(read_slot(p_ref))); Finref_Metadata *metadata = gc->finref_metadata; metadata->repset = finref_metadata_add_entry(gc, metadata->repset, metadata->repset_pool, (POINTER_SIZE_INT)p_ref); } @@ -346,6 +353,7 @@ Vector_Block *finref_add_fallback_ref(GC *gc, Vector_Block *vector_block_in_use, Partial_Reveal_Object *p_obj) { assert(p_obj); + assert(obj_get_vt_raw(p_obj)); Finref_Metadata *metadata = gc->finref_metadata; return finref_metadata_add_entry(gc, vector_block_in_use, metadata->fallback_ref_pool, (POINTER_SIZE_INT)obj_ptr_to_ref(p_obj)); } Index: vm/gc_gen/src/common/gc_metadata.h =================================================================== --- vm/gc_gen/src/common/gc_metadata.h (revision 590662) +++ vm/gc_gen/src/common/gc_metadata.h (working copy) @@ -155,7 +155,8 @@ inline void collector_repset_add_entry(Collector* collector, Partial_Reveal_Object** p_ref) { -// assert( p_ref >= gc_heap_base_address() && p_ref < gc_heap_ceiling_address()); + assert( *p_ref >= gc_heap_base_address() && *p_ref < gc_heap_ceiling_address()); + assert(obj_get_vt_raw(*p_ref)); Vector_Block* root_set = collector->rep_set; vector_block_add_entry(root_set, (POINTER_SIZE_INT)p_ref); Index: vm/gc_gen/src/common/weak_roots.cpp =================================================================== --- vm/gc_gen/src/common/weak_roots.cpp (revision 590662) +++ vm/gc_gen/src/common/weak_roots.cpp (working copy) @@ -66,6 +66,10 @@ continue; } + assert( p_obj >= gc_heap_base_address() && p_obj < gc_heap_ceiling_address()); + assert(obj_get_vt_raw(p_obj)); + + if(obj_need_move(gc, p_obj)) { if(!IS_MOVE_COMPACT){ assert((POINTER_SIZE_INT)obj_get_fw_in_oi(p_obj) > DUAL_MARKBITS);