diff options
author | Eelco Dolstra <edolstra@gmail.com> | 2019-12-10T12·32+0100 |
---|---|---|
committer | Eelco Dolstra <edolstra@gmail.com> | 2020-01-04T12·38+0100 |
commit | 8be0440d440df5544b682fcbf21c105f18d538b0 (patch) | |
tree | 66ef012ba71f37cae014ea6b4db74c5fc56016c0 /src/libexpr/eval.cc | |
parent | 61e816217bfdfffd39c130c7cd24f07e640098fc (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. (cherry picked from commit 98ef11677c43db9aa669768d9f0cbec704e8831c)
Diffstat (limited to 'src/libexpr/eval.cc')
-rw-r--r-- | src/libexpr/eval.cc | 7 |
1 files changed, 3 insertions, 4 deletions
diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc index 9f4b6b411a72..1f6dae95ac12 100644 --- a/src/libexpr/eval.cc +++ b/src/libexpr/eval.cc @@ -1096,10 +1096,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); |