diff --git a/src/ID.cc b/src/ID.cc index c72137d534..e7b7638a75 100644 --- a/src/ID.cc +++ b/src/ID.cc @@ -84,7 +84,7 @@ IntrusivePtr zeek::id::find_func(std::string_view name) reporter->InternalError("Expected variable '%s' to be a function", std::string(name).data()); - return {NewRef{}, v->AsFunc()}; + return v->AsFuncPtr(); } void zeek::id::detail::init() diff --git a/src/Val.cc b/src/Val.cc index 0f81712e73..bc7fd36d91 100644 --- a/src/Val.cc +++ b/src/Val.cc @@ -153,6 +153,12 @@ IntrusivePtr Val::DoClone(CloneState* state) return nullptr; } +IntrusivePtr Val::AsFuncPtr() const + { + CHECK_TAG(type->Tag(), TYPE_FUNC, "Val::Func", type_name) + return {NewRef{}, val.func_val}; + } + bool Val::IsZero() const { switch ( type->InternalType() ) { diff --git a/src/Val.h b/src/Val.h index fdaea07f5d..8bf278943d 100644 --- a/src/Val.h +++ b/src/Val.h @@ -257,6 +257,8 @@ public: ACCESSOR(TYPE_PATTERN, RE_Matcher*, re_val, AsPattern) ACCESSOR(TYPE_VECTOR, std::vector*, vector_val, AsVector) + IntrusivePtr AsFuncPtr() const; + const IPPrefix& AsSubNet() { CHECK_TAG(type->Tag(), TYPE_SUBNET, "Val::SubNet", type_name) diff --git a/src/option.bif b/src/option.bif index 9f3f359148..fd118ca5cc 100644 --- a/src/option.bif +++ b/src/option.bif @@ -206,7 +206,6 @@ function Option::set_change_handler%(ID: string, on_change: any, priority: int & return val_mgr->False(); } - auto* func = on_change->AsFunc(); - i->AddOptionHandler({NewRef{}, func}, -priority); + i->AddOptionHandler(on_change->AsFuncPtr(), -priority); return val_mgr->True(); %}