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:
parent
5f60602875
commit
d32d77f4d4
1 changed files with 9 additions and 4 deletions
|
|
@ -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; });
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue