diff --git a/src/Attr.cc b/src/Attr.cc index 7e8b4f94ad..3afbc9fcee 100644 --- a/src/Attr.cc +++ b/src/Attr.cc @@ -492,12 +492,12 @@ void Attributes::CheckAttr(Attr* a) break; } - const Expr *change_func = a->AttrExpr(); + const Expr* change_func = a->AttrExpr(); if ( change_func->Type()->Tag() != TYPE_FUNC || change_func->Type()->AsFuncType()->Flavor() != FUNC_FLAVOR_FUNCTION ) Error("&on_change attribute is not a function"); - const FuncType *c_ft = change_func->Type()->AsFuncType(); + const FuncType* c_ft = change_func->Type()->AsFuncType(); if ( c_ft->YieldType()->Tag() != TYPE_VOID ) { @@ -505,7 +505,7 @@ void Attributes::CheckAttr(Attr* a) break; } - const TableType *the_table = type->AsTableType(); + const TableType* the_table = type->AsTableType(); if (the_table->IsUnspecifiedTable()) break; diff --git a/src/Val.cc b/src/Val.cc index d1145c245c..62a40a6a50 100644 --- a/src/Val.cc +++ b/src/Val.cc @@ -1479,11 +1479,9 @@ int TableVal::Assign(Val* index, HashKey* k, Val* new_val) if ( change_func ) { - auto change_index = index->Ref(); - if ( ! change_index ) - RecoverIndex(&k_copy); - Val *v = old_entry_val ? old_entry_val->Value() : new_val; - CallChangeFunc(change_index, v, old_entry_val ? element_changed : element_new); + Val* change_index = index ? index->Ref() : RecoverIndex(&k_copy); + Val* v = old_entry_val ? old_entry_val->Value() : new_val; + CallChangeFunc(change_index, v, old_entry_val ? ELEMENT_CHANGED : ELEMENT_NEW); Unref(change_index); } @@ -1953,7 +1951,7 @@ void TableVal::CallChangeFunc(const Val* index, Val* old_value, OnChangeType tpe try { - Val* thefunc = change_func->Eval(0); + IntrusivePtr thefunc{change_func->Eval(nullptr), false}; if ( ! thefunc ) { @@ -1963,7 +1961,6 @@ void TableVal::CallChangeFunc(const Val* index, Val* old_value, OnChangeType tpe if ( thefunc->Type()->Tag() != TYPE_FUNC ) { thefunc->Error("not a function"); - Unref(thefunc); return; } @@ -1972,16 +1969,16 @@ void TableVal::CallChangeFunc(const Val* index, Val* old_value, OnChangeType tpe EnumVal* type = nullptr; switch ( tpe ) { - case element_new: + case ELEMENT_NEW: type = BifType::Enum::TableChange->GetVal(BifEnum::TableChange::TABLE_ELEMENT_NEW); break; - case element_changed: + case ELEMENT_CHANGED: type = BifType::Enum::TableChange->GetVal(BifEnum::TableChange::TABLE_ELEMENT_CHANGED); break; - case element_removed: + case ELEMENT_REMOVED: type = BifType::Enum::TableChange->GetVal(BifEnum::TableChange::TABLE_ELEMENT_REMOVED); break; - case element_expired: + case ELEMENT_EXPIRED: type = BifType::Enum::TableChange->GetVal(BifEnum::TableChange::TABLE_ELEMENT_EXPIRED); } vl.append(type); @@ -1994,7 +1991,6 @@ void TableVal::CallChangeFunc(const Val* index, Val* old_value, OnChangeType tpe in_change_func = true; f->Call(&vl); - Unref(thefunc); } catch ( InterpreterException& e ) { @@ -2018,7 +2014,7 @@ Val* TableVal::Delete(const Val* index) Modified(); if ( change_func ) - CallChangeFunc(index, va, element_removed); + CallChangeFunc(index, va, ELEMENT_REMOVED); return va; } @@ -2040,10 +2036,10 @@ Val* TableVal::Delete(const HashKey* k) Modified(); - if ( change_func ) + if ( change_func && va ) { auto index = table_hash->RecoverVals(k); - CallChangeFunc(index, va->Ref(), element_removed); + CallChangeFunc(index, va->Ref(), ELEMENT_REMOVED); Unref(index); } @@ -2345,7 +2341,7 @@ void TableVal::DoExpire(double t) { if ( ! idx ) idx = RecoverIndex(k); - CallChangeFunc(idx, v->Value(), element_expired); + CallChangeFunc(idx, v->Value(), ELEMENT_EXPIRED); } Unref(idx); Unref(v->Value()); diff --git a/src/Val.h b/src/Val.h index d1a7804754..bbb7cc84d6 100644 --- a/src/Val.h +++ b/src/Val.h @@ -847,7 +847,7 @@ protected: double CallExpireFunc(Val *idx); // Enum for the different kinds of changes an &on_change handler can see - enum OnChangeType { element_new, element_changed, element_removed, element_expired }; + enum OnChangeType { ELEMENT_NEW, ELEMENT_CHANGED, ELEMENT_REMOVED, ELEMENT_EXPIRED }; // Calls &change_func. Does not take ownership of values. (Refs if needed). void CallChangeFunc(const Val* index, Val* old_value, OnChangeType tpe);