add DebugTrace for the current error

This commit is contained in:
Ben Burdette 2021-12-27 17:35:27 -07:00
parent 6801a423fc
commit 9760fa8661
5 changed files with 30 additions and 19 deletions

View file

@ -84,7 +84,7 @@ ref<EvalState> EvalCommand::getEvalState()
if (expr.staticenv) if (expr.staticenv)
{ {
auto vm = mapStaticEnvBindings(*expr.staticenv.get(), env); auto vm = mapStaticEnvBindings(*expr.staticenv.get(), env);
runRepl(evalState, &error, *vm); runRepl(evalState, &error, expr, *vm);
} }
}; };
} }

View file

@ -312,8 +312,10 @@ void printClosureDiff(
const StorePath & afterPath, const StorePath & afterPath,
std::string_view indent); std::string_view indent);
void runRepl( void runRepl(
ref<EvalState> evalState, ref<EvalState> evalState,
const Error *debugError, const Error *debugError,
const Expr &expr,
const std::map<std::string, Value *> & extraEnv); const std::map<std::string, Value *> & extraEnv);
} }

View file

@ -897,6 +897,7 @@ std::ostream & NixRepl::printValue(std::ostream & str, Value & v, unsigned int m
void runRepl( void runRepl(
ref<EvalState> evalState, ref<EvalState> evalState,
const Error *debugError, const Error *debugError,
const Expr &expr,
const std::map<std::string, Value *> & extraEnv) const std::map<std::string, Value *> & extraEnv)
{ {
auto repl = std::make_unique<NixRepl>(evalState); auto repl = std::make_unique<NixRepl>(evalState);
@ -905,6 +906,15 @@ void runRepl(
repl->initEnv(); repl->initEnv();
// tack on a final DebugTrace for the error position.
DebugTraceStacker ldts(
*evalState,
DebugTrace
{.pos = debugError->info().errPos,
.expr = expr,
.hint = debugError->info().msg
});
// add 'extra' vars. // add 'extra' vars.
std::set<std::string> names; std::set<std::string> names;
for (auto & [name, value] : extraEnv) { for (auto & [name, value] : extraEnv) {

View file

@ -38,21 +38,6 @@ namespace nix {
std::function<void(const Error & error, const Env & env, const Expr & expr)> debuggerHook; std::function<void(const Error & error, const Env & env, const Expr & expr)> debuggerHook;
class DebugTraceStacker {
public:
DebugTraceStacker(EvalState &evalState, DebugTrace t)
:evalState(evalState), trace(t)
{
evalState.debugTraces.push_front(t);
}
~DebugTraceStacker() {
// assert(evalState.debugTraces.front() == trace);
evalState.debugTraces.pop_front();
}
EvalState &evalState;
DebugTrace trace;
};
static char * dupString(const char * s) static char * dupString(const char * s)
{ {
char * t; char * t;
@ -701,7 +686,7 @@ void printStaticEnvBindings(const StaticEnv &se, int lvl)
std::cout << std::endl; std::cout << std::endl;
if (se.up) { if (se.up) {
printStaticEnvBindings(*se.up, ++lvl); printStaticEnvBindings(*se.up, ++lvl);
} }
} }

View file

@ -76,11 +76,10 @@ std::shared_ptr<RegexCache> makeRegexCache();
struct DebugTrace { struct DebugTrace {
std::optional<ErrPos> pos; std::optional<ErrPos> pos;
Expr &expr; const Expr &expr;
hintformat hint; hintformat hint;
}; };
class EvalState class EvalState
{ {
public: public:
@ -406,6 +405,21 @@ private:
friend void prim_match(EvalState & state, const Pos & pos, Value * * args, Value & v); friend void prim_match(EvalState & state, const Pos & pos, Value * * args, Value & v);
}; };
class DebugTraceStacker {
public:
DebugTraceStacker(EvalState &evalState, DebugTrace t)
:evalState(evalState), trace(t)
{
evalState.debugTraces.push_front(t);
}
~DebugTraceStacker()
{
// assert(evalState.debugTraces.front() == trace);
evalState.debugTraces.pop_front();
}
EvalState &evalState;
DebugTrace trace;
};
/* Return a string representing the type of the value `v'. */ /* Return a string representing the type of the value `v'. */
string showType(ValueType type); string showType(ValueType type);