return (Type*)(UNTAG(value_));
}
- Type* untag_check(factor_vm* parent) const {
- if (!type_p())
- parent->type_error(Type::type_number, value_);
- return untagged();
- }
-
explicit tagged(cell tagged) : value_(tagged) {}
explicit tagged(Type* untagged) : value_(factor::tag(untagged)) {}
- Type* operator->() const { return untagged(); }
- cell* operator&() const { return &value_; }
-
- const tagged<Type>& operator=(const Type* x) {
- value_ = tag(x);
- return *this;
+ void set_value(const cell ptr) {
+ value_ = ptr;
}
- const tagged<Type>& operator=(const cell& x) {
- value_ = x;
- return *this;
+
+ void set_untagged(const Type *untagged) {
+ set_value(tag(untagged));
}
+ Type* operator->() const { return untagged(); }
+ cell* operator&() const { return &value(); }
+
bool operator==(const tagged<Type>& x) { return value_ == x.value_; }
bool operator!=(const tagged<Type>& x) { return value_ != x.value_; }
}
};
-template <typename Type> Type* factor_vm::untag_check(cell value) {
- return tagged<Type>(value).untag_check(this);
-}
-
template <typename Type> Type* untag(cell value) {
return tagged<Type>(value).untagged();
}