static mps_res_t dylan_header_scan_weak(mps_ss_t mps_ss, mps_addr_t base, mps_addr_t limit) { mps_res_t res; while(base < limit) { mps_word_t header; header = (mps_word_t)*(int*)((char*)base - headerSIZE); switch(headerType(header)) { case realTYPE: assert(header == realHeader); break; case padTYPE: base = (mps_addr_t)((char*)base + headerPadSize(header)); continue; default: notreached(); break; } res = dylan_scan1_weak(mps_ss, &base); if(res) return res; base = AddHeader(base); } assert(base <= AddHeader(limit)); return MPS_RES_OK; }
static mps_res_t dylan_header_scan(mps_ss_t mps_ss, mps_addr_t base, mps_addr_t limit) { mps_res_t res; mps_addr_t p = base; while(p < limit) { mps_word_t header = (mps_word_t)*(int*)((char*)p - headerSIZE); switch(headerType(header)) { case realTYPE: assert(header == realHeader); break; case padTYPE: p = (mps_addr_t)((char*)p + headerPadSize(header)); continue; default: notreached(); break; } res = dylan_scan1(mps_ss, &p); if(res) return res; p = AddHeader(p); } assert(p <= AddHeader(limit)); return MPS_RES_OK; }
mps_res_t no_scan(mps_ss_t mps_ss, mps_addr_t base, mps_addr_t limit) { unused(mps_ss); unused(base); unused(limit); notreached(); return 0; }
static mps_addr_t dylan_header_skip(mps_addr_t object) { mps_addr_t *p; /* cursor in object */ mps_word_t header; header = (mps_word_t)*(int*)((char*)object - headerSIZE); switch(headerType(header)) { case realTYPE: assert(header == realHeader); break; case padTYPE: return (mps_addr_t)((char*)object + headerPadSize(header)); default: notreached(); break; } p = dylan_format->skip(object); p = AddHeader(p); return p; }
mps_addr_t no_skip(mps_addr_t object) { unused(object); notreached(); return 0; }