From 3b6f60a8103d7e88d273f7d7713ab3b60908234c Mon Sep 17 00:00:00 2001 From: Jon Siwek Date: Thu, 21 May 2020 00:50:48 -0700 Subject: [PATCH] Add Val::AsFuncPtr() convenience method Since it's not trivial to store IntrusivePtr in BroValUnion and also not satisfying to store IntrusivePtr*. --- src/ID.cc | 2 +- src/Val.cc | 6 ++++++ src/Val.h | 2 ++ src/option.bif | 3 +-- 4 files changed, 10 insertions(+), 3 deletions(-) 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(); %}