about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEelco Dolstra <edolstra@gmail.com>2019-12-10T12·32+0100
committerEelco Dolstra <edolstra@gmail.com>2020-01-04T12·38+0100
commit8be0440d440df5544b682fcbf21c105f18d538b0 (patch)
tree66ef012ba71f37cae014ea6b4db74c5fc56016c0
parent61e816217bfdfffd39c130c7cd24f07e640098fc (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)
-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 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);