VM: simplified logic in data_heap_checker

db4
Björn Lindqvist 2015-05-13 04:33:40 +02:00
parent 6dd2fe31b6
commit bf7161604e
1 changed files with 14 additions and 17 deletions

View File

@ -58,21 +58,17 @@ struct slot_checker {
} }
void operator()(cell* slot_ptr) { void operator()(cell* slot_ptr) {
if (!immediate_p(*slot_ptr)) { if (immediate_p(*slot_ptr))
generation target = generation_of(parent, untag<object>(*slot_ptr)); return;
switch (gen) {
case nursery_generation: generation target = generation_of(parent, untag<object>(*slot_ptr));
break; if (gen == aging_generation && target == nursery_generation) {
case aging_generation: check_write_barrier(slot_ptr, target, card_points_to_nursery);
if (target == nursery_generation) } else if (gen == tenured_generation) {
check_write_barrier(slot_ptr, target, card_points_to_nursery); if (target == nursery_generation) {
break; check_write_barrier(slot_ptr, target, card_points_to_nursery);
case tenured_generation: } else if (target == aging_generation) {
if (target == nursery_generation) check_write_barrier(slot_ptr, target, card_points_to_aging);
check_write_barrier(slot_ptr, target, card_points_to_nursery);
else if (target == aging_generation)
check_write_barrier(slot_ptr, target, card_points_to_aging);
break;
} }
} }
} }
@ -81,10 +77,11 @@ struct slot_checker {
struct object_checker { struct object_checker {
factor_vm* parent; factor_vm* parent;
explicit object_checker(factor_vm* parent) : parent(parent) {} object_checker(factor_vm* parent) : parent(parent) {}
void operator()(object* obj) { void operator()(object* obj) {
slot_checker checker(parent, obj, generation_of(parent, obj)); generation obj_gen = generation_of(parent, obj);
slot_checker checker(parent, obj, obj_gen);
obj->each_slot(checker); obj->each_slot(checker);
} }
}; };