void Collector::markProtectedObjects() { for (int i = 0; i < ProtectedValues::_tableSize; i++) { ValueImp *val = ProtectedValues::_table[i].key; if (val && !val->marked()) { val->mark(); } } }
void ArrayInstanceImp::mark() { ObjectImp::mark(); unsigned l = storageLength; for (unsigned i = 0; i < l; ++i) { ValueImp *imp = storage[i]; if (imp && !imp->marked()) imp->mark(); } }
void Collector::markStackObjectsConservatively(void *start, void *end) { if (start > end) { void *tmp = start; start = end; end = tmp; } assert(((char *)end - (char *)start) < 0x1000000); assert(IS_POINTER_ALIGNED(start)); assert(IS_POINTER_ALIGNED(end)); char **p = (char **)start; char **e = (char **)end; while (p != e) { char *x = *p++; if (IS_POINTER_ALIGNED(x) && x) { bool good = false; for (int block = 0; block < heap.usedBlocks; block++) { size_t offset = x - (char *)heap.blocks[block]; const size_t lastCellOffset = sizeof(CollectorCell) * (CELLS_PER_BLOCK - 1); if (offset <= lastCellOffset && offset % sizeof(CollectorCell) == 0) { good = true; break; } } if (!good) { int n = heap.usedOversizeCells; for (int i = 0; i != n; i++) { if (x == (char *)heap.oversizeCells[i]) { good = true; break; } } } if (good && ((CollectorCell *)x)->u.freeCell.zeroIfFree != 0) { ValueImp *imp = (ValueImp *)x; if (!imp->marked()) imp->mark(); } } } }