Add builtin_exception() functions

These work like builtin_error(), but also throw an InterpreterException
This commit is contained in:
Jon Siwek 2020-06-24 22:54:46 -07:00
parent 9f16fa6474
commit 2b698c4e1b
2 changed files with 57 additions and 15 deletions

View file

@ -663,29 +663,50 @@ void BuiltinFunc::Describe(ODesc* d) const
d->AddCount(is_pure); d->AddCount(is_pure);
} }
void builtin_error(const char* msg) static void builtin_error_common(const char* msg, BroObj* arg, bool unwind)
{
builtin_error(msg, IntrusivePtr<Val>{});
}
void builtin_error(const char* msg, IntrusivePtr<Val> arg)
{
builtin_error(msg, arg.get());
}
void builtin_error(const char* msg, BroObj* arg)
{ {
auto emit = [=](const zeek::detail::CallExpr* ce) auto emit = [=](const zeek::detail::CallExpr* ce)
{ {
if ( ce ) if ( ce )
ce->Error(msg, arg); {
if ( unwind )
{
if ( arg )
{
ODesc d;
arg->Describe(&d);
reporter->ExprRuntimeError(ce, "%s (%s), during call:", msg,
d.Description());
}
else
reporter->ExprRuntimeError(ce, "%s", msg);
}
else
ce->Error(msg, arg);
}
else else
reporter->Error(msg, arg); {
if ( arg )
{
if ( unwind )
reporter->RuntimeError(arg->GetLocationInfo(), "%s", msg);
else
arg->Error(msg);
}
else
{
if ( unwind )
reporter->RuntimeError(nullptr, "%s", msg);
else
reporter->Error("%s", msg);
}
}
}; };
if ( call_stack.empty() ) if ( call_stack.empty() )
{ {
// Shouldn't happen unless someone (mistakenly) calls builtin_error()
// from somewhere that's not even evaluating script-code.
emit(nullptr); emit(nullptr);
return; return;
} }
@ -739,6 +760,24 @@ void builtin_error(const char* msg, BroObj* arg)
emit(last_call.call); emit(last_call.call);
} }
void builtin_error(const char* msg)
{ builtin_error_common(msg, nullptr, false); }
void builtin_error(const char* msg, const IntrusivePtr<Val>& arg)
{ builtin_error_common(msg, arg.get(), false); }
void builtin_error(const char* msg, BroObj* arg)
{ builtin_error_common(msg, arg, false); }
void builtin_exception(const char* msg)
{ builtin_error_common(msg, nullptr, true); }
void builtin_exception(const char* msg, const IntrusivePtr<Val>& arg)
{ builtin_error_common(msg, arg.get(), true); }
void builtin_exception(const char* msg, BroObj* arg)
{ builtin_error_common(msg, arg, true); }
#include "zeek.bif.func_h" #include "zeek.bif.func_h"
#include "stats.bif.func_h" #include "stats.bif.func_h"
#include "reporter.bif.func_h" #include "reporter.bif.func_h"

View file

@ -236,8 +236,11 @@ protected:
extern void builtin_error(const char* msg); extern void builtin_error(const char* msg);
extern void builtin_error(const char* msg, IntrusivePtr<Val>); extern void builtin_error(const char* msg, const IntrusivePtr<Val>& arg);
extern void builtin_error(const char* msg, BroObj* arg); extern void builtin_error(const char* msg, BroObj* arg);
extern void builtin_exception(const char* msg);
extern void builtin_exception(const char* msg, const IntrusivePtr<Val>& arg);
extern void builtin_exception(const char* msg, BroObj* arg);
extern void init_builtin_funcs(); extern void init_builtin_funcs();
extern void init_builtin_funcs_subdirs(); extern void init_builtin_funcs_subdirs();