diff --git a/src/Expr.cc b/src/Expr.cc index f4a49b8bc2..c2461cddfd 100644 --- a/src/Expr.cc +++ b/src/Expr.cc @@ -2581,7 +2581,7 @@ void IndexExpr::Delete(Frame* f) if ( ! v2 ) return; - Unref(v1->AsTableVal()->Delete(v2.get())); + v1->AsTableVal()->Delete(v2.get()); } IntrusivePtr IndexExpr::MakeLvalue() diff --git a/src/Val.cc b/src/Val.cc index 4eab5bd98d..6def2dbaa0 100644 --- a/src/Val.cc +++ b/src/Val.cc @@ -1598,7 +1598,7 @@ int TableVal::RemoveFrom(Val* val) const // OTOH, they are both the same type, so as long as // we don't have hash keys that are keyed per dictionary, // it should work ... - Unref(t->Delete(k)); + t->Delete(k); delete k; } @@ -2000,7 +2000,7 @@ void TableVal::CallChangeFunc(const Val* index, Val* old_value, OnChangeType tpe in_change_func = false; } -Val* TableVal::Delete(const Val* index) +IntrusivePtr TableVal::Delete(const Val* index) { HashKey* k = ComputeHash(index); TableEntryVal* v = k ? AsNonConstTable()->RemoveEntry(k) : 0; @@ -2017,10 +2017,10 @@ Val* TableVal::Delete(const Val* index) if ( change_func ) CallChangeFunc(index, va.get(), ELEMENT_REMOVED); - return va.release(); + return va; } -Val* TableVal::Delete(const HashKey* k) +IntrusivePtr TableVal::Delete(const HashKey* k) { TableEntryVal* v = AsNonConstTable()->RemoveEntry(k); IntrusivePtr va{NewRef{}, v ? (v->Value() ? v->Value() : this) : nullptr}; @@ -2042,7 +2042,7 @@ Val* TableVal::Delete(const HashKey* k) CallChangeFunc(index.get(), va.get(), ELEMENT_REMOVED); } - return va.release(); + return va; } ListVal* TableVal::ConvertToList(TypeTag t) const diff --git a/src/Val.h b/src/Val.h index f785943547..9a97227b9d 100644 --- a/src/Val.h +++ b/src/Val.h @@ -769,8 +769,8 @@ public: ListVal* RecoverIndex(const HashKey* k) const; // Returns the element if it was in the table, false otherwise. - Val* Delete(const Val* index); - Val* Delete(const HashKey* k); + IntrusivePtr Delete(const Val* index); + IntrusivePtr Delete(const HashKey* k); // Returns a ListVal representation of the table (which must be a set). ListVal* ConvertToList(TypeTag t=TYPE_ANY) const; diff --git a/src/input/Manager.cc b/src/input/Manager.cc index c9f12bd778..2b57130fbf 100644 --- a/src/input/Manager.cc +++ b/src/input/Manager.cc @@ -1423,7 +1423,7 @@ void Manager::EndCurrentSend(ReaderFrontend* reader) if ( ev ) Unref(ev); - Unref(stream->tab->Delete(ih->idxkey)); + stream->tab->Delete(ih->idxkey); stream->lastDict->Remove(lastDictIdxKey); // delete in next line delete lastDictIdxKey; delete(ih); @@ -1790,12 +1790,10 @@ bool Manager::Delete(ReaderFrontend* reader, Value* *vals) // only if stream = true -> no streaming if ( streamresult ) { - Val* retptr = stream->tab->Delete(idxval); + auto retptr = stream->tab->Delete(idxval); success = ( retptr != 0 ); if ( ! success ) Warning(i, "Internal error while deleting values from input table"); - else - Unref(retptr); } }