libexpr: associate let exprs with the correct StaticEnv

static env association is from expr to its enclosing scope, but let
exprs set their association to their *inner* scope. this skips one level
of envs and will cause segfaults if the parent is a with expr.

fixes #145

Change-Id: I1d22146110f071ede21b4eed7ed34b5850ef2ef3
This commit is contained in:
eldritch horrors 2024-03-18 21:09:39 +01:00
parent b3599166ad
commit afb839a0c9
4 changed files with 21 additions and 1 deletions

View file

@ -483,7 +483,7 @@ void ExprLet::bindVars(EvalState & es, const std::shared_ptr<const StaticEnv> &
i.second.e->bindVars(es, i.second.chooseByKind(newEnv, env, inheritFromEnv));
if (es.debugRepl)
es.exprEnvs.insert(std::make_pair(this, newEnv));
es.exprEnvs.insert(std::make_pair(this, env));
body->bindVars(es, newEnv);
}

View file

@ -0,0 +1,5 @@
with { inherit ({}) invalid; };
let
x = builtins.break 1;
in
x

View file

@ -0,0 +1,14 @@
info: breakpoint reached
debugger should not crash now, but also not show any with variables
nix-repl> :st
0: error: breakpoint reached
«none»:0
Env level 0
static: x
Env level 1
static:
Env level 2
abort baseNameOf break builtins derivation derivationStrict dirOf false fetchGit fetchMercurial fetchTarball fetchTree fromTOML import isNull map null placeholder removeAttrs scopedImport throw toString true

View file

@ -124,6 +124,7 @@ TEST_F(ReplSessionTest, repl_basic)
DEBUGGER_TEST(regression_9918);
DEBUGGER_TEST(regression_9917);
DEBUGGER_TEST(regression_l145);
DEBUGGER_TEST(stack_vars);
};