Compute a length based on heap size instead of card table size.
The card from address computation checks that the argument is a valid
card. However, the limit points just past the end of the last card so
it is often invalid. This fixes a crash in asserts-enabled builds.
Change-Id: I5d7f0a4753703f82b2e1be520e6108d1b61b22d3
diff --git a/vm/alloc/CardTable.c b/vm/alloc/CardTable.c
index bbbb4ad..2de586e 100644
--- a/vm/alloc/CardTable.c
+++ b/vm/alloc/CardTable.c
@@ -179,8 +179,8 @@
moveCardsToModUnion((u1*)base[i], (u1*)limit[i]);
} else {
u1 *baseCard = dvmCardFromAddr((u1*)base[i]);
- u1 *limitCard = dvmCardFromAddr((u1*)limit[i]);
- memset(baseCard, GC_CARD_CLEAN, limitCard - baseCard);
+ size_t length = (limit[i] - base[i]) >> GC_CARD_SHIFT;
+ memset(baseCard, GC_CARD_CLEAN, length);
}
}
}