aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/libexpr/eval.cc93
1 files changed, 31 insertions, 62 deletions
diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc
index 15eaef667..d7deb550e 100644
--- a/src/libexpr/eval.cc
+++ b/src/libexpr/eval.cc
@@ -49,10 +49,8 @@ class DebugTraceStacker {
// assert(evalState.debugTraces.front() == trace);
evalState.debugTraces.pop_front();
}
-
EvalState &evalState;
Trace trace;
-
};
static char * dupString(const char * s)
@@ -882,8 +880,7 @@ LocalNoInlineNoReturn(void throwUndefinedVarError(const Pos & pos, const char *
});
if (debuggerHook && expr) {
-
- std::cout << "throwUndefinedVarError debuggerHook" << std::endl;
+ std::cout << "throwUndefinedVarError debuggerHook" << std::endl;
debuggerHook(error, env, *expr);
}
@@ -913,15 +910,17 @@ LocalNoInline(void addErrorTrace(Error & e, const Pos & pos, const char * s, con
e.addTrace(pos, s, s2);
}
-// LocalNoInline(void makeErrorTrace(Error & e, const char * s, const string & s2))
-// {
-// Trace { .pos = e, .hint = hint }
-// }
+LocalNoInline(std::unique_ptr<DebugTraceStacker>
+ makeDebugTraceStacker(EvalState &state, std::optional<ErrPos> pos, const char * s, const string & s2))
+{
+ return std::unique_ptr<DebugTraceStacker>(
+ new DebugTraceStacker(
+ state,
+ Trace {.pos = pos,
+ .hint = hintfmt(s, s2)
+ }));
+}
-// LocalNoInline(void makeErrorTrace(Error & e, const Pos & pos, const char * s, const string & s2))
-// {
-// return Trace { .pos = e, .hint = hintfmt(s, s2); };
-// }
void mkString(Value & v, const char * s)
{
@@ -1127,20 +1126,6 @@ void EvalState::resetFileCache()
fileParseCache.clear();
}
-// class DebugTraceStacker {
-// DebugTraceStacker(std::ref<EvalState> evalState, std::ref<Trace> t)
-// :evalState(evalState), trace(t)
-// {
-// evalState->debugTraces.push_front(t);
-// }
-// ~DebugTraceStacker() {
-// assert(evalState->debugTraces.pop_front() == trace);
-// }
-
-// std::ref<EvalState> evalState;
-// std::ref<Trace> trace;
-
-// };
@@ -1154,15 +1139,14 @@ void EvalState::cacheFile(
fileParseCache[resolvedPath] = e;
try {
- std::unique_ptr<DebugTraceStacker> dts = debuggerHook ?
- std::unique_ptr<DebugTraceStacker>(new DebugTraceStacker(*this,
- Trace { .pos = (e->getPos() ? std::optional(ErrPos(*e->getPos())) : std::nullopt),
- .hint = hintfmt("while evaluating the file '%1%':", resolvedPath)
- }
- )) : std::unique_ptr<DebugTraceStacker>();
+ std::unique_ptr<DebugTraceStacker> dts =
+ debuggerHook ?
+ makeDebugTraceStacker(
+ *this,
+ (e->getPos() ? std::optional(ErrPos(*e->getPos())) : std::nullopt),
+ "while evaluating the file '%1%':", resolvedPath)
+ : std::unique_ptr<DebugTraceStacker>();
- // Trace( .pos = (e->getPos() ? std::optional(ErrPos(*e->getPos())):
- // std::nullopt), hintfmt("while evaluating the file '%1%':", resolvedPath));
// Enforce that 'flake.nix' is a direct attrset, not a
// computation.
if (mustBeTrivial &&
@@ -1387,16 +1371,13 @@ void ExprSelect::eval(EvalState & state, Env & env, Value & v)
e->eval(state, env, vTmp);
try {
- std::unique_ptr<DebugTraceStacker> dts =
- debuggerHook ?
- std::unique_ptr<DebugTraceStacker>(
- new DebugTraceStacker(
- state,
- Trace { .pos = *pos2,
- .hint = hintfmt(
- "while evaluating the attribute '%1%'",
- showAttrPath(state, env, attrPath))
- }))
+ std::unique_ptr<DebugTraceStacker> dts =
+ debuggerHook ?
+ makeDebugTraceStacker(
+ state,
+ *pos2,
+ "while evaluating the attribute '%1%'",
+ showAttrPath(state, env, attrPath))
: std::unique_ptr<DebugTraceStacker>();
for (auto & i : attrPath) {
@@ -1541,21 +1522,15 @@ void EvalState::callFunction(Value & fun, size_t nrArgs, Value * * args, Value &
/* Evaluate the body. */
try {
- std::unique_ptr<DebugTraceStacker> dts =
- debuggerHook ?
- std::unique_ptr<DebugTraceStacker>(
- new DebugTraceStacker(
- *this,
- Trace {.pos = lambda.pos,
- .hint = hintfmt(
+ std::unique_ptr<DebugTraceStacker> dts =
+ debuggerHook ?
+ makeDebugTraceStacker(*this, lambda.pos,
"while evaluating %s",
(lambda.name.set()
? "'" + (string) lambda.name + "'"
: "anonymous lambda"))
- }))
: std::unique_ptr<DebugTraceStacker>();
-
lambda.body->eval(*this, env2, vCur);
} catch (Error & e) {
std::cout << "eval showErrorInfo showTrace: " << loggerSettings.showTrace.get() << std::endl;
@@ -1950,18 +1925,12 @@ void EvalState::forceValueDeep(Value & v)
if (v.type() == nAttrs) {
for (auto & i : *v.attrs)
try {
- std::unique_ptr<DebugTraceStacker> dts =
- debuggerHook ?
- std::unique_ptr<DebugTraceStacker>(
- new DebugTraceStacker(
- *this,
- Trace { .pos = *i.pos,
- .hint = hintfmt(
+ std::unique_ptr<DebugTraceStacker> dts =
+ debuggerHook ?
+ makeDebugTraceStacker(*this, *i.pos,
"while evaluating the attribute '%1%'", i.name)
- }))
: std::unique_ptr<DebugTraceStacker>();
-
recurse(*i.value);
} catch (Error & e) {
addErrorTrace(e, *i.pos, "while evaluating the attribute '%1%'", i.name);