diff --git a/src/Reporter.cc b/src/Reporter.cc index 6c8b1981e9..0368f72478 100644 --- a/src/Reporter.cc +++ b/src/Reporter.cc @@ -14,6 +14,7 @@ #include "zeek/Event.h" #include "zeek/EventHandler.h" #include "zeek/Expr.h" +#include "zeek/Frame.h" #include "zeek/ID.h" #include "zeek/NetVar.h" #include "zeek/RunState.h" @@ -649,4 +650,10 @@ void Reporter::DoLog(const char* prefix, EventHandlerPtr event, FILE* out, Conne bool Reporter::EmitToStderr(bool flag) { return flag || ! run_state::detail::zeek_init_done; } +ScriptLocationScope::ScriptLocationScope(const zeek::detail::Frame* frame) { + zeek::reporter->PushLocation(frame->GetCallLocation()); +} + +ScriptLocationScope::~ScriptLocationScope() { zeek::reporter->PopLocation(); } + } // namespace zeek diff --git a/src/Reporter.h b/src/Reporter.h index d67a68c5a8..9c03920dce 100644 --- a/src/Reporter.h +++ b/src/Reporter.h @@ -31,8 +31,9 @@ using StringValPtr = IntrusivePtr; namespace detail { class AssertStmt; -class Location; class Expr; +class Frame; +class Location; } // namespace detail @@ -334,6 +335,20 @@ private: bool ignore_deprecations; }; +/** + * Helper class pushing the frame's call location onto + * the reporter's location stack, associating the caller's + * location with subsequent output. + * + * The frame's location must remain valid until the object + * is destroyed. + */ +class ScriptLocationScope { +public: + ScriptLocationScope(const zeek::detail::Frame* frame); + ~ScriptLocationScope(); +}; + extern Reporter* reporter; } // namespace zeek