aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBen Burdette <bburdette@gmail.com>2021-05-03 14:37:33 -0600
committerBen Burdette <bburdette@gmail.com>2021-05-03 14:37:33 -0600
commit2dd61411af903e374566e0cf5d06257ad240662e (patch)
tree0623970ff04c8e71f1a83283be4e8f724e031e05 /src
parentf32c687f03e9764e55831d894b719fdf0104cf25 (diff)
debugger on autoCallFunction error
Diffstat (limited to 'src')
-rw-r--r--src/libcmd/command.cc16
-rw-r--r--src/libexpr/eval.cc20
2 files changed, 28 insertions, 8 deletions
diff --git a/src/libcmd/command.cc b/src/libcmd/command.cc
index d790bb51d..51a071d25 100644
--- a/src/libcmd/command.cc
+++ b/src/libcmd/command.cc
@@ -79,24 +79,28 @@ ref<EvalState> EvalCommand::getEvalState()
return ref<EvalState>(evalState);
}
*/
+// ref<EvalState> EvalCommand::getEvalState()
+// {
+// if (!evalState)
+// evalState = std::make_shared<EvalState>(searchPath, getStore());
+// return ref<EvalState>(evalState);
+// }
+
+
EvalCommand::EvalCommand()
{
+ // std::cout << "EvalCommand::EvalCommand()" << std::endl;
addFlag({
.longName = "debugger",
.description = "start an interactive environment if evaluation fails",
.handler = {&startReplOnEvalErrors, true},
});
}
-// ref<EvalState> EvalCommand::getEvalState()
-// {
-// if (!evalState)
-// evalState = std::make_shared<EvalState>(searchPath, getStore());
-// return ref<EvalState>(evalState);
-// }
extern std::function<void(const Error & error, const std::map<std::string, Value *> & env)> debuggerHook;
ref<EvalState> EvalCommand::getEvalState()
{
+ std::cout << " EvalCommand::getEvalState()" << startReplOnEvalErrors << std::endl;
if (!evalState) {
evalState = std::make_shared<EvalState>(searchPath, getStore());
if (startReplOnEvalErrors)
diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc
index 37fb6ed18..51feef923 100644
--- a/src/libexpr/eval.cc
+++ b/src/libexpr/eval.cc
@@ -1398,12 +1398,28 @@ void EvalState::autoCallFunction(Bindings & args, Value & fun, Value & res)
if (j != args.end()) {
actualArgs->attrs->push_back(*j);
} else if (!i.def) {
- throwMissingArgumentError(i.pos, R"(cannot evaluate a function that has an argument without a value ('%1%')
+ auto error = MissingArgumentError({
+ .msg = hintfmt(R"(cannot evaluate a function that has an argument without a value ('%1%')
Nix attempted to evaluate a function as a top level expression; in
this case it must have its arguments supplied either by default
values, or passed explicitly with '--arg' or '--argstr'. See
-https://nixos.org/manual/nix/stable/#ss-functions.)", i.name);
+https://nixos.org/manual/nix/stable/#ss-functions.)", i.name),
+ .errPos = i.pos
+ });
+
+// throwMissingArgumentError(i.pos
+// , R"(cannot evaluate a function that has an argument without a value ('%1%')
+
+// Nix attempted to evaluate a function as a top level expression; in
+// this case it must have its arguments supplied either by default
+// values, or passed explicitly with '--arg' or '--argstr'. See
+// https://nixos.org/manual/nix/stable/#ss-functions.)", i.name);
+
+ if (debuggerHook)
+ debuggerHook(error, {{"fun", &fun}});
+
+ throw error;
}
}