inline void factorvm::do_slots(cell obj, void (* iter)(cell *,factorvm*)) { cell scan = obj; cell payload_start = binary_payload_start((object *)obj); cell end = obj + payload_start; scan += sizeof(cell); while(scan < end) { iter((cell *)scan,this); scan += sizeof(cell); } }
/* Every object has a regular representation in the runtime, which makes GC much simpler. Every slot of the object until binary_payload_start is a pointer to some other object. */ inline static void do_slots(cell obj, void (* iter)(cell *)) { cell scan = obj; cell payload_start = binary_payload_start((object *)obj); cell end = obj + payload_start; scan += sizeof(cell); while(scan < end) { iter((cell *)scan); scan += sizeof(cell); } }
inline cell object::binary_payload_start() const { return binary_payload_start(no_fixup()); }