From b0112953006daa04fca65a922a5da1bf36533630 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Thu, 5 Nov 2009 23:53:53 -0600 Subject: [PATCH] vm: fix 'become' when aging space is empty --- vm/bitwise_hacks.hpp | 12 ++++++------ vm/collector.hpp | 22 +++++++++------------- vm/nursery_collector.cpp | 9 ++++++--- 3 files changed, 21 insertions(+), 22 deletions(-) diff --git a/vm/bitwise_hacks.hpp b/vm/bitwise_hacks.hpp index 8830e4f876..03a6ea5ad0 100644 --- a/vm/bitwise_hacks.hpp +++ b/vm/bitwise_hacks.hpp @@ -38,13 +38,13 @@ inline cell log2(cell x) #else cell n = 0; #ifdef FACTOR_64 - if (x >= (u64)1 << 32) { x >>= 32; n += 32; } + if (x >= (cell)1 << 32) { x >>= 32; n += 32; } #endif - if (x >= (u32)1 << 16) { x >>= 16; n += 16; } - if (x >= (u32)1 << 8) { x >>= 8; n += 8; } - if (x >= (u32)1 << 4) { x >>= 4; n += 4; } - if (x >= (u32)1 << 2) { x >>= 2; n += 2; } - if (x >= (u32)1 << 1) { n += 1; } + if (x >= (cell)1 << 16) { x >>= 16; n += 16; } + if (x >= (cell)1 << 8) { x >>= 8; n += 8; } + if (x >= (cell)1 << 4) { x >>= 4; n += 4; } + if (x >= (cell)1 << 2) { x >>= 2; n += 2; } + if (x >= (cell)1 << 1) { n += 1; } #endif return n; } diff --git a/vm/collector.hpp b/vm/collector.hpp index 29711aeb9c..9b3faaf31f 100644 --- a/vm/collector.hpp +++ b/vm/collector.hpp @@ -196,14 +196,14 @@ template struct collector { { card_deck *decks = data->decks; card_deck *cards = data->cards; - + cell gen_start_card = addr_to_card(gen->start - data->start); cell first_deck = card_deck_for_address(gen->start); cell last_deck = card_deck_for_address(gen->end); - + cell start = 0, binary_start = 0, end = 0; - + for(cell deck_index = first_deck; deck_index < last_deck; deck_index++) { if(decks[deck_index] & mask) @@ -212,7 +212,7 @@ template struct collector { cell first_card = first_card_in_deck(deck_index); cell last_card = last_card_in_deck(deck_index); - + for(cell card_index = first_card; card_index < last_card; card_index++) { if(cards[card_index] & mask) @@ -225,13 +225,9 @@ template struct collector { binary_start = start + ((object *)start)->binary_payload_start(); end = start + ((object *)start)->size(); } - -#ifdef FACTOR_DEBUG - assert(addr_to_card(start - data->start) <= card_index); - assert(start < card_end_address(card_index)); -#endif -scan_next_object: { +scan_next_object: if(start < card_end_address(card_index)) + { trace_partial_objects( start, binary_start, @@ -248,13 +244,13 @@ scan_next_object: { } } } - + unmarker(&cards[card_index]); - + if(!start) return; } } - + unmarker(&decks[deck_index]); } } diff --git a/vm/nursery_collector.cpp b/vm/nursery_collector.cpp index 155da243d4..5eb77fd763 100644 --- a/vm/nursery_collector.cpp +++ b/vm/nursery_collector.cpp @@ -22,9 +22,12 @@ void factor_vm::collect_nursery() collector.trace_cards(data->tenured, card_points_to_nursery, simple_unmarker(card_points_to_nursery)); - collector.trace_cards(data->aging, - card_points_to_nursery, - full_unmarker()); + if(data->aging->here != data->aging->start) + { + collector.trace_cards(data->aging, + card_points_to_nursery, + full_unmarker()); + } current_gc->event->ended_card_scan(collector.cards_scanned,collector.decks_scanned); current_gc->event->started_code_scan();