diff --git a/NEWS b/NEWS index 5adb4009db..e0997318d4 100644 --- a/NEWS +++ b/NEWS @@ -89,6 +89,9 @@ Changed Functionality - ``TypeList::Types()`` and ``IndexType::IndexTypes()`` now return an ``std::vector`` instead of ``type_list*`` +- ``AsRecord()`` and ``AsNonConstRecord()`` have changed to return + ``std::vector>*``. + Removed Functionality --------------------- diff --git a/src/Sessions.cc b/src/Sessions.cc index f28f335968..101fc2100e 100644 --- a/src/Sessions.cc +++ b/src/Sessions.cc @@ -910,7 +910,7 @@ Connection* NetSessions::FindConnection(Val* v) return nullptr; RecordType* vr = vt->AsRecordType(); - const val_list* vl = v->AsRecord(); + auto vl = v->AsRecord(); int orig_h, orig_p; // indices into record's value list int resp_h, resp_p; diff --git a/src/Val.cc b/src/Val.cc index 2d642fc057..7d5f59c60e 100644 --- a/src/Val.cc +++ b/src/Val.cc @@ -2673,7 +2673,8 @@ RecordVal::RecordVal(IntrusivePtr t, bool init_fields) : Val(std::mo origin = nullptr; auto rt = GetType()->AsRecordType(); int n = rt->NumFields(); - val_list* vl = val.val_list_val = new val_list(n); + auto vl = val.record_val = new std::vector>; + vl->reserve(n); if ( is_parsing ) parse_time_records[rt].emplace_back(NewRef{}, this); @@ -2715,13 +2716,13 @@ RecordVal::RecordVal(IntrusivePtr t, bool init_fields) : Val(std::mo def = make_intrusive(cast_intrusive(type)); } - vl->push_back(def.release()); + vl->emplace_back(std::move(def)); } } RecordVal::~RecordVal() { - delete_vals(AsNonConstRecord()); + delete AsNonConstRecord(); } IntrusivePtr RecordVal::SizeVal() const @@ -2731,8 +2732,7 @@ IntrusivePtr RecordVal::SizeVal() const void RecordVal::Assign(int field, IntrusivePtr new_val) { - Val* old_val = AsNonConstRecord()->replace(field, new_val.release()); - Unref(old_val); + (*AsNonConstRecord())[field] = std::move(new_val); Modified(); } @@ -2743,15 +2743,15 @@ void RecordVal::Assign(int field, Val* new_val) Val* RecordVal::Lookup(int field) const { - return (*AsRecord())[field]; + return (*AsRecord())[field].get(); } IntrusivePtr RecordVal::LookupWithDefault(int field) const { - Val* val = (*AsRecord())[field]; + const auto& val = (*AsRecord())[field]; if ( val ) - return {NewRef{}, val}; + return val; return GetType()->AsRecordType()->FieldDefault(field); } @@ -2767,16 +2767,16 @@ void RecordVal::ResizeParseTimeRecords(RecordType* rt) for ( auto& rv : rvs ) { - auto vs = rv->val.val_list_val; - auto current_length = vs->length(); + auto vs = rv->val.record_val; + int current_length = vs->size(); auto required_length = rt->NumFields(); if ( required_length > current_length ) { - vs->resize(required_length); + vs->reserve(required_length); for ( auto i = current_length; i < required_length; ++i ) - vs->replace(i, rt->FieldDefault(i).release()); + vs->emplace_back(rt->FieldDefault(i)); } } } @@ -2876,8 +2876,8 @@ IntrusivePtr RecordVal::GetRecordFieldsVal() const void RecordVal::Describe(ODesc* d) const { - const val_list* vl = AsRecord(); - int n = vl->length(); + auto vl = AsRecord(); + auto n = vl->size(); auto record_type = GetType()->AsRecordType(); if ( d->IsBinary() || d->IsPortable() ) @@ -2890,7 +2890,7 @@ void RecordVal::Describe(ODesc* d) const else d->Add("["); - loop_over_list(*vl, i) + for ( size_t i = 0; i < n; ++i ) { if ( ! d->IsBinary() && i > 0 ) d->Add(", "); @@ -2900,7 +2900,8 @@ void RecordVal::Describe(ODesc* d) const if ( ! d->IsBinary() ) d->Add("="); - Val* v = (*vl)[i]; + const auto& v = (*vl)[i]; + if ( v ) v->Describe(d); else @@ -2913,14 +2914,14 @@ void RecordVal::Describe(ODesc* d) const void RecordVal::DescribeReST(ODesc* d) const { - const val_list* vl = AsRecord(); - int n = vl->length(); + auto vl = AsRecord(); + auto n = vl->size(); auto record_type = GetType()->AsRecordType(); d->Add("{"); d->PushIndent(); - loop_over_list(*vl, i) + for ( size_t i = 0; i < n; ++i ) { if ( i > 0 ) d->NL(); @@ -2928,7 +2929,7 @@ void RecordVal::DescribeReST(ODesc* d) const d->Add(record_type->FieldName(i)); d->Add("="); - Val* v = (*vl)[i]; + const auto& v = (*vl)[i]; if ( v ) v->Describe(d); @@ -2951,10 +2952,10 @@ IntrusivePtr RecordVal::DoClone(CloneState* state) rv->origin = nullptr; state->NewClone(this, rv); - for ( const auto& vlv : *val.val_list_val ) + for ( const auto& vlv : *val.record_val) { auto v = vlv ? vlv->Clone(state) : nullptr; - rv->val.val_list_val->push_back(v.release()); + rv->val.record_val->emplace_back(std::move(v)); } return rv; @@ -2963,15 +2964,17 @@ IntrusivePtr RecordVal::DoClone(CloneState* state) unsigned int RecordVal::MemoryAllocation() const { unsigned int size = 0; - const val_list* vl = AsRecord(); + const auto& vl = *AsRecord(); - for ( const auto& v : *vl ) + for ( const auto& v : vl ) { if ( v ) size += v->MemoryAllocation(); } - return size + padded_sizeof(*this) + val.val_list_val->MemoryAllocation(); + size += pad_size(vl.capacity() * sizeof(IntrusivePtr)); + size += padded_sizeof(vl); + return size + padded_sizeof(*this); } IntrusivePtr EnumVal::SizeVal() const diff --git a/src/Val.h b/src/Val.h index 61d8eab0f3..b635732f01 100644 --- a/src/Val.h +++ b/src/Val.h @@ -80,8 +80,7 @@ union BroValUnion { BroFile* file_val; RE_Matcher* re_val; PDict* table_val; - val_list* val_list_val; - + std::vector>* record_val; std::vector* vector_val; BroValUnion() = default; @@ -116,9 +115,6 @@ union BroValUnion { constexpr BroValUnion(PDict* value) noexcept : table_val(value) {} - constexpr BroValUnion(val_list* value) noexcept - : val_list_val(value) {} - constexpr BroValUnion(std::vector *value) noexcept : vector_val(value) {} }; @@ -222,7 +218,7 @@ public: CONST_ACCESSOR(TYPE_STRING, BroString*, string_val, AsString) CONST_ACCESSOR(TYPE_FUNC, Func*, func_val, AsFunc) CONST_ACCESSOR(TYPE_TABLE, PDict*, table_val, AsTable) - CONST_ACCESSOR(TYPE_RECORD, val_list*, val_list_val, AsRecord) + CONST_ACCESSOR(TYPE_RECORD, std::vector>*, record_val, AsRecord) CONST_ACCESSOR(TYPE_FILE, BroFile*, file_val, AsFile) CONST_ACCESSOR(TYPE_PATTERN, RE_Matcher*, re_val, AsPattern) CONST_ACCESSOR(TYPE_VECTOR, std::vector*, vector_val, AsVector) @@ -368,7 +364,7 @@ protected: {} ACCESSOR(TYPE_TABLE, PDict*, table_val, AsNonConstTable) - ACCESSOR(TYPE_RECORD, val_list*, val_list_val, AsNonConstRecord) + ACCESSOR(TYPE_RECORD, std::vector>*, record_val, AsNonConstRecord) // For internal use by the Val::Clone() methods. struct CloneState { diff --git a/src/zeek.bif b/src/zeek.bif index 6fd13e5139..5f7fb6dec3 100644 --- a/src/zeek.bif +++ b/src/zeek.bif @@ -3333,8 +3333,8 @@ function lookup_connection%(cid: conn_id%): connection %%{ const char* conn_id_string(Val* c) { - Val* id = (*(c->AsRecord()))[0]; - const val_list* vl = id->AsRecord(); + const auto& id = (*(c->AsRecord()))[0]; + auto vl = id->AsRecord(); const IPAddr& orig_h = (*vl)[0]->AsAddr(); uint32_t orig_p = (*vl)[1]->AsPortVal()->Port(); @@ -3459,7 +3459,7 @@ function dump_packet%(pkt: pcap_packet, file_name: string%) : bool uint32_t caplen, len, link_type; u_char *data; - const val_list* pkt_vl = pkt->AsRecord(); + auto pkt_vl = pkt->AsRecord(); ts.tv_sec = (*pkt_vl)[0]->AsCount(); ts.tv_usec = (*pkt_vl)[1]->AsCount();