VM: simplification of the trace_partial_objects function
parent
a43a455990
commit
8e91ca3e31
|
@ -99,35 +99,34 @@ template <typename TargetGeneration, typename Policy> struct collector {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
inline cell first_card_in_deck(cell deck) {
|
cell first_card_in_deck(cell deck) {
|
||||||
return deck << (deck_bits - card_bits);
|
return deck << (deck_bits - card_bits);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline cell last_card_in_deck(cell deck) {
|
cell last_card_in_deck(cell deck) {
|
||||||
return first_card_in_deck(deck + 1);
|
return first_card_in_deck(deck + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline cell card_deck_for_address(cell a) {
|
cell card_deck_for_address(cell a) {
|
||||||
return addr_to_deck(a - data->start);
|
return addr_to_deck(a - data->start);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline cell card_start_address(cell card) {
|
cell card_start_address(cell card) {
|
||||||
return (card << card_bits) + data->start;
|
return (card << card_bits) + data->start;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline cell card_end_address(cell card) {
|
cell card_end_address(cell card) {
|
||||||
return ((card + 1) << card_bits) + data->start;
|
return ((card + 1) << card_bits) + data->start;
|
||||||
}
|
}
|
||||||
|
|
||||||
void trace_partial_objects(cell start, cell end, cell card_start,
|
void trace_partial_objects(cell start, cell card_start, cell card_end) {
|
||||||
cell card_end) {
|
object* obj = (object*)start;
|
||||||
|
cell end = start + obj->binary_payload_start();
|
||||||
if (card_start < end) {
|
if (card_start < end) {
|
||||||
start += sizeof(cell);
|
start += sizeof(cell);
|
||||||
|
|
||||||
if (start < card_start)
|
start = std::max(start, card_start);
|
||||||
start = card_start;
|
end = std::min(end, card_end);
|
||||||
if (end > card_end)
|
|
||||||
end = card_end;
|
|
||||||
|
|
||||||
cell* slot_ptr = (cell*)start;
|
cell* slot_ptr = (cell*)start;
|
||||||
cell* end_ptr = (cell*)end;
|
cell* end_ptr = (cell*)end;
|
||||||
|
@ -148,7 +147,6 @@ template <typename TargetGeneration, typename Policy> struct collector {
|
||||||
cell last_deck = card_deck_for_address(gen->end);
|
cell last_deck = card_deck_for_address(gen->end);
|
||||||
|
|
||||||
cell start = 0;
|
cell start = 0;
|
||||||
cell binary_start = 0;
|
|
||||||
cell end = 0;
|
cell end = 0;
|
||||||
|
|
||||||
for (cell deck_index = first_deck; deck_index < last_deck; deck_index++) {
|
for (cell deck_index = first_deck; deck_index < last_deck; deck_index++) {
|
||||||
|
@ -163,35 +161,34 @@ template <typename TargetGeneration, typename Policy> struct collector {
|
||||||
if (cards[card_index] & mask) {
|
if (cards[card_index] & mask) {
|
||||||
cards_scanned++;
|
cards_scanned++;
|
||||||
|
|
||||||
if (end < card_start_address(card_index)) {
|
cell start_addr = card_start_address(card_index);
|
||||||
|
cell end_addr = card_end_address(card_index);
|
||||||
|
|
||||||
|
if (end < start_addr) {
|
||||||
|
factor_print_p = true;
|
||||||
start = gen->starts
|
start = gen->starts
|
||||||
.find_object_containing_card(card_index - gen_start_card);
|
.find_object_containing_card(card_index - gen_start_card);
|
||||||
binary_start = start + ((object*)start)->binary_payload_start();
|
|
||||||
end = start + ((object*)start)->size();
|
end = start + ((object*)start)->size();
|
||||||
}
|
}
|
||||||
|
|
||||||
scan_next_object:
|
scan_next_object:
|
||||||
if (start < card_end_address(card_index)) {
|
if (start < end_addr) {
|
||||||
trace_partial_objects(start, binary_start,
|
trace_partial_objects(start, start_addr, end_addr);
|
||||||
card_start_address(card_index),
|
if (end < end_addr) {
|
||||||
card_end_address(card_index));
|
|
||||||
if (end < card_end_address(card_index)) {
|
|
||||||
start = gen->next_object_after(start);
|
start = gen->next_object_after(start);
|
||||||
if (start) {
|
if (start) {
|
||||||
binary_start =
|
|
||||||
start + ((object*)start)->binary_payload_start();
|
|
||||||
end = start + ((object*)start)->size();
|
end = start + ((object*)start)->size();
|
||||||
goto scan_next_object;
|
goto scan_next_object;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (!start) {
|
||||||
cards[card_index] &= ~unmask;
|
|
||||||
|
|
||||||
if (!start)
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
cards[card_index] &= ~unmask;
|
||||||
|
}
|
||||||
|
|
||||||
decks[deck_index] &= ~unmask;
|
decks[deck_index] &= ~unmask;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue