VM: refactoring to use the visit_object_array method

db4
Björn Lindqvist 2015-05-04 17:32:51 +02:00 committed by John Benediktsson
parent 0a6486ef78
commit a6e2834252
1 changed files with 12 additions and 19 deletions

View File

@ -100,18 +100,12 @@ template <typename TargetGeneration, typename Policy> struct collector {
void trace_partial_objects(cell start, cell card_start, cell card_end) {
object* obj = (object*)start;
cell end = start + obj->binary_payload_start();
if (card_start < end) {
start += sizeof(cell);
start += sizeof(cell);
start = std::max(start, card_start);
end = std::min(end, card_end);
start = std::max(start, card_start);
end = std::min(end, card_end);
cell* slot_ptr = (cell*)start;
cell* end_ptr = (cell*)end;
for (; slot_ptr < end_ptr; slot_ptr++)
visitor.visit_handle(slot_ptr);
}
visitor.visit_object_array((cell*)start, (cell*)end);
}
template <typename SourceGeneration>
@ -152,21 +146,20 @@ template <typename TargetGeneration, typename Policy> struct collector {
/* Address of last traced object. */
cell start = 0;
for (cell deck_index = first_deck; deck_index < last_deck; deck_index++) {
if (decks[deck_index] & mask) {
decks[deck_index] &= ~unmask;
for (cell di = first_deck; di < last_deck; di++) {
if (decks[di] & mask) {
decks[di] &= ~unmask;
decks_scanned++;
cell first_card = cards_per_deck * deck_index;
cell first_card = cards_per_deck * di;
cell last_card = first_card + cards_per_deck;
for (cell card_index = first_card; card_index < last_card;
card_index++) {
if (cards[card_index] & mask) {
cards[card_index] &= ~unmask;
for (cell ci = first_card; ci < last_card; ci++) {
if (cards[ci] & mask) {
cards[ci] &= ~unmask;
cards_scanned++;
start = trace_card(gen, card_index, start);
start = trace_card(gen, ci, start);
if (!start) {
/* At end of generation, no need to scan more cards. */
return;