diff --git a/src/CompHash.cc b/src/CompHash.cc index f6f982685d..e403036fff 100644 --- a/src/CompHash.cc +++ b/src/CompHash.cc @@ -229,7 +229,7 @@ char* CompositeHash::SingleValHash(bool type_check, char* kp0, while ( tbl->NextEntry(k, it) ) { hashkeys[k] = idx++; - lv->Append(tv->RecoverIndex(k).release()); + lv->Append(tv->RecoverIndex(k)); } for ( auto& kv : hashkeys ) @@ -349,9 +349,8 @@ HashKey* CompositeHash::ComputeHash(const Val* v, bool type_check) const // re-introduce const on the recursive call, it should // be okay; the only thing is that the ListVal unref's it. Val* ncv = (Val*) v; - ncv->Ref(); - lv.Append(ncv); - HashKey* hk = ComputeHash(&lv, type_check); + lv.Append({NewRef{}, ncv}); + HashKey* hk = ComputeHash(&lv, type_check); return hk; } @@ -726,7 +725,7 @@ IntrusivePtr CompositeHash::RecoverVals(const HashKey* k) const IntrusivePtr v; kp = RecoverOneVal(k, kp, k_end, type, &v, false); ASSERT(v); - l->Append(v.release()); + l->Append(std::move(v)); } if ( kp != k_end ) @@ -1016,7 +1015,7 @@ const char* CompositeHash::RecoverOneVal(const HashKey* k, const char* kp0, IntrusivePtr v; BroType* it = (*tl->Types())[i]; kp1 = RecoverOneVal(k, kp1, k_end, it, &v, false); - lv->Append(v.release()); + lv->Append(std::move(v)); } *pval = std::move(lv); diff --git a/src/DNS_Mgr.cc b/src/DNS_Mgr.cc index fcd3cd7eb5..e40c06e1dd 100644 --- a/src/DNS_Mgr.cc +++ b/src/DNS_Mgr.cc @@ -285,7 +285,7 @@ IntrusivePtr DNS_Mapping::Addrs() auto addrs_val = make_intrusive(TYPE_ADDR); for ( int i = 0; i < num_addrs; ++i ) - addrs_val->Append(new AddrVal(addrs[i])); + addrs_val->Append(make_intrusive(addrs[i])); } return addrs_val; @@ -478,7 +478,7 @@ static IntrusivePtr fake_name_lookup_result(const char* name) hash128_t hash; KeyedHash::StaticHash128(name, strlen(name), &hash); auto hv = make_intrusive(TYPE_ADDR); - hv->Append(new AddrVal(reinterpret_cast(&hash))); + hv->Append(make_intrusive(reinterpret_cast(&hash))); return hv->ToSetVal(); } @@ -900,7 +900,7 @@ IntrusivePtr DNS_Mgr::AddrListDelta(ListVal* al1, ListVal* al2) if ( j >= al2->Length() ) // Didn't find it. - delta->Append(al1->Index(i)->Ref()); + delta->Append({NewRef{}, al1->Index(i)}); } return delta; diff --git a/src/Expr.cc b/src/Expr.cc index eaa94ea4e6..468efeb114 100644 --- a/src/Expr.cc +++ b/src/Expr.cc @@ -3830,13 +3830,13 @@ IntrusivePtr FlattenExpr::Fold(Val* v) const { if ( Val* fv = rv->Lookup(i) ) { - l->Append(fv->Ref()); + l->Append({NewRef{}, fv}); continue; } const RecordType* rv_t = rv->Type()->AsRecordType(); if ( const Attr* fa = rv_t->FieldDecl(i)->FindAttr(ATTR_DEFAULT) ) - l->Append(fa->AttrExpr()->Eval(nullptr).release()); + l->Append(fa->AttrExpr()->Eval(nullptr)); else RuntimeError("missing field value"); @@ -4478,7 +4478,7 @@ IntrusivePtr ListExpr::Eval(Frame* f) const return nullptr; } - v->Append(ev.release()); + v->Append(std::move(ev)); } return v; @@ -4570,7 +4570,7 @@ IntrusivePtr ListExpr::InitVal(const BroType* t, IntrusivePtr aggr) co if ( ! vi ) return nullptr; - v->Append(vi.release()); + v->Append(std::move(vi)); } return v; @@ -4601,7 +4601,7 @@ IntrusivePtr ListExpr::InitVal(const BroType* t, IntrusivePtr aggr) co if ( ! vi ) return nullptr; - v->Append(vi.release()); + v->Append(std::move(vi)); } return v; diff --git a/src/Val.cc b/src/Val.cc index aba7d6722b..c6af0d4be1 100644 --- a/src/Val.cc +++ b/src/Val.cc @@ -1214,7 +1214,7 @@ RE_Matcher* ListVal::BuildRE() const return re; } -void ListVal::Append(Val* v) +void ListVal::Append(IntrusivePtr v) { if ( type->AsTypeList()->IsPure() ) { @@ -1222,8 +1222,14 @@ void ListVal::Append(Val* v) Internal("heterogeneous list in ListVal::Append"); } - vals.push_back(v); - type->AsTypeList()->Append({NewRef{}, v->Type()}); + auto vt = v->Type(); + vals.push_back(v.release()); + type->AsTypeList()->Append({NewRef{}, vt}); + } + +void ListVal::Append(Val* v) + { + Append({AdoptRef{}, v}); } IntrusivePtr ListVal::ToSetVal() const @@ -1280,7 +1286,7 @@ IntrusivePtr ListVal::DoClone(CloneState* state) state->NewClone(this, lv); for ( const auto& val : vals ) - lv->Append(val->Clone(state).release()); + lv->Append(val->Clone(state)); return lv; } @@ -2116,14 +2122,14 @@ ListVal* TableVal::ConvertToList(TypeTag t) const auto index = table_hash->RecoverVals(k); if ( t == TYPE_ANY ) - l->Append(index.release()); + l->Append(std::move(index)); else { // We're expecting a pure list, flatten the ListVal. if ( index->Length() != 1 ) InternalWarning("bad index in TableVal::ConvertToList"); - l->Append(index->Index(0)->Ref()); + l->Append({NewRef{}, index->Index(0)}); } delete k; @@ -2249,9 +2255,9 @@ bool TableVal::ExpandCompoundAndInit(val_list* vl, int k, IntrusivePtr new_ loop_over_list(*vl, j) { if ( j == k ) - expd->Append(ind_k_i->Ref()); + expd->Append({NewRef{}, ind_k_i}); else - expd->Append((*vl)[j]->Ref()); + expd->Append({NewRef{}, (*vl)[j]}); } if ( ! ExpandAndInit(std::move(expd), new_val) ) diff --git a/src/Val.h b/src/Val.h index 0ba76d7e33..9e7d2b7dee 100644 --- a/src/Val.h +++ b/src/Val.h @@ -641,6 +641,13 @@ public: // The return RE_Matcher has not yet been compiled. RE_Matcher* BuildRE() const; + /** + * Appends a value to the list. + * @param v the value to append. + */ + void Append(IntrusivePtr v); + + [[deprecated("Remove in v4.1. Use Append(IntrusivePtr) instead.")]] void Append(Val* v); // Returns a Set representation of the list (which must be homogeneous). diff --git a/src/broker/Data.cc b/src/broker/Data.cc index ecea94861a..6e27cc7dd5 100644 --- a/src/broker/Data.cc +++ b/src/broker/Data.cc @@ -252,7 +252,7 @@ struct val_converter { if ( ! index_val ) return nullptr; - list_val->Append(index_val.release()); + list_val->Append(std::move(index_val)); } @@ -312,7 +312,7 @@ struct val_converter { if ( ! index_val ) return nullptr; - list_val->Append(index_val.release()); + list_val->Append(std::move(index_val)); } auto value_val = bro_broker::data_to_val(move(item.second), diff --git a/src/file_analysis/AnalyzerSet.cc b/src/file_analysis/AnalyzerSet.cc index 3ea6f5f925..1a7941a026 100644 --- a/src/file_analysis/AnalyzerSet.cc +++ b/src/file_analysis/AnalyzerSet.cc @@ -164,8 +164,8 @@ bool AnalyzerSet::RemoveMod::Perform(AnalyzerSet* set) HashKey* AnalyzerSet::GetKey(const file_analysis::Tag& t, RecordVal* args) const { ListVal* lv = new ListVal(TYPE_ANY); - lv->Append(t.AsEnumVal()->Ref()); - lv->Append(args->Ref()); + lv->Append({NewRef{}, t.AsEnumVal()}); + lv->Append({NewRef{}, args}); HashKey* key = analyzer_hash->ComputeHash(lv, true); Unref(lv); if ( ! key ) diff --git a/src/input/Manager.cc b/src/input/Manager.cc index dcbc4f53c0..1947015b8f 100644 --- a/src/input/Manager.cc +++ b/src/input/Manager.cc @@ -1010,7 +1010,7 @@ Val* Manager::RecordValToIndexVal(RecordVal *r) const { auto l = make_intrusive(TYPE_ANY); for ( int j = 0 ; j < num_fields; j++ ) - l->Append(r->LookupWithDefault(j).release()); + l->Append(r->LookupWithDefault(j)); idxval = std::move(l); } @@ -1037,11 +1037,11 @@ Val* Manager::ValueToIndexVal(const Stream* i, int num_fields, const RecordType for ( int j = 0 ; j < type->NumFields(); j++ ) { if ( type->FieldType(j)->Tag() == TYPE_RECORD ) - l->Append(ValueToRecordVal(i, vals, - type->FieldType(j)->AsRecordType(), &position, have_error)); + l->Append({AdoptRef{}, ValueToRecordVal(i, vals, + type->FieldType(j)->AsRecordType(), &position, have_error)}); else { - l->Append(ValueToVal(i, vals[position], type->FieldType(j), have_error)); + l->Append({AdoptRef{}, ValueToVal(i, vals[position], type->FieldType(j), have_error)}); position++; } } diff --git a/src/zeek.bif b/src/zeek.bif index f3b498e80c..be60804d7d 100644 --- a/src/zeek.bif +++ b/src/zeek.bif @@ -3524,7 +3524,7 @@ public: else { ListVal* lv = new ListVal(TYPE_ADDR); - lv->Append(new AddrVal("0.0.0.0")); + lv->Append(make_intrusive("0.0.0.0")); auto result = lv->ToSetVal(); trigger->Cache(call, result.get()); Unref(lv);