1
1
Fork 0
mirror of https://github.com/NixOS/nix.git synced 2025-11-09 12:06:01 +01:00

Allocate ExprParseFile on the heap for now

https://github.com/NixOS/nix/pull/14013#issuecomment-3308085755
This commit is contained in:
Eelco Dolstra 2025-09-22 12:06:51 +02:00
parent 5f60602875
commit d32d77f4d4

View file

@ -1035,9 +1035,10 @@ Value * ExprPath::maybeThunk(EvalState & state, Env & env)
* from a thunk, ensuring that every file is parsed/evaluated only * from a thunk, ensuring that every file is parsed/evaluated only
* once (via the thunk stored in `EvalState::fileEvalCache`). * once (via the thunk stored in `EvalState::fileEvalCache`).
*/ */
struct ExprParseFile : Expr struct ExprParseFile : Expr, gc
{ {
SourcePath & path; // FIXME: make this a reference (see below).
SourcePath path;
bool mustBeTrivial; bool mustBeTrivial;
ExprParseFile(SourcePath & path, bool mustBeTrivial) ExprParseFile(SourcePath & path, bool mustBeTrivial)
@ -1088,14 +1089,18 @@ void EvalState::evalFile(const SourcePath & path, Value & v, bool mustBeTrivial)
} }
Value * vExpr; Value * vExpr;
ExprParseFile expr{*resolvedPath, mustBeTrivial}; // FIXME: put ExprParseFile on the stack instead of the heap once
// https://github.com/NixOS/nix/pull/13930 is merged. That will ensure
// the post-condition that `expr` is unreachable after
// `forceValue()` returns.
auto expr = new ExprParseFile{*resolvedPath, mustBeTrivial};
fileEvalCache->try_emplace_and_cvisit( fileEvalCache->try_emplace_and_cvisit(
*resolvedPath, *resolvedPath,
nullptr, nullptr,
[&](auto & i) { [&](auto & i) {
vExpr = allocValue(); vExpr = allocValue();
vExpr->mkThunk(&baseEnv, &expr); vExpr->mkThunk(&baseEnv, expr);
i.second = vExpr; i.second = vExpr;
}, },
[&](auto & i) { vExpr = i.second; }); [&](auto & i) { vExpr = i.second; });