diff --git a/NEWS b/NEWS index e0997318d4..a9b426b9a9 100644 --- a/NEWS +++ b/NEWS @@ -197,6 +197,8 @@ Deprecated Functionality - ``RecordVal::Assign(int, Val*)`` is deprecated, use the overload taking ``IntrusivePtr``. +- ``RecordVal::Lookup(int)`` is deprecated, use ``RecordVal::GetField(int)``. + Zeek 3.1.0 ========== diff --git a/src/CompHash.cc b/src/CompHash.cc index 2d3e674348..daf896fe16 100644 --- a/src/CompHash.cc +++ b/src/CompHash.cc @@ -180,7 +180,7 @@ char* CompositeHash::SingleValHash(bool type_check, char* kp0, for ( int i = 0; i < num_fields; ++i ) { - auto rv_i = rv->Lookup(i); + auto rv_i = rv->GetField(i).get(); Attributes* a = rt->FieldDecl(i)->attrs.get(); bool optional = (a && a->FindAttr(ATTR_OPTIONAL)); @@ -518,7 +518,7 @@ int CompositeHash::SingleTypeKeySize(BroType* bt, const Val* v, bool optional = (a && a->FindAttr(ATTR_OPTIONAL)); sz = SingleTypeKeySize(rt->GetFieldType(i).get(), - rv ? rv->Lookup(i) : nullptr, + rv ? rv->GetField(i).get() : nullptr, type_check, sz, optional, calc_static_size); if ( ! sz ) diff --git a/src/Conn.cc b/src/Conn.cc index 6d19444095..76495ddb57 100644 --- a/src/Conn.cc +++ b/src/Conn.cc @@ -430,7 +430,7 @@ void Connection::AppendAddl(const char* str) { const auto& cv = ConnVal(); - const char* old = cv->Lookup(6)->AsString()->CheckString(); + const char* old = cv->GetField(6)->AsString()->CheckString(); const char* format = *old ? "%s %s" : "%s%s"; cv->Assign(6, make_intrusive(fmt(format, old, str))); @@ -699,7 +699,7 @@ void Connection::CheckFlowLabel(bool is_orig, uint32_t flow_label) { if ( conn_val ) { - RecordVal *endp = conn_val->Lookup(is_orig ? 1 : 2)->AsRecordVal(); + RecordVal* endp = conn_val->GetField(is_orig ? 1 : 2)->AsRecordVal(); endp->Assign(4, val_mgr->Count(flow_label)); } diff --git a/src/Expr.cc b/src/Expr.cc index 0690bf74b6..3300b1bda0 100644 --- a/src/Expr.cc +++ b/src/Expr.cc @@ -2897,8 +2897,8 @@ void FieldExpr::Delete(Frame* f) IntrusivePtr FieldExpr::Fold(Val* v) const { - if ( Val* result = v->AsRecordVal()->Lookup(field) ) - return {NewRef{}, result}; + if ( const auto& result = v->AsRecordVal()->GetField(field) ) + return result; // Check for &default. const Attr* def_attr = td ? td->FindAttr(ATTR_DEFAULT) : nullptr; @@ -2959,7 +2959,7 @@ HasFieldExpr::~HasFieldExpr() IntrusivePtr HasFieldExpr::Fold(Val* v) const { auto rv = v->AsRecordVal(); - return val_mgr->Bool(rv->Lookup(field)); + return val_mgr->Bool(rv->GetField(field) != nullptr); } void HasFieldExpr::ExprDescribe(ODesc* d) const @@ -3659,7 +3659,7 @@ IntrusivePtr RecordCoerceExpr::Fold(Val* v) const { if ( map[i] >= 0 ) { - IntrusivePtr rhs{NewRef{}, rv->Lookup(map[i])}; + auto rhs = rv->GetField(map[i]); if ( ! rhs ) { @@ -4830,7 +4830,7 @@ IntrusivePtr CastExpr::Eval(Frame* f) const d.Add("'"); if ( same_type(v->GetType().get(), bro_broker::DataVal::ScriptDataType()) && - ! v->AsRecordVal()->Lookup(0) ) + ! v->AsRecordVal()->GetField(0) ) d.Add(" (nil $data field)"); RuntimeError(d.Description()); diff --git a/src/SmithWaterman.cc b/src/SmithWaterman.cc index ac32f6f28d..fe0d9876ab 100644 --- a/src/SmithWaterman.cc +++ b/src/SmithWaterman.cc @@ -107,19 +107,19 @@ BroSubstring::Vec* BroSubstring::VecFromPolicy(VectorVal* vec) if ( ! v ) continue; - const BroString* str = v->AsRecordVal()->Lookup(0)->AsString(); + const BroString* str = v->AsRecordVal()->GetField(0)->AsString(); BroSubstring* substr = new BroSubstring(*str); - const VectorVal* aligns = v->AsRecordVal()->Lookup(1)->AsVectorVal(); + const VectorVal* aligns = v->AsRecordVal()->GetField(1)->AsVectorVal(); for ( unsigned int j = 1; j <= aligns->Size(); ++j ) { const RecordVal* align = aligns->AsVectorVal()->Lookup(j)->AsRecordVal(); - const BroString* str = align->Lookup(0)->AsString(); - int index = align->Lookup(1)->AsCount(); + const BroString* str = align->GetField(0)->AsString(); + int index = align->GetField(1)->AsCount(); substr->AddAlignment(str, index); } - bool new_alignment = v->AsRecordVal()->Lookup(2)->AsBool(); + bool new_alignment = v->AsRecordVal()->GetField(2)->AsBool(); substr->MarkNewAlignment(new_alignment); result->push_back(substr); diff --git a/src/Type.cc b/src/Type.cc index bfa2fb6af9..0e0d00d4e5 100644 --- a/src/Type.cc +++ b/src/Type.cc @@ -804,10 +804,10 @@ IntrusivePtr RecordType::GetRecordFieldsVal(const RecordVal* rv) const { const auto& ft = GetFieldType(i); const TypeDecl* fd = FieldDecl(i); - Val* fv = nullptr; + IntrusivePtr fv; if ( rv ) - fv = rv->Lookup(i); + fv = rv->GetField(i); bool logged = (fd->attrs && fd->FindAttr(ATTR_LOG) != nullptr); @@ -816,7 +816,7 @@ IntrusivePtr RecordType::GetRecordFieldsVal(const RecordVal* rv) const string s = container_type_name(ft.get()); nr->Assign(0, make_intrusive(s)); nr->Assign(1, val_mgr->Bool(logged)); - nr->Assign(2, {NewRef{}, fv}); + nr->Assign(2, std::move(fv)); nr->Assign(3, FieldDefault(i)); Val* field_name = new StringVal(FieldName(i)); rval->Assign(field_name, std::move(nr)); diff --git a/src/Val.cc b/src/Val.cc index 7d5f59c60e..f31c56213d 100644 --- a/src/Val.cc +++ b/src/Val.cc @@ -2741,11 +2741,6 @@ void RecordVal::Assign(int field, Val* new_val) Assign(field, {AdoptRef{}, new_val}); } -Val* RecordVal::Lookup(int field) const - { - return (*AsRecord())[field].get(); - } - IntrusivePtr RecordVal::LookupWithDefault(int field) const { const auto& val = (*AsRecord())[field]; @@ -2793,7 +2788,7 @@ IntrusivePtr RecordVal::Lookup(const char* field, bool with_default) const if ( idx < 0 ) reporter->InternalError("missing record field: %s", field); - return with_default ? LookupWithDefault(idx) : IntrusivePtr{NewRef{}, Lookup(idx)}; + return with_default ? LookupWithDefault(idx) : GetField(idx); } IntrusivePtr RecordVal::CoerceTo(IntrusivePtr t, @@ -2827,7 +2822,7 @@ IntrusivePtr RecordVal::CoerceTo(IntrusivePtr t, break; } - Val* v = Lookup(i); + const auto& v = GetField(i); if ( ! v ) // Check for allowable optional fields is outside the loop, below. @@ -2837,18 +2832,18 @@ IntrusivePtr RecordVal::CoerceTo(IntrusivePtr t, if ( ft->Tag() == TYPE_RECORD && ! same_type(ft.get(), v->GetType().get()) ) { - auto rhs = make_intrusive(IntrusivePtr{NewRef{}, v}); + auto rhs = make_intrusive(v); auto e = make_intrusive(std::move(rhs), cast_intrusive(ft)); aggr->Assign(t_i, e->Eval(nullptr)); continue; } - aggr->Assign(t_i, {NewRef{}, v}); + aggr->Assign(t_i, v); } for ( i = 0; i < ar_t->NumFields(); ++i ) - if ( ! aggr->Lookup(i) && + if ( ! aggr->GetField(i) && ! ar_t->FieldDecl(i)->FindAttr(ATTR_OPTIONAL) ) { char buf[512]; @@ -3390,12 +3385,12 @@ IntrusivePtr cast_value_to_type(Val* v, BroType* t) if ( same_type(v->GetType().get(), bro_broker::DataVal::ScriptDataType()) ) { - auto dv = v->AsRecordVal()->Lookup(0); + const auto& dv = v->AsRecordVal()->GetField(0); if ( ! dv ) return nullptr; - return static_cast(dv)->castTo(t); + return static_cast(dv.get())->castTo(t); } return nullptr; @@ -3416,12 +3411,12 @@ bool can_cast_value_to_type(const Val* v, BroType* t) if ( same_type(v->GetType().get(), bro_broker::DataVal::ScriptDataType()) ) { - auto dv = v->AsRecordVal()->Lookup(0); + const auto& dv = v->AsRecordVal()->GetField(0); if ( ! dv ) return false; - return static_cast(dv)->canCastTo(t); + return static_cast(dv.get())->canCastTo(t); } return false; diff --git a/src/Val.h b/src/Val.h index b635732f01..8671298135 100644 --- a/src/Val.h +++ b/src/Val.h @@ -965,7 +965,27 @@ public: void Assign(int field, std::nullptr_t) { Assign(field, IntrusivePtr{}); } - Val* Lookup(int field) const; // Does not Ref() value. + [[deprecated("Remove in v4.1. Use GetField().")]] + Val* Lookup(int field) const // Does not Ref() value. + { return (*AsRecord())[field].get(); } + + /** + * Returns the value of a given field index. + * @param field The field index to retrieve. + * @return The value at the given field index. + */ + const IntrusivePtr& GetField(int field) const + { return (*AsRecord())[field]; } + + /** + * Returns the value of a given field index as cast to type @c T. + * @param field The field index to retrieve. + * @return The value at the given field index cast to type @c T. + */ + template + IntrusivePtr GetField(int field) const + { return cast_intrusive(GetField(field)); } + IntrusivePtr LookupWithDefault(int field) const; /** diff --git a/src/analyzer/protocol/krb/krb-analyzer.pac b/src/analyzer/protocol/krb/krb-analyzer.pac index 86aa921895..928cdf4fd5 100644 --- a/src/analyzer/protocol/krb/krb-analyzer.pac +++ b/src/analyzer/protocol/krb/krb-analyzer.pac @@ -263,7 +263,7 @@ refine connection KRB_Conn += { rv->Assign(1, val_mgr->Bool(${msg.ap_options.mutual_required})); auto rvticket = proc_ticket(${msg.ticket}); - auto authenticationinfo = bro_analyzer()->GetAuthenticationInfo(rvticket->Lookup(2)->AsString(), rvticket->Lookup(4)->AsString(), rvticket->Lookup(3)->AsCount()); + auto authenticationinfo = bro_analyzer()->GetAuthenticationInfo(rvticket->GetField(2)->AsString(), rvticket->GetField(4)->AsString(), rvticket->GetField(3)->AsCount()); if ( authenticationinfo ) rvticket->Assign(5, authenticationinfo); diff --git a/src/analyzer/protocol/rpc/NFS.cc b/src/analyzer/protocol/rpc/NFS.cc index c687c85fac..1ca6bbd89d 100644 --- a/src/analyzer/protocol/rpc/NFS.cc +++ b/src/analyzer/protocol/rpc/NFS.cc @@ -175,7 +175,7 @@ bool NFS_Interp::RPC_BuildReply(RPC_CallInfo* c, BifEnum::rpc_status rpc_status, case BifEnum::NFS3::PROC_READ: bro_uint_t offset; - offset = c->RequestVal()->AsRecordVal()->Lookup(1)->AsCount(); + offset = c->RequestVal()->AsRecordVal()->GetField(1)->AsCount(); reply = nfs3_read_reply(buf, n, nfs_status, offset); event = nfs_proc_read; break; diff --git a/src/analyzer/protocol/rpc/Portmap.cc b/src/analyzer/protocol/rpc/Portmap.cc index 1d1480fa42..1a35157c1b 100644 --- a/src/analyzer/protocol/rpc/Portmap.cc +++ b/src/analyzer/protocol/rpc/Portmap.cc @@ -125,7 +125,7 @@ bool PortmapperInterp::RPC_BuildReply(RPC_CallInfo* c, BifEnum::rpc_status statu return false; RecordVal* rv = c->RequestVal()->AsRecordVal(); - Val* is_tcp = rv->Lookup(2); + const auto& is_tcp = rv->GetField(2); reply = val_mgr->Port(CheckPort(port), is_tcp->IsOne() ? TRANSPORT_TCP : TRANSPORT_UDP); event = pm_request_getport; diff --git a/src/analyzer/protocol/tcp/TCP.cc b/src/analyzer/protocol/tcp/TCP.cc index 9734ea30cb..85ef4f4a0d 100644 --- a/src/analyzer/protocol/tcp/TCP.cc +++ b/src/analyzer/protocol/tcp/TCP.cc @@ -1098,7 +1098,7 @@ void TCP_Analyzer::DeliverPacket(int len, const u_char* data, bool is_orig, { syn_weirds(flags, endpoint, len); RecordVal* SYN_vals = build_syn_packet_val(is_orig, ip, tp); - init_window(endpoint, peer, flags, SYN_vals->Lookup(5)->CoerceToInt(), + init_window(endpoint, peer, flags, SYN_vals->GetField(5)->CoerceToInt(), base_seq, ack_seq); if ( connection_SYN_packet ) diff --git a/src/broker/Data.cc b/src/broker/Data.cc index a6ae4cc93a..82f41be02d 100644 --- a/src/broker/Data.cc +++ b/src/broker/Data.cc @@ -1124,7 +1124,7 @@ IntrusivePtr bro_broker::get_data_type(RecordVal* v, Frame* frame) broker::data& bro_broker::opaque_field_to_data(RecordVal* v, Frame* f) { - Val* d = v->Lookup(0); + const auto& d = v->GetField(0); if ( ! d ) reporter->RuntimeError(f->GetCall()->GetLocationInfo(), @@ -1132,7 +1132,7 @@ broker::data& bro_broker::opaque_field_to_data(RecordVal* v, Frame* f) // RuntimeError throws an exception which causes this line to never exceute. // NOLINTNEXTLINE(clang-analyzer-core.uninitialized.UndefReturn) - return static_cast(d)->data; + return static_cast(d.get())->data; } void bro_broker::DataVal::ValDescribe(ODesc* d) const diff --git a/src/broker/Manager.cc b/src/broker/Manager.cc index fb83682e86..3a1dc82906 100644 --- a/src/broker/Manager.cc +++ b/src/broker/Manager.cc @@ -386,18 +386,18 @@ bool Manager::PublishEvent(string topic, RecordVal* args) if ( peer_count == 0 ) return true; - if ( ! args->Lookup(0) ) + if ( ! args->GetField(0) ) return false; - auto event_name = args->Lookup(0)->AsString()->CheckString(); - auto vv = args->Lookup(1)->AsVectorVal(); + auto event_name = args->GetField(0)->AsString()->CheckString(); + auto vv = args->GetField(1)->AsVectorVal(); broker::vector xs; xs.reserve(vv->Size()); for ( auto i = 0u; i < vv->Size(); ++i ) { - auto val = vv->Lookup(i)->AsRecordVal()->Lookup(0); - auto data_val = static_cast(val); + const auto& val = vv->Lookup(i)->AsRecordVal()->GetField(0); + auto data_val = static_cast(val.get()); xs.emplace_back(data_val->data); } @@ -759,7 +759,7 @@ RecordVal* Manager::MakeEvent(val_list* args, Frame* frame) else data_val = make_data_val((*args)[i]); - if ( ! data_val->Lookup(0) ) + if ( ! data_val->GetField(0) ) { rval->Assign(0, nullptr); Error("failed to convert param #%d of type %s to broker data", diff --git a/src/broker/Store.cc b/src/broker/Store.cc index fa76c14616..6ab0a408f3 100644 --- a/src/broker/Store.cc +++ b/src/broker/Store.cc @@ -104,15 +104,15 @@ broker::backend_options to_backend_options(broker::backend backend, switch ( backend ) { case broker::sqlite: { - auto path = options->Lookup(0)->AsRecordVal() - ->Lookup(0)->AsStringVal()->CheckString(); + auto path = options->GetField(0)->AsRecordVal() + ->GetField(0)->AsStringVal()->CheckString(); return {{"path", path}}; } case broker::rocksdb: { - auto path = options->Lookup(1)->AsRecordVal() - ->Lookup(0)->AsStringVal()->CheckString(); + auto path = options->GetField(1)->AsRecordVal() + ->GetField(0)->AsStringVal()->CheckString(); return {{"path", path}}; } diff --git a/src/file_analysis/File.cc b/src/file_analysis/File.cc index 81605e3936..e514c9a266 100644 --- a/src/file_analysis/File.cc +++ b/src/file_analysis/File.cc @@ -21,7 +21,7 @@ using namespace file_analysis; -static IntrusivePtr empty_connection_table() +static IntrusivePtr empty_connection_table() { auto tbl_index = make_intrusive(zeek::id::conn_id); tbl_index->Append(zeek::id::conn_id); @@ -121,7 +121,7 @@ void File::UpdateLastActivityTime() double File::GetLastActivityTime() const { - return val->Lookup(last_active_idx)->AsTime(); + return val->GetField(last_active_idx)->AsTime(); } bool File::UpdateConnectionFields(Connection* conn, bool is_orig) @@ -129,7 +129,7 @@ bool File::UpdateConnectionFields(Connection* conn, bool is_orig) if ( ! conn ) return false; - Val* conns = val->Lookup(conns_idx); + Val* conns = val->GetField(conns_idx).get(); if ( ! conns ) { @@ -184,7 +184,7 @@ int File::Idx(const std::string& field, const RecordType* type) std::string File::GetSource() const { - Val* v = val->Lookup(source_idx); + const auto& v = val->GetField(source_idx); return v ? v->AsString()->CheckString() : std::string(); } @@ -234,7 +234,8 @@ void File::SetTotalBytes(uint64_t size) bool File::IsComplete() const { - Val* total = val->Lookup(total_bytes_idx); + const auto& total = val->GetField(total_bytes_idx); + if ( ! total ) return false; @@ -308,7 +309,7 @@ void File::InferMetadata() { did_metadata_inference = true; - Val* bof_buffer_val = val->Lookup(bof_buffer_idx); + Val* bof_buffer_val = val->GetField(bof_buffer_idx).get(); if ( ! bof_buffer_val ) { @@ -317,7 +318,7 @@ void File::InferMetadata() BroString* bs = concatenate(bof_buffer.chunks); val->Assign(bof_buffer_idx, bs); - bof_buffer_val = val->Lookup(bof_buffer_idx); + bof_buffer_val = val->GetField(bof_buffer_idx).get(); } if ( ! FileEventAvailable(file_sniff) ) diff --git a/src/logging/Manager.cc b/src/logging/Manager.cc index 811346b766..d13c62fcb3 100644 --- a/src/logging/Manager.cc +++ b/src/logging/Manager.cc @@ -1089,7 +1089,7 @@ threading::Value** Manager::RecordToFilterVals(Stream* stream, Filter* filter, for ( list::iterator j = indices.begin(); j != indices.end(); ++j ) { - val = val->AsRecordVal()->Lookup(*j); + val = val->AsRecordVal()->GetField(*j).get(); if ( ! val ) { diff --git a/src/option.bif b/src/option.bif index 84e3798744..f6869b6dad 100644 --- a/src/option.bif +++ b/src/option.bif @@ -81,7 +81,7 @@ function Option::set%(ID: string, val: any, location: string &default=""%): bool if ( same_type(val->GetType().get(), bro_broker::DataVal::ScriptDataType()) ) { - auto dv = static_cast(val->AsRecordVal()->Lookup(0)); + auto dv = static_cast(val->AsRecordVal()->GetField(0).get()); auto val_from_data = dv->castTo(i->GetType().get()); if ( ! val_from_data ) diff --git a/src/reporter.bif b/src/reporter.bif index d9a8166ac1..c3faa748ed 100644 --- a/src/reporter.bif +++ b/src/reporter.bif @@ -138,7 +138,7 @@ function Reporter::conn_weird%(name: string, c: connection, addl: string &defaul ## Returns: true if the file was still valid, else false. function Reporter::file_weird%(name: string, f: fa_file, addl: string &default=""%): bool %{ - auto fuid = f->AsRecordVal()->Lookup(0)->AsStringVal(); + auto fuid = f->AsRecordVal()->GetField(0)->AsStringVal(); auto file = file_mgr->LookupFile(fuid->CheckString()); if ( ! file ) diff --git a/src/strings.bif b/src/strings.bif index 1390534d25..9d6b19884f 100644 --- a/src/strings.bif +++ b/src/strings.bif @@ -681,8 +681,8 @@ function string_to_ascii_hex%(s: string%): string ## Returns: The result of the Smith-Waterman algorithm calculation. function str_smith_waterman%(s1: string, s2: string, params: sw_params%) : sw_substring_vec %{ - SWParams sw_params(params->AsRecordVal()->Lookup(0)->AsCount(), - SWVariant(params->AsRecordVal()->Lookup(1)->AsCount())); + SWParams sw_params(params->AsRecordVal()->GetField(0)->AsCount(), + SWVariant(params->AsRecordVal()->GetField(1)->AsCount())); BroSubstring::Vec* subseq = smith_waterman(s1->AsString(), s2->AsString(), sw_params);