aboutsummaryrefslogtreecommitdiff
path: root/src/libcmd/repl.cc
diff options
context:
space:
mode:
authorBen Burdette <bburdette@protonmail.com>2022-03-28 12:09:21 -0600
committerBen Burdette <bburdette@protonmail.com>2022-03-28 12:09:21 -0600
commit14f515544bf7ea3c894fbc21d1393e69aa115784 (patch)
treee4d6dd62c78ab34f71c3d64c9c0710ee5e518e02 /src/libcmd/repl.cc
parent1bec3fb337b86f87e7600fc6b6072ded1a7d4927 (diff)
debugTraceIndex
Diffstat (limited to 'src/libcmd/repl.cc')
-rw-r--r--src/libcmd/repl.cc99
1 files changed, 78 insertions, 21 deletions
diff --git a/src/libcmd/repl.cc b/src/libcmd/repl.cc
index 2b3dfcbd2..f0a8ef676 100644
--- a/src/libcmd/repl.cc
+++ b/src/libcmd/repl.cc
@@ -49,7 +49,8 @@ struct NixRepl
ref<EvalState> state;
Bindings * autoArgs;
- const Error *debugError;
+ const Error *debugError;
+ int debugTraceIndex;
Strings loadedFiles;
@@ -96,6 +97,7 @@ string removeWhitespace(string s)
NixRepl::NixRepl(ref<EvalState> state)
: state(state)
+ , debugTraceIndex(0)
, staticEnv(new StaticEnv(false, state->staticBaseEnv.get()))
, historyFile(getDataDir() + "/nix/repl-history")
{
@@ -403,6 +405,28 @@ StorePath NixRepl::getDerivationPath(Value & v) {
return drvPath;
}
+std::ostream& showDebugTrace(std::ostream &out, const DebugTrace &dt)
+{
+ if (dt.is_error)
+ out << ANSI_RED "error: " << ANSI_NORMAL;
+ out << dt.hint.str() << "\n";
+
+ if (dt.pos.has_value() && (*dt.pos)) {
+ auto pos = dt.pos.value();
+ out << "\n";
+ printAtPos(pos, out);
+
+ auto loc = getCodeLines(pos);
+ if (loc.has_value()) {
+ out << "\n";
+ printCodeLines(out, "", pos, *loc);
+ out << "\n";
+ }
+ }
+
+ return out;
+}
+
bool NixRepl::processLine(string line)
{
if (line == "") return true;
@@ -444,7 +468,7 @@ bool NixRepl::processLine(string line)
<< " :d <cmd> Debug mode commands\n"
<< " :d stack Show call stack\n"
<< " :d env Show env stack\n"
- << " :d error Show current error\n"
+ << " :d show <idx> Show current trace, or change to call stack index\n"
<< " :d go Go until end of program, exception, or builtins.break().\n"
<< " :d step Go one step\n"
;
@@ -453,30 +477,63 @@ bool NixRepl::processLine(string line)
else if (command == ":d" || command == ":debug") {
if (arg == "stack") {
+ int idx = 0;
for (auto iter = this->state->debugTraces.begin();
- iter != this->state->debugTraces.end(); ++iter) {
- std::cout << "\n" << "… " << iter->hint.str() << "\n";
-
- if (iter->pos.has_value() && (*iter->pos)) {
- auto pos = iter->pos.value();
- std::cout << "\n";
- printAtPos(pos, std::cout);
-
- auto loc = getCodeLines(pos);
- if (loc.has_value()) {
- std::cout << "\n";
- printCodeLines(std::cout, "", pos, *loc);
- std::cout << "\n";
- }
- }
- }
+ iter != this->state->debugTraces.end();
+ ++iter, ++idx) {
+ std::cout << "\n" << ANSI_BLUE << idx << ANSI_NORMAL << ": ";
+ showDebugTrace(std::cout, *iter);
+ }
} else if (arg == "env") {
- auto iter = this->state->debugTraces.begin();
- if (iter != this->state->debugTraces.end()) {
- printStaticEnvBindings(iter->expr);
+ int idx = 0;
+ for (auto iter = this->state->debugTraces.begin();
+ iter != this->state->debugTraces.end();
+ ++iter, ++idx) {
+ if (idx == this->debugTraceIndex)
+ {
+ // std::cout << "\n" << ANSI_BLUE << idx << ANSI_NORMAL << ": ";
+ printStaticEnvBindings(iter->expr);
+ break;
+ }
+ // std::cout << "\n" << ANSI_BLUE << idx << ANSI_NORMAL << ": ";
+ // showDebugTrace(std::cout, *iter);
+ }
+
+ // auto iter = this->state->debugTraces.begin();
+ // if (iter != this->state->debugTraces.end()) {
+ // printStaticEnvBindings(iter->expr);
+ // }
+ }
+ else if (arg.compare(0,4,"show") == 0) {
+ try {
+ // change the DebugTrace index.
+ debugTraceIndex = stoi(arg.substr(4));
+
+ // std::cout << "idx: " << idx << std::endl;
+ // debugTraceIndex = idx;
+
+ }
+ catch (...)
+ {
+ debugTraceIndex = 0;
+ }
+
+ int idx = 0;
+ for (auto iter = this->state->debugTraces.begin();
+ iter != this->state->debugTraces.end();
+ ++iter, ++idx) {
+ if (idx == this->debugTraceIndex)
+ {
+ std::cout << "\n" << ANSI_BLUE << idx << ANSI_NORMAL << ": ";
+ showDebugTrace(std::cout, *iter);
+ break;
+ }
+ // std::cout << "\n" << ANSI_BLUE << idx << ANSI_NORMAL << ": ";
+ // showDebugTrace(std::cout, *iter);
}
}
else if (arg == "error") {
+ // TODO: remove, along with debugError.
if (this->debugError) {
showErrorInfo(std::cout, debugError->info(), true);
}