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) {
if (!immediate_p(*slot_ptr)) {
generation target = generation_of(parent, untag<object>(*slot_ptr));
switch (gen) {
case nursery_generation:
break;
case aging_generation:
if (target == nursery_generation)
check_write_barrier(slot_ptr, target, card_points_to_nursery);
break;
case tenured_generation:
if (target == nursery_generation)
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;
if (immediate_p(*slot_ptr))
return;
generation target = generation_of(parent, untag<object>(*slot_ptr));
if (gen == aging_generation && target == nursery_generation) {
check_write_barrier(slot_ptr, target, card_points_to_nursery);
} else if (gen == tenured_generation) {
if (target == nursery_generation) {
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);
}
}
}
@ -81,10 +77,11 @@ struct slot_checker {
struct object_checker {
factor_vm* parent;
explicit object_checker(factor_vm* parent) : parent(parent) {}
object_checker(factor_vm* parent) : parent(parent) {}
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);
}
};