aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/libexpr/eval.cc30
-rw-r--r--tests/functional/repl_characterization/data/regression_9918.test4
-rw-r--r--tests/functional/repl_characterization/data/stack_vars.test8
3 files changed, 26 insertions, 16 deletions
diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc
index 7cf33aec4..bef0effb6 100644
--- a/src/libexpr/eval.cc
+++ b/src/libexpr/eval.cc
@@ -677,12 +677,21 @@ std::optional<EvalState::Doc> EvalState::getDoc(Value & v)
}
+static std::set<std::string_view> sortedBindingNames(const SymbolTable & st, const StaticEnv & se)
+{
+ std::set<std::string_view> bindings;
+ for (auto [symbol, displ] : se.vars)
+ bindings.emplace(st[symbol]);
+ return bindings;
+}
+
+
// just for the current level of StaticEnv, not the whole chain.
void printStaticEnvBindings(const SymbolTable & st, const StaticEnv & se)
{
std::cout << ANSI_MAGENTA;
- for (auto & i : se.vars)
- std::cout << st[i.first] << " ";
+ for (auto & i : sortedBindingNames(st, se))
+ std::cout << i << " ";
std::cout << ANSI_NORMAL;
std::cout << std::endl;
}
@@ -691,13 +700,14 @@ void printStaticEnvBindings(const SymbolTable & st, const StaticEnv & se)
void printWithBindings(const SymbolTable & st, const Env & env)
{
if (!env.values[0]->isThunk()) {
+ std::set<std::string_view> bindings;
+ for (const auto & attr : *env.values[0]->attrs)
+ bindings.emplace(st[attr.name]);
+
std::cout << "with: ";
std::cout << ANSI_MAGENTA;
- Bindings::iterator j = env.values[0]->attrs->begin();
- while (j != env.values[0]->attrs->end()) {
- std::cout << st[j->name] << " ";
- ++j;
- }
+ for (auto & i : bindings)
+ std::cout << i << " ";
std::cout << ANSI_NORMAL;
std::cout << std::endl;
}
@@ -718,9 +728,9 @@ void printEnvBindings(const SymbolTable & st, const StaticEnv & se, const Env &
std::cout << ANSI_MAGENTA;
// for the top level, don't print the double underscore ones;
// they are in builtins.
- for (auto & i : se.vars)
- if (!std::string_view(st[i.first]).starts_with("__"))
- std::cout << st[i.first] << " ";
+ for (auto & i : sortedBindingNames(st, se))
+ if (!i.starts_with("__"))
+ std::cout << i << " ";
std::cout << ANSI_NORMAL;
std::cout << std::endl;
if (se.isWith)
diff --git a/tests/functional/repl_characterization/data/regression_9918.test b/tests/functional/repl_characterization/data/regression_9918.test
index 4a1931122..c30c405b6 100644
--- a/tests/functional/repl_characterization/data/regression_9918.test
+++ b/tests/functional/repl_characterization/data/regression_9918.test
@@ -10,7 +10,7 @@ We expect to be able to see locals like r in the debugger:
nix-repl> :env
Env level 0
- static: x r
+ static: r x
Env level 1
- builtins true false null scopedImport import isNull break abort throw derivationStrict placeholder baseNameOf dirOf removeAttrs map toString fetchMercurial fetchTree fetchTarball fetchGit fromTOML derivation
+ abort baseNameOf break builtins derivation derivationStrict dirOf false fetchGit fetchMercurial fetchTarball fetchTree fromTOML import isNull map null placeholder removeAttrs scopedImport throw toString true
diff --git a/tests/functional/repl_characterization/data/stack_vars.test b/tests/functional/repl_characterization/data/stack_vars.test
index 0537f9c03..96ea5fe25 100644
--- a/tests/functional/repl_characterization/data/stack_vars.test
+++ b/tests/functional/repl_characterization/data/stack_vars.test
@@ -14,7 +14,7 @@ as it is in scope.
static: a b
Env level 2
- builtins true false null scopedImport import isNull break abort throw derivationStrict placeholder baseNameOf dirOf removeAttrs map toString fetchMercurial fetchTree fetchTarball fetchGit fromTOML derivation
+ abort baseNameOf break builtins derivation derivationStrict dirOf false fetchGit fetchMercurial fetchTarball fetchTree fromTOML import isNull map null placeholder removeAttrs scopedImport throw toString true
nix-repl> meow
2
@@ -35,7 +35,7 @@ If we :st past the frame in the backtrace with the meow in it, the meow should n
static: a b
Env level 1
- builtins true false null scopedImport import isNull break abort throw derivationStrict placeholder baseNameOf dirOf removeAttrs map toString fetchMercurial fetchTree fetchTarball fetchGit fromTOML derivation
+ abort baseNameOf break builtins derivation derivationStrict dirOf false fetchGit fetchMercurial fetchTarball fetchTree fromTOML import isNull map null placeholder removeAttrs scopedImport throw toString true
nix-repl> :c
trace: before inner break
@@ -52,7 +52,7 @@ If we :st past the frame in the backtrace with the meow in it, the meow should n
static: a b
Env level 2
- builtins true false null scopedImport import isNull break abort throw derivationStrict placeholder baseNameOf dirOf removeAttrs map toString fetchMercurial fetchTree fetchTarball fetchGit fromTOML derivation
+ abort baseNameOf break builtins derivation derivationStrict dirOf false fetchGit fetchMercurial fetchTarball fetchTree fromTOML import isNull map null placeholder removeAttrs scopedImport throw toString true
nix-repl> meow'
3
@@ -71,4 +71,4 @@ If we :st past the frame in the backtrace with the meow in it, the meow should n
static: a b
Env level 1
- builtins true false null scopedImport import isNull break abort throw derivationStrict placeholder baseNameOf dirOf removeAttrs map toString fetchMercurial fetchTree fetchTarball fetchGit fromTOML derivation
+ abort baseNameOf break builtins derivation derivationStrict dirOf false fetchGit fetchMercurial fetchTarball fetchTree fromTOML import isNull map null placeholder removeAttrs scopedImport throw toString true