switch ZVal representation of types from Type objects to TypeVal's

This commit is contained in:
Vern Paxson 2021-05-30 18:44:41 -07:00
parent f3fa8a7c0b
commit dfc74a9af4
2 changed files with 10 additions and 16 deletions

View file

@ -24,7 +24,7 @@ ZVal::ZVal(ValPtr v, const TypePtr& t)
return; return;
} }
auto vt = v->GetType(); const auto& vt = v->GetType();
if ( vt->Tag() != t->Tag() && t->Tag() != TYPE_ANY ) if ( vt->Tag() != t->Tag() && t->Tag() != TYPE_ANY )
{ {
@ -102,7 +102,7 @@ ZVal::ZVal(ValPtr v, const TypePtr& t)
break; break;
case TYPE_TYPE: case TYPE_TYPE:
type_val = t->Ref(); type_val = v.release()->AsTypeVal();
break; break;
case TYPE_ERROR: case TYPE_ERROR:
@ -222,15 +222,6 @@ ValPtr ZVal::ToVal(const TypePtr& t) const
case TYPE_ENUM: case TYPE_ENUM:
return t->AsEnumType()->GetEnumVal(int_val); return t->AsEnumType()->GetEnumVal(int_val);
case TYPE_ANY:
return {NewRef{}, any_val};
case TYPE_TYPE:
{
TypePtr tp = {NewRef{}, type_val};
return make_intrusive<TypeVal>(tp);
}
case TYPE_FUNC: case TYPE_FUNC:
if ( func_val ) if ( func_val )
{ {
@ -258,6 +249,8 @@ ValPtr ZVal::ToVal(const TypePtr& t) const
case TYPE_RECORD: v = record_val; break; case TYPE_RECORD: v = record_val; break;
case TYPE_VECTOR: v = vector_val; break; case TYPE_VECTOR: v = vector_val; break;
case TYPE_PATTERN: v = re_val; break; case TYPE_PATTERN: v = re_val; break;
case TYPE_ANY: v = any_val; break;
case TYPE_TYPE: v = type_val; break;
case TYPE_ERROR: case TYPE_ERROR:
case TYPE_TIMER: case TYPE_TIMER:

View file

@ -18,7 +18,7 @@ class RecordVal;
class StringVal; class StringVal;
class SubNetVal; class SubNetVal;
class TableVal; class TableVal;
class Type; class TypeVal;
class Val; class Val;
class VectorVal; class VectorVal;
@ -31,6 +31,7 @@ using RecordValPtr = IntrusivePtr<RecordVal>;
using StringValPtr = IntrusivePtr<StringVal>; using StringValPtr = IntrusivePtr<StringVal>;
using SubNetValPtr = IntrusivePtr<SubNetVal>; using SubNetValPtr = IntrusivePtr<SubNetVal>;
using TableValPtr = IntrusivePtr<TableVal>; using TableValPtr = IntrusivePtr<TableVal>;
using TypeValPtr = IntrusivePtr<TypeVal>;
using ValPtr = IntrusivePtr<Val>; using ValPtr = IntrusivePtr<Val>;
using VectorValPtr = IntrusivePtr<VectorVal>; using VectorValPtr = IntrusivePtr<VectorVal>;
@ -69,9 +70,9 @@ union ZVal {
ZVal(OpaqueVal* v) { opaque_val = v; } ZVal(OpaqueVal* v) { opaque_val = v; }
ZVal(PatternVal* v) { re_val = v; } ZVal(PatternVal* v) { re_val = v; }
ZVal(TableVal* v) { table_val = v; } ZVal(TableVal* v) { table_val = v; }
ZVal(TypeVal* v) { type_val = v; }
ZVal(RecordVal* v) { record_val = v; } ZVal(RecordVal* v) { record_val = v; }
ZVal(VectorVal* v) { vector_val = v; } ZVal(VectorVal* v) { vector_val = v; }
ZVal(Type* v) { type_val = v; }
ZVal(StringValPtr v) { string_val = v.release(); } ZVal(StringValPtr v) { string_val = v.release(); }
ZVal(AddrValPtr v) { addr_val = v.release(); } ZVal(AddrValPtr v) { addr_val = v.release(); }
@ -80,9 +81,9 @@ union ZVal {
ZVal(OpaqueValPtr v) { opaque_val = v.release(); } ZVal(OpaqueValPtr v) { opaque_val = v.release(); }
ZVal(PatternValPtr v) { re_val = v.release(); } ZVal(PatternValPtr v) { re_val = v.release(); }
ZVal(TableValPtr v) { table_val = v.release(); } ZVal(TableValPtr v) { table_val = v.release(); }
ZVal(TypeValPtr v) { type_val = v.release(); }
ZVal(RecordValPtr v) { record_val = v.release(); } ZVal(RecordValPtr v) { record_val = v.release(); }
ZVal(VectorValPtr v) { vector_val = v.release(); } ZVal(VectorValPtr v) { vector_val = v.release(); }
ZVal(TypePtr v) { type_val = v.release(); }
// Convert to a higher-level script value. The caller needs to // Convert to a higher-level script value. The caller needs to
// ensure that they're providing the correct type. // ensure that they're providing the correct type.
@ -103,7 +104,7 @@ union ZVal {
TableVal* AsTable() const { return table_val; } TableVal* AsTable() const { return table_val; }
RecordVal* AsRecord() const { return record_val; } RecordVal* AsRecord() const { return record_val; }
VectorVal* AsVector() const { return vector_val; } VectorVal* AsVector() const { return vector_val; }
Type* AsType() const { return type_val; } TypeVal* AsType() const { return type_val; }
Val* AsAny() const { return any_val; } Val* AsAny() const { return any_val; }
Obj* ManagedVal() const { return managed_val; } Obj* ManagedVal() const { return managed_val; }
@ -162,7 +163,7 @@ private:
TableVal* table_val; TableVal* table_val;
RecordVal* record_val; RecordVal* record_val;
VectorVal* vector_val; VectorVal* vector_val;
Type* type_val; TypeVal* type_val;
// Used for "any" values. // Used for "any" values.
Val* any_val; Val* any_val;