diff --git a/src/Conn.cc b/src/Conn.cc index fd158b5476..591d80b7f2 100644 --- a/src/Conn.cc +++ b/src/Conn.cc @@ -631,7 +631,7 @@ void Connection::CheckFlowLabel(bool is_orig, uint32_t flow_label) { if ( conn_val ) { - RecordVal* endp = conn_val->GetField(is_orig ? 1 : 2)->AsRecordVal(); + RecordVal* endp = conn_val->GetFieldAs(is_orig ? 1 : 2); endp->Assign(4, val_mgr->Count(flow_label)); } diff --git a/src/SmithWaterman.cc b/src/SmithWaterman.cc index 1b2bebea09..1b567e0b05 100644 --- a/src/SmithWaterman.cc +++ b/src/SmithWaterman.cc @@ -111,7 +111,7 @@ Substring::Vec* Substring::VecFromPolicy(VectorVal* vec) const String* str = v->GetFieldAs(0); auto* substr = new Substring(*str); - const VectorVal* aligns = v->GetField(1)->AsVectorVal(); + const VectorVal* aligns = v->GetFieldAs(1); for ( unsigned int j = 1; j <= aligns->Size(); ++j ) { const RecordVal* align = aligns->AsVectorVal()->RecordValAt(j); diff --git a/src/Val.h b/src/Val.h index e7998bded6..7825869274 100644 --- a/src/Val.h +++ b/src/Val.h @@ -1310,6 +1310,9 @@ protected: static RecordTypeValMap parse_time_records; private: + // Just for template inferencing. + RecordVal* Get() { return this; } + // Keep this handy for quick access during low-level operations. RecordTypePtr rt; @@ -1479,6 +1482,10 @@ protected: ValPtr DoClone(CloneState* state) override; private: + // Just for template inferencing. + friend class RecordVal; + VectorVal* Get() { return this; } + // Check the type of the given element against our current // yield type and adjust as necessary. Returns whether the // element type-checked. diff --git a/src/analyzer/protocol/conn-size/ConnSize.cc b/src/analyzer/protocol/conn-size/ConnSize.cc index 468d6fb17d..b5214749b0 100644 --- a/src/analyzer/protocol/conn-size/ConnSize.cc +++ b/src/analyzer/protocol/conn-size/ConnSize.cc @@ -171,8 +171,8 @@ void ConnSize_Analyzer::SetDurationThreshold(double duration) void ConnSize_Analyzer::UpdateConnVal(RecordVal *conn_val) { // RecordType *connection_type is decleared in NetVar.h - RecordVal* orig_endp = conn_val->GetField("orig")->AsRecordVal(); - RecordVal* resp_endp = conn_val->GetField("resp")->AsRecordVal(); + RecordVal* orig_endp = conn_val->GetFieldAs("orig"); + RecordVal* resp_endp = conn_val->GetFieldAs("resp"); // endpoint is the RecordType from NetVar.h int pktidx = id::endpoint->FieldOffset("num_pkts"); diff --git a/src/analyzer/protocol/rpc/Portmap.cc b/src/analyzer/protocol/rpc/Portmap.cc index 302428a56b..3d0893a363 100644 --- a/src/analyzer/protocol/rpc/Portmap.cc +++ b/src/analyzer/protocol/rpc/Portmap.cc @@ -126,8 +126,8 @@ bool PortmapperInterp::RPC_BuildReply(RPC_CallInfo* c, BifEnum::rpc_status statu return false; RecordVal* rv = c->RequestVal()->AsRecordVal(); - const auto& is_tcp = rv->GetField(2); - reply = val_mgr->Port(CheckPort(port), is_tcp->IsOne() ? + auto is_tcp = rv->GetFieldAs(2); + reply = val_mgr->Port(CheckPort(port), is_tcp ? 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 de60ddc60d..e6b29a000c 100644 --- a/src/analyzer/protocol/tcp/TCP.cc +++ b/src/analyzer/protocol/tcp/TCP.cc @@ -1099,7 +1099,7 @@ void TCP_Analyzer::DeliverPacket(int len, const u_char* data, bool is_orig, { SynWeirds(flags, endpoint, len); RecordVal* SYN_vals = build_syn_packet_val(is_orig, ip, tp); - init_window(endpoint, peer, flags, SYN_vals->GetField(5)->CoerceToInt(), + init_window(endpoint, peer, flags, SYN_vals->GetFieldAs(5), base_seq, ack_seq); if ( connection_SYN_packet ) @@ -1282,8 +1282,8 @@ void TCP_Analyzer::FlipRoles() void TCP_Analyzer::UpdateConnVal(RecordVal *conn_val) { - RecordVal* orig_endp_val = conn_val->GetField("orig")->AsRecordVal(); - RecordVal* resp_endp_val = conn_val->GetField("resp")->AsRecordVal(); + auto orig_endp_val = conn_val->GetFieldAs("orig"); + auto resp_endp_val = conn_val->GetFieldAs("resp"); orig_endp_val->Assign(0, val_mgr->Count(orig->Size())); orig_endp_val->Assign(1, val_mgr->Count(int(orig->state))); diff --git a/src/analyzer/protocol/udp/UDP.cc b/src/analyzer/protocol/udp/UDP.cc index 4ea5ccfbf3..b24e30fb1b 100644 --- a/src/analyzer/protocol/udp/UDP.cc +++ b/src/analyzer/protocol/udp/UDP.cc @@ -220,8 +220,8 @@ void UDP_Analyzer::DeliverPacket(int len, const u_char* data, bool is_orig, void UDP_Analyzer::UpdateConnVal(RecordVal* conn_val) { - RecordVal* orig_endp = conn_val->GetField("orig")->AsRecordVal(); - RecordVal* resp_endp = conn_val->GetField("resp")->AsRecordVal(); + auto orig_endp = conn_val->GetFieldAs("orig"); + auto resp_endp = conn_val->GetFieldAs("resp"); UpdateEndpointVal(orig_endp, true); UpdateEndpointVal(resp_endp, false); diff --git a/src/broker/Manager.cc b/src/broker/Manager.cc index c99ee1ba6d..656da437af 100644 --- a/src/broker/Manager.cc +++ b/src/broker/Manager.cc @@ -437,7 +437,7 @@ bool Manager::PublishEvent(string topic, RecordVal* args) return false; auto event_name = args->GetFieldAs(0)->CheckString(); - auto vv = args->GetField(1)->AsVectorVal(); + auto vv = args->GetFieldAs(1); broker::vector xs; xs.reserve(vv->Size()); diff --git a/src/broker/Store.cc b/src/broker/Store.cc index ea151b08c6..fbce52160f 100644 --- a/src/broker/Store.cc +++ b/src/broker/Store.cc @@ -67,7 +67,7 @@ broker::backend_options to_backend_options(broker::backend backend, switch ( backend ) { case broker::backend::sqlite: { - auto path = options->GetField(0)->AsRecordVal() + auto path = options->GetFieldAs(0) ->GetFieldAs(0)->CheckString(); return {{"path", path}}; } diff --git a/src/zeek.bif b/src/zeek.bif index 184c9280cb..91e0120ba7 100644 --- a/src/zeek.bif +++ b/src/zeek.bif @@ -3435,8 +3435,7 @@ function lookup_connection%(cid: conn_id%): connection %%{ const char* conn_id_string(zeek::Val* c) { - auto id = c->As()->GetField(0); - auto id_r = id->As(); + auto id_r = c->As()->GetFieldAs(0); const zeek::IPAddr& orig_h = id_r->GetFieldAs(0); uint32_t orig_p = id_r->GetFieldAs(1)->Port();