namespace factor { template struct data_root : public tagged { factor_vm* parent; void push() { parent->data_roots.push_back(data_root_range(&this->value_, 1)); } data_root(cell value_, factor_vm* parent_) : tagged(value_), parent(parent_) { push(); } data_root(Type* value_, factor_vm* parent_) : tagged(value_), parent(parent_) { push(); } const data_root& operator=(const Type* x) { tagged::operator=(x); return *this; } const data_root& operator=(const cell& x) { tagged::operator=(x); return *this; } ~data_root() { parent->data_roots.pop_back(); } }; /* 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_) { if (*addr_) parent->check_data_pointer(*addr_); parent->bignum_roots.push_back((cell) addr); } ~gc_bignum() { #ifdef FACTOR_DEBUG FACTOR_ASSERT(parent->bignum_roots.back() == (cell) addr); #endif parent->bignum_roots.pop_back(); } }; #define GC_BIGNUM(x) gc_bignum x##__data_root(&x, this) }