}
};
-/* A similar hack for the bignum implementation */
-struct gc_bignum {
- bignum** addr;
- factor_vm* parent;
-
- gc_bignum(bignum** addr, factor_vm* parent) : addr(addr), parent(parent) {
- /* Don't bother with variables holding NULL pointers. */
- if (*addr) {
- parent->check_data_pointer(*addr);
- parent->bignum_roots.push_back(addr);
- }
- }
-
- ~gc_bignum() {
- if (*addr) {
- FACTOR_ASSERT(parent->bignum_roots.back() == addr);
- parent->bignum_roots.pop_back();
- }
- }
-};
-
-#define GC_BIGNUM(x) gc_bignum x##__data_root(&x, this)
-
}
void visit_slots(object* ptr);
void visit_stack_elements(segment* region, cell* top);
void visit_data_roots();
- void visit_bignum_roots();
void visit_callback_roots();
void visit_literal_table_roots();
void visit_roots();
}
}
-template <typename Fixup> void slot_visitor<Fixup>::visit_bignum_roots() {
- std::vector<bignum**>::const_iterator iter =
- parent->bignum_roots.begin();
- std::vector<bignum**>::const_iterator end =
- parent->bignum_roots.end();
-
- for (; iter < end; iter++) {
- bignum** ref = *iter;
- *ref = (bignum*)fixup.fixup_data(*ref);
- }
-}
-
template <typename Fixup> struct callback_slot_visitor {
slot_visitor<Fixup>* visitor;
visit_handle(&parent->bignum_neg_one);
visit_data_roots();
- visit_bignum_roots();
visit_callback_roots();
visit_literal_table_roots();
visit_sample_callstacks();
themselves here. See data_roots.hpp and code_roots.hpp */
std::vector<cell*> data_roots;
- std::vector<bignum**> bignum_roots;
std::vector<code_root*> code_roots;
/* Debugger */