aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEelco Dolstra <edolstra@gmail.com>2019-12-10 13:32:30 +0100
committerEelco Dolstra <edolstra@gmail.com>2019-12-10 13:32:30 +0100
commit98ef11677c43db9aa669768d9f0cbec704e8831c (patch)
tree4e28a6b8c263c3f3fd86ec652e9746eed169df27
parent61cc9f34d208f838db3a8935e224aade6038ffdc (diff)
EvalState::callFunction(): Make FunctionCallTrace use less stack space
The FunctionCallTrace object consumes a few hundred bytes of stack space, even when tracing is disabled. This was causing stack overflows: $ nix-instantiate '<nixpkgs> -A texlive.combined.scheme-full --dry-run error: stack overflow (possible infinite recursion) This is with the default stack size of 8 MiB. Putting the object on the heap reduces stack usage to < 5 MiB.
-rw-r--r--src/libexpr/eval.cc7
1 files changed, 3 insertions, 4 deletions
diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc
index e2070d546..4be4cfeea 100644
--- a/src/libexpr/eval.cc
+++ b/src/libexpr/eval.cc
@@ -1091,10 +1091,9 @@ void EvalState::callPrimOp(Value & fun, Value & arg, Value & v, const Pos & pos)
void EvalState::callFunction(Value & fun, Value & arg, Value & v, const Pos & pos)
{
- std::optional<FunctionCallTrace> trace;
- if (evalSettings.traceFunctionCalls) {
- trace.emplace(pos);
- }
+ std::unique_ptr<FunctionCallTrace> trace;
+ if (evalSettings.traceFunctionCalls)
+ trace = std::make_unique<FunctionCallTrace>(pos);
forceValue(fun, pos);