From c757db2714b9cf7fb44e9a69097a5c7b2d2da5bc Mon Sep 17 00:00:00 2001 From: Vern Paxson Date: Thu, 25 Feb 2021 15:04:46 -0800 Subject: [PATCH] new RecordVal Remove() method to clear a field --- src/Val.cc | 18 ++++++++++++------ src/Val.h | 7 +++++++ 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/src/Val.cc b/src/Val.cc index 2068092cbf..b08855f8ea 100644 --- a/src/Val.cc +++ b/src/Val.cc @@ -2879,23 +2879,29 @@ ValPtr RecordVal::SizeVal() const void RecordVal::Assign(int field, ValPtr new_val) { - auto t = rt->GetFieldType(field); - if ( new_val ) { + auto t = rt->GetFieldType(field); (*record_val)[field] = ZVal(new_val, t); (*is_in_record)[field] = true; + Modified(); } else + Remove(field); + } + +void RecordVal::Remove(int field) + { + if ( HasField(field) ) { - if ( HasField(field) ) - DeleteIfManaged((*record_val)[field], t); + auto t = rt->GetFieldType(field); + DeleteIfManaged((*record_val)[field], t); (*record_val)[field] = ZVal(); (*is_in_record)[field] = false; - } - Modified(); + Modified(); + } } ValPtr RecordVal::GetFieldOrDefault(int field) const diff --git a/src/Val.h b/src/Val.h index 7825869274..65635d8d15 100644 --- a/src/Val.h +++ b/src/Val.h @@ -1061,6 +1061,13 @@ public: void Assign(int field, Ts&&... args) { Assign(field, make_intrusive(std::forward(args)...)); } + /** + * Sets the given record field to not-in-record. Equivalent to + * Assign using a nil ValPtr. + * @param field The field index to remove. + */ + void Remove(int field); + /** * Appends a value to the record's fields. The caller is responsible * for ensuring that fields are appended in the correct order and