]> gitweb.factorcode.org Git - factor.git/blobdiff - vm/data_roots.hpp
webapps.wiki: adding search bar
[factor.git] / vm / data_roots.hpp
index 52654c49f0274dc14cbf717aeb07fa315a2f40de..c0e4ce68f36fdfb018547ef8e73fdf01480f2d59 100644 (file)
@@ -1,59 +1,32 @@
-namespace factor
-{
-
-template<typename Type>
-struct data_root : public tagged<Type> {
-       factor_vm *parent;
-
-       void push()
-       {
-               parent->data_roots.push_back((cell)this);
-       }
-
-       explicit data_root(cell value_, factor_vm *parent_)
-               : tagged<Type>(value_), parent(parent_)
-       {
-               push();
-       }
-
-       explicit data_root(Type *value_, factor_vm *parent_) :
-               tagged<Type>(value_), parent(parent_)
-       {
-               push();
-       }
-
-       const data_root<Type>& operator=(const Type *x) { tagged<Type>::operator=(x); return *this; }
-       const data_root<Type>& operator=(const cell &x) { tagged<Type>::operator=(x); return *this; }
-
-       ~data_root()
-       {
-#ifdef FACTOR_DEBUG
-               assert(parent->data_roots.back() == (cell)this);
-#endif
-               parent->data_roots.pop_back();
-       }
+namespace factor {
+
+template <typename Type> struct data_root : public tagged<Type> {
+  factor_vm* parent;
+
+  void push() {
+    parent->data_roots.push_back(&this->value_);
+  }
+
+  data_root(cell value, factor_vm* parent)
+      : tagged<Type>(value), parent(parent) {
+    push();
+  }
+
+  data_root(Type* value, factor_vm* parent)
+      : tagged<Type>(value), parent(parent) {
+    FACTOR_ASSERT(value);
+    push();
+  }
+
+  ~data_root() {
+    parent->data_roots.pop_back();
+  }
+
+  friend void swap(data_root<Type>& a, data_root<Type>& b) {
+    cell tmp = a.value_;
+    a.value_ = b.value_;
+    b.value_ = tmp;
+  }
 };
 
-/* 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)
-
 }