libexpr: show expression in assertion errors

Includes the expression of the condition in the assertion message if
the assertion failed, making assertions much easier to debug. eg.

    error: assertion (withPython -> (python2Packages != null)) failed at pkgs/tools/security/nmap/default.nix:11:1
This commit is contained in:
Daiderd Jordan 2020-01-11 15:06:57 +01:00
parent 6f046fa39e
commit 307bcb9a8e
No known key found for this signature in database
GPG key ID: D02435D05B810C96

View file

@ -531,9 +531,9 @@ LocalNoInlineNoReturn(void throwTypeError(const char * s, const ExprLambda & fun
throw TypeError(format(s) % fun.showNamePos() % s2 % pos); throw TypeError(format(s) % fun.showNamePos() % s2 % pos);
} }
LocalNoInlineNoReturn(void throwAssertionError(const char * s, const Pos & pos)) LocalNoInlineNoReturn(void throwAssertionError(const char * s, const string & s1, const Pos & pos))
{ {
throw AssertionError(format(s) % pos); throw AssertionError(format(s) % s1 % pos);
} }
LocalNoInlineNoReturn(void throwUndefinedVarError(const char * s, const string & s1, const Pos & pos)) LocalNoInlineNoReturn(void throwUndefinedVarError(const char * s, const string & s1, const Pos & pos))
@ -1262,8 +1262,11 @@ void ExprIf::eval(EvalState & state, Env & env, Value & v)
void ExprAssert::eval(EvalState & state, Env & env, Value & v) void ExprAssert::eval(EvalState & state, Env & env, Value & v)
{ {
if (!state.evalBool(env, cond, pos)) if (!state.evalBool(env, cond, pos)) {
throwAssertionError("assertion failed at %1%", pos); std::ostringstream out;
cond->show(out);
throwAssertionError("assertion %1% failed at %2%", out.str(), pos);
}
body->eval(state, env, v); body->eval(state, env, v);
} }