static PN_SIZE pngc_mark_array(Potion *P, register _PN *x, register long n, int forward) { _PN v; PN_SIZE i = 0; struct PNMemory *M = P->mem; while (n--) { v = *x; if (IS_GC_PROTECTED(v) || IN_BIRTH_REGION(v) || IN_OLDER_REGION(v)) { v = potion_fwd(v); switch (forward) { case 0: // count only if (!IS_GC_PROTECTED(v) && IN_BIRTH_REGION(v) && HAS_REAL_TYPE(v)) i++; break; case 1: // minor if (!IS_GC_PROTECTED(v) && IN_BIRTH_REGION(v) && HAS_REAL_TYPE(v)) { GC_FORWARD(x, v); i++; } break; case 2: // major if (!IS_GC_PROTECTED(v) && (IN_BIRTH_REGION(v) || IN_OLDER_REGION(v)) && HAS_REAL_TYPE(v)) { GC_FORWARD(x, v); i++; } break; } } x++; } return i; }
ATTRIBUTE_NO_ADDRESS_SAFETY_ANALYSIS static PN_SIZE pngc_mark_array(Potion *P, register _PN *x, register long n, int type) { _PN v; PN_SIZE i = 0; struct PNMemory *M = P->mem; while (n--) { v = *x; if (IS_GC_PROTECTED(v) || IN_BIRTH_REGION(v) || IN_OLDER_REGION(v)) { v = potion_fwd(v); switch (type) { case 0: // count only if (!IS_GC_PROTECTED(v) && IN_BIRTH_REGION(v) && HAS_REAL_TYPE(v)) { i++; DBG_Gv(P,"GC mark count only %p %6x\n", x, PN_TYPE(*x)); } break; case 1: // minor if (!IS_GC_PROTECTED(v) && IN_BIRTH_REGION(v) && HAS_REAL_TYPE(v)) { GC_FORWARD(x, v); i++; DBG_Gv(P,"GC mark minor %p -> 0x%lx %6x\n", x, v, PN_TYPE(*x)); } break; case 2: // major if (!IS_GC_PROTECTED(v) && (IN_BIRTH_REGION(v) || IN_OLDER_REGION(v)) && HAS_REAL_TYPE(v)) { GC_FORWARD(x, v); i++; DBG_Gv(P,"GC mark major %p -> 0x%lx %6x\n", x, v, PN_TYPE(*x)); } break; } } x++; } return i; }