vm: tagged typechecks work better with DEBUG=1
parent
b7181d14a8
commit
49baf397f4
|
@ -16,13 +16,10 @@ struct tagged
|
||||||
{
|
{
|
||||||
cell value_;
|
cell value_;
|
||||||
|
|
||||||
cell value() const { return value_; }
|
|
||||||
Type *untagged() const { return (Type *)(UNTAG(value_)); }
|
|
||||||
|
|
||||||
cell type() const {
|
cell type() const {
|
||||||
cell tag = TAG(value_);
|
cell tag = TAG(value_);
|
||||||
if(tag == OBJECT_TYPE)
|
if(tag == OBJECT_TYPE)
|
||||||
return untagged()->h.hi_tag();
|
return ((object *)UNTAG(value_))->h.hi_tag();
|
||||||
else
|
else
|
||||||
return tag;
|
return tag;
|
||||||
}
|
}
|
||||||
|
@ -40,23 +37,27 @@ struct tagged
|
||||||
return type_p(Type::type_number);
|
return type_p(Type::type_number);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cell value() const {
|
||||||
|
#ifdef FACTOR_DEBUG
|
||||||
|
assert(type_p());
|
||||||
|
#endif
|
||||||
|
return value_;
|
||||||
|
}
|
||||||
|
Type *untagged() const {
|
||||||
|
#ifdef FACTOR_DEBUG
|
||||||
|
assert(type_p());
|
||||||
|
#endif
|
||||||
|
return (Type *)(UNTAG(value_));
|
||||||
|
}
|
||||||
|
|
||||||
Type *untag_check(factor_vm *parent) const {
|
Type *untag_check(factor_vm *parent) const {
|
||||||
if(!type_p())
|
if(!type_p())
|
||||||
parent->type_error(Type::type_number,value_);
|
parent->type_error(Type::type_number,value_);
|
||||||
return untagged();
|
return untagged();
|
||||||
}
|
}
|
||||||
|
|
||||||
explicit tagged(cell tagged) : value_(tagged) {
|
explicit tagged(cell tagged) : value_(tagged) {}
|
||||||
#ifdef FACTOR_DEBUG
|
explicit tagged(Type *untagged) : value_(factor::tag(untagged)) {}
|
||||||
assert(type_p());
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
explicit tagged(Type *untagged) : value_(factor::tag(untagged)) {
|
|
||||||
#ifdef FACTOR_DEBUG
|
|
||||||
assert(type_p());
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
Type *operator->() const { return untagged(); }
|
Type *operator->() const { return untagged(); }
|
||||||
cell *operator&() const { return &value_; }
|
cell *operator&() const { return &value_; }
|
||||||
|
|
Loading…
Reference in New Issue