//tagged.hpp
-template <typename TYPE>
-struct tagged
-{
- cell value_;
-
- cell value() const { return value_; }
- TYPE *untagged() const { return (TYPE *)(UNTAG(value_)); }
-
- cell type() const {
- cell tag = TAG(value_);
- if(tag == OBJECT_TYPE)
- return untagged()->h.hi_tag();
- else
- return tag;
- }
-
- bool type_p(cell type_) const { return type() == type_; }
-
- TYPE *untag_check() const {
- if(TYPE::type_number != TYPE_COUNT && !type_p(TYPE::type_number))
- type_error(TYPE::type_number,value_);
- return untagged();
- }
-
- explicit tagged(cell tagged) : value_(tagged) {
-#ifdef FACTOR_DEBUG
- untag_check();
-#endif
- }
-
- explicit tagged(TYPE *untagged) : value_(factor::tag(untagged)) {
-#ifdef FACTOR_DEBUG
- untag_check();
-#endif
- }
-
- TYPE *operator->() const { return untagged(); }
- cell *operator&() const { return &value_; }
-
- const tagged<TYPE>& operator=(const TYPE *x) { value_ = tag(x); return *this; }
- const tagged<TYPE>& operator=(const cell &x) { value_ = x; return *this; }
-
- bool operator==(const tagged<TYPE> &x) { return value_ == x.value_; }
- bool operator!=(const tagged<TYPE> &x) { return value_ != x.value_; }
-
- template<typename X> tagged<X> as() { return tagged<X>(value_); }
-};
-
-template <typename TYPE> TYPE *factorvm::untag_check(cell value)
-{
- return tagged<TYPE>(value).untag_check();
-}
-
-template <typename TYPE> TYPE *untag_check(cell value)
-{
- return vm->untag_check<TYPE>(value);
-}
-
-template <typename TYPE> TYPE *factorvm::untag(cell value)
-{
- return tagged<TYPE>(value).untagged();
-}
-
-template <typename TYPE> TYPE *untag(cell value)
-{
- return vm->untag<TYPE>(value);
-}
-
-
-
// write_barrier.hpp
inline card *factorvm::addr_to_card(cell a)
#include "segments.hpp"
#include "contexts.hpp"
#include "run.hpp"
-#include "tagged.hpp"
#include "profiler.hpp"
#include "errors.hpp"
#include "bignumint.hpp"
#include "callstack.hpp"
#include "alien.hpp"
#include "vm.hpp"
+#include "tagged.hpp"
#include "inlineimpls.hpp"
#include "jit.hpp"
#include "quotations.hpp"
{
return RETAG(value,tag_for(value->h.hi_tag()));
}
+
+template <typename TYPE>
+struct tagged
+{
+ cell value_;
+
+ cell value() const { return value_; }
+ TYPE *untagged() const { return (TYPE *)(UNTAG(value_)); }
+
+ cell type() const {
+ cell tag = TAG(value_);
+ if(tag == OBJECT_TYPE)
+ return untagged()->h.hi_tag();
+ else
+ return tag;
+ }
+
+ bool type_p(cell type_) const { return type() == type_; }
+
+ TYPE *untag_check() const {
+ if(TYPE::type_number != TYPE_COUNT && !type_p(TYPE::type_number))
+ type_error(TYPE::type_number,value_);
+ return untagged();
+ }
+
+ explicit tagged(cell tagged) : value_(tagged) {
+#ifdef FACTOR_DEBUG
+ untag_check();
+#endif
+ }
+
+ explicit tagged(TYPE *untagged) : value_(factor::tag(untagged)) {
+#ifdef FACTOR_DEBUG
+ untag_check();
+#endif
+ }
+
+ TYPE *operator->() const { return untagged(); }
+ cell *operator&() const { return &value_; }
+
+ const tagged<TYPE>& operator=(const TYPE *x) { value_ = tag(x); return *this; }
+ const tagged<TYPE>& operator=(const cell &x) { value_ = x; return *this; }
+
+ bool operator==(const tagged<TYPE> &x) { return value_ == x.value_; }
+ bool operator!=(const tagged<TYPE> &x) { return value_ != x.value_; }
+
+ template<typename X> tagged<X> as() { return tagged<X>(value_); }
+};
+
+template <typename TYPE> TYPE *factorvm::untag_check(cell value)
+{
+ return tagged<TYPE>(value).untag_check();
+}
+
+template <typename TYPE> TYPE *untag_check(cell value)
+{
+ return vm->untag_check<TYPE>(value);
+}
+
+template <typename TYPE> TYPE *factorvm::untag(cell value)
+{
+ return tagged<TYPE>(value).untagged();
+}
+
+template <typename TYPE> TYPE *untag(cell value)
+{
+ return vm->untag<TYPE>(value);
+}
+
+
}