Deprecate ID::AsType(), add ID::IsType() and ID::GetType()

This commit is contained in:
Jon Siwek 2020-05-07 20:07:46 -07:00
parent f26904e031
commit 6e647416d5
10 changed files with 32 additions and 22 deletions

2
NEWS
View file

@ -153,6 +153,8 @@ Deprecated Functionality
- ``BroType::YieldType()`` is deprecated, use ``BroType::Yield()``. - ``BroType::YieldType()`` is deprecated, use ``BroType::Yield()``.
- ``ID::AsType()`` is deprecated, use ``ID::IsType()`` and ``ID::GetType()``.
Zeek 3.1.0 Zeek 3.1.0
========== ==========

View file

@ -218,8 +218,8 @@ NameExpr::NameExpr(IntrusivePtr<ID> arg_id, bool const_init)
{ {
in_const_init = const_init; in_const_init = const_init;
if ( id->AsType() ) if ( id->IsType() )
SetType(make_intrusive<TypeType>(IntrusivePtr{NewRef{}, id->AsType()})); SetType(make_intrusive<TypeType>(IntrusivePtr{NewRef{}, id->Type()}));
else else
SetType({NewRef{}, id->Type()}); SetType({NewRef{}, id->Type()});
@ -232,8 +232,8 @@ IntrusivePtr<Val> NameExpr::Eval(Frame* f) const
{ {
IntrusivePtr<Val> v; IntrusivePtr<Val> v;
if ( id->AsType() ) if ( id->IsType() )
return make_intrusive<Val>(id->AsType(), true); return make_intrusive<Val>(id->Type(), true);
if ( id->IsGlobal() ) if ( id->IsGlobal() )
v = {NewRef{}, id->ID_Val()}; v = {NewRef{}, id->ID_Val()};
@ -256,7 +256,7 @@ IntrusivePtr<Val> NameExpr::Eval(Frame* f) const
IntrusivePtr<Expr> NameExpr::MakeLvalue() IntrusivePtr<Expr> NameExpr::MakeLvalue()
{ {
if ( id->AsType() ) if ( id->IsType() )
ExprError("Type name is not an lvalue"); ExprError("Type name is not an lvalue");
if ( id->IsConst() && ! in_const_init ) if ( id->IsConst() && ! in_const_init )

View file

@ -37,13 +37,23 @@ public:
std::string ModuleName() const; std::string ModuleName() const;
void SetType(IntrusivePtr<BroType> t); void SetType(IntrusivePtr<BroType> t);
BroType* Type() { return type.get(); } BroType* Type() { return type.get(); }
const BroType* Type() const { return type.get(); } const BroType* Type() const { return type.get(); }
void MakeType() { is_type = true; } const IntrusivePtr<BroType>& GetType() const
{ return type; }
[[deprecated("Remove in v4.1. Use IsType() and GetType().")]]
BroType* AsType() { return is_type ? Type() : nullptr; } BroType* AsType() { return is_type ? Type() : nullptr; }
[[deprecated("Remove in v4.1. Use IsType() and GetType().")]]
const BroType* AsType() const { return is_type ? Type() : nullptr; } const BroType* AsType() const { return is_type ? Type() : nullptr; }
bool IsType() const
{ return is_type; }
void MakeType() { is_type = true; }
// If weak_ref is false, the Val is assumed to be already ref'ed // If weak_ref is false, the Val is assumed to be already ref'ed
// and will be deref'ed when the ID is deleted. // and will be deref'ed when the ID is deleted.
// //

View file

@ -130,11 +130,10 @@ BroType* OpaqueVal::UnserializeType(const broker::data& data)
if ( ! id ) if ( ! id )
return nullptr; return nullptr;
BroType* t = id->AsType(); if ( ! id->IsType() )
if ( ! t )
return nullptr; return nullptr;
return t->Ref(); return id->Type()->Ref();
} }
auto tag = caf::get_if<uint64_t>(&(*v)[1]); auto tag = caf::get_if<uint64_t>(&(*v)[1]);

View file

@ -1766,12 +1766,12 @@ IntrusivePtr<BroType> merge_types(const BroType* t1, const BroType* t2)
// (potentially) avoiding a pitfall mentioned earlier about clones. // (potentially) avoiding a pitfall mentioned earlier about clones.
auto id = global_scope()->Lookup(t1->GetName()); auto id = global_scope()->Lookup(t1->GetName());
if ( id && id->AsType() && id->AsType()->Tag() == TYPE_ENUM ) if ( id && id->IsType() && id->Type()->Tag() == TYPE_ENUM )
// It should make most sense to return the real type here rather // It should make most sense to return the real type here rather
// than a copy since it may be redef'd later in parsing. If we // than a copy since it may be redef'd later in parsing. If we
// return a copy, then whoever is using this return value won't // return a copy, then whoever is using this return value won't
// actually see those changes from the redef. // actually see those changes from the redef.
return {NewRef{}, id->AsType()}; return {NewRef{}, id->Type()};
std::string msg = fmt("incompatible enum types: '%s' and '%s'" std::string msg = fmt("incompatible enum types: '%s' and '%s'"
" ('%s' enum type ID is invalid)", " ('%s' enum type ID is invalid)",

View file

@ -606,11 +606,10 @@ expr:
{ {
set_location(@1, @6); set_location(@1, @6);
BroType* ctor_type = 0; if ( $1->Tag() == EXPR_NAME && $1->AsNameExpr()->Id()->IsType() )
if ( $1->Tag() == EXPR_NAME &&
(ctor_type = $1->AsNameExpr()->Id()->AsType()) )
{ {
auto ctor_type = $1->AsNameExpr()->Id()->Type();
switch ( ctor_type->Tag() ) { switch ( ctor_type->Tag() ) {
case TYPE_RECORD: case TYPE_RECORD:
{ {
@ -1007,7 +1006,7 @@ type:
| resolve_id | resolve_id
{ {
if ( ! $1 || ! ($$ = $1->AsType()) ) if ( ! $1 || ! ($$ = $1->IsType() ? $1->Type() : nullptr) )
{ {
NullStmt here; NullStmt here;
if ( $1 ) if ( $1 )

View file

@ -1171,7 +1171,7 @@ IntrusivePtr<RecordVal> Supervisor::Node::ToRecord() const
static IntrusivePtr<Val> supervisor_role_to_cluster_node_type(BifEnum::Supervisor::ClusterRole role) static IntrusivePtr<Val> supervisor_role_to_cluster_node_type(BifEnum::Supervisor::ClusterRole role)
{ {
static auto node_type = global_scope()->Lookup("Cluster::NodeType")->AsType()->AsEnumType(); static auto node_type = global_scope()->Lookup("Cluster::NodeType")->Type()->AsEnumType();
switch ( role ) { switch ( role ) {
case BifEnum::Supervisor::LOGGER: case BifEnum::Supervisor::LOGGER:
@ -1192,7 +1192,7 @@ bool Supervisor::SupervisedNode::InitCluster() const
if ( config.cluster.empty() ) if ( config.cluster.empty() )
return false; return false;
auto cluster_node_type = global_scope()->Lookup("Cluster::Node")->AsType()->AsRecordType(); auto cluster_node_type = global_scope()->Lookup("Cluster::Node")->Type()->AsRecordType();
auto cluster_nodes_id = global_scope()->Lookup("Cluster::nodes"); auto cluster_nodes_id = global_scope()->Lookup("Cluster::nodes");
auto cluster_manager_is_logger_id = global_scope()->Lookup("Cluster::manager_is_logger"); auto cluster_manager_is_logger_id = global_scope()->Lookup("Cluster::manager_is_logger");
auto cluster_nodes = cluster_nodes_id->ID_Val()->AsTableVal(); auto cluster_nodes = cluster_nodes_id->ID_Val()->AsTableVal();

View file

@ -2003,14 +2003,14 @@ function record_fields%(rec: any%): record_field_table
{ {
auto id = global_scope()->Lookup(rec->AsStringVal()->ToStdString()); auto id = global_scope()->Lookup(rec->AsStringVal()->ToStdString());
if ( ! id || ! id->AsType() || id->AsType()->Tag() != TYPE_RECORD ) if ( ! id || ! id->IsType() || id->Type()->Tag() != TYPE_RECORD )
{ {
reporter->Error("record_fields string argument does not name a record type"); reporter->Error("record_fields string argument does not name a record type");
IntrusivePtr<TableType> tt{NewRef{}, internal_type("record_field_table")->AsTableType()}; IntrusivePtr<TableType> tt{NewRef{}, internal_type("record_field_table")->AsTableType()};
return make_intrusive<TableVal>(std::move(tt)); return make_intrusive<TableVal>(std::move(tt));
} }
return id->AsType()->AsRecordType()->GetRecordFieldsVal(); return id->Type()->AsRecordType()->GetRecordFieldsVal();
} }
return rec->GetRecordFields(); return rec->GetRecordFields();

View file

@ -274,7 +274,7 @@ void Manager::StartType(IntrusivePtr<ID> id)
static bool IsEnumType(ID* id) static bool IsEnumType(ID* id)
{ {
return id->AsType() ? id->AsType()->Tag() == TYPE_ENUM : false; return id->IsType() ? id->Type()->Tag() == TYPE_ENUM : false;
} }
void Manager::Identifier(IntrusivePtr<ID> id) void Manager::Identifier(IntrusivePtr<ID> id)

View file

@ -183,7 +183,7 @@ void ScriptInfo::DoInitPostScript()
if ( ! zeekygen::is_public_api(id) ) if ( ! zeekygen::is_public_api(id) )
continue; continue;
if ( id->AsType() ) if ( id->IsType() )
{ {
types.push_back(info); types.push_back(info);
DBG_LOG(DBG_ZEEKYGEN, "Filter id '%s' in '%s' as a type", DBG_LOG(DBG_ZEEKYGEN, "Filter id '%s' in '%s' as a type",