From a0d41e4dc104687be8a9930fa22a00a33c2aff43 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Mon, 2 Nov 2009 18:11:12 -0600 Subject: [PATCH] vm: add two missing files --- vm/code_roots.hpp | 29 +++++++++++++++++++++++ vm/data_roots.hpp | 59 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 88 insertions(+) create mode 100644 vm/code_roots.hpp create mode 100644 vm/data_roots.hpp diff --git a/vm/code_roots.hpp b/vm/code_roots.hpp new file mode 100644 index 0000000000..64f2b0c0ed --- /dev/null +++ b/vm/code_roots.hpp @@ -0,0 +1,29 @@ +namespace factor +{ + +struct code_root { + cell value; + bool valid; + factor_vm *parent; + + void push() + { + parent->code_roots.push_back(this); + } + + explicit code_root(cell value_, factor_vm *parent_) : + value(value_), valid(true), parent(parent_) + { + push(); + } + + ~code_root() + { +#ifdef FACTOR_DEBUG + assert(parent->code_roots.back() == this); +#endif + parent->code_roots.pop_back(); + } +}; + +} diff --git a/vm/data_roots.hpp b/vm/data_roots.hpp new file mode 100644 index 0000000000..52654c49f0 --- /dev/null +++ b/vm/data_roots.hpp @@ -0,0 +1,59 @@ +namespace factor +{ + +template +struct data_root : public tagged { + factor_vm *parent; + + void push() + { + parent->data_roots.push_back((cell)this); + } + + explicit data_root(cell value_, factor_vm *parent_) + : tagged(value_), parent(parent_) + { + push(); + } + + explicit 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() + { +#ifdef FACTOR_DEBUG + assert(parent->data_roots.back() == (cell)this); +#endif + 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 + assert(parent->bignum_roots.back() == (cell)addr); +#endif + parent->bignum_roots.pop_back(); + } +}; + +#define GC_BIGNUM(x) gc_bignum x##__data_root(&x,this) + +}