diff --git a/src/Func.h b/src/Func.h index 2775819181..191a766218 100644 --- a/src/Func.h +++ b/src/Func.h @@ -63,12 +63,6 @@ public: ~Func() override; - zeek::detail::ScriptFunc* AsScriptFunc() - { return GetKind() == SCRIPT_FUNC ? (detail::ScriptFunc*) this : nullptr; } - - const zeek::detail::ScriptFunc* AsScriptFunc() const - { return GetKind() == SCRIPT_FUNC ? (detail::ScriptFunc*) this : nullptr; } - virtual bool IsPure() const = 0; FunctionFlavor Flavor() const { return GetType()->Flavor(); } diff --git a/src/Var.cc b/src/Var.cc index 1dd55c822c..e0962a9d01 100644 --- a/src/Var.cc +++ b/src/Var.cc @@ -738,10 +738,10 @@ void end_func(StmtPtr body) ingredients->id->SetConst(); } - auto func = ingredients->id->GetVal()->AsFunc()->AsScriptFunc(); + auto func = cast_intrusive(ingredients->id->GetVal()->AsFuncPtr()); func->SetScope(ingredients->scope); - analyze_func({NewRef{}, func}); + analyze_func(std::move(func)); // Note: ideally, something would take ownership of this memory until the // end of script execution, but that's essentially the same as the diff --git a/src/script_opt/Inline.cc b/src/script_opt/Inline.cc index b4387af010..fdd0c8ec11 100644 --- a/src/script_opt/Inline.cc +++ b/src/script_opt/Inline.cc @@ -175,11 +175,13 @@ ExprPtr Inliner::CheckForInlining(IntrusivePtr c) if ( ! func_v ) return c; - auto func_vf = func_v->AsFunc()->AsScriptFunc(); + auto function = func_v->AsFunc(); - if ( ! func_vf ) + if ( function->GetKind() != Func::SCRIPT_FUNC ) return c; + auto func_vf = static_cast(function); + if ( inline_ables.count(func_vf) == 0 ) return c; diff --git a/src/script_opt/ProfileFunc.cc b/src/script_opt/ProfileFunc.cc index d6f37c085d..68d837acbb 100644 --- a/src/script_opt/ProfileFunc.cc +++ b/src/script_opt/ProfileFunc.cc @@ -146,10 +146,10 @@ TraversalCode ProfileFunc::PreExpr(const Expr* e) if ( func_v ) { auto func_vf = func_v->AsFunc(); - auto bf = func_vf->AsScriptFunc(); - if ( bf ) + if ( func_vf->GetKind() == Func::SCRIPT_FUNC ) { + auto bf = static_cast(func_vf); script_calls.insert(bf); if ( in_when )