diff options
author | Ben Burdette <bburdette@gmail.com> | 2021-05-03 14:37:33 -0600 |
---|---|---|
committer | Ben Burdette <bburdette@gmail.com> | 2021-05-03 14:37:33 -0600 |
commit | 2dd61411af903e374566e0cf5d06257ad240662e (patch) | |
tree | 0623970ff04c8e71f1a83283be4e8f724e031e05 /src | |
parent | f32c687f03e9764e55831d894b719fdf0104cf25 (diff) |
debugger on autoCallFunction error
Diffstat (limited to 'src')
-rw-r--r-- | src/libcmd/command.cc | 16 | ||||
-rw-r--r-- | src/libexpr/eval.cc | 20 |
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; } } |