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.
This commit is contained in:
Eelco Dolstra 2019-12-10 13:32:30 +01:00
parent 61cc9f34d2
commit 98ef11677c

View file

@ -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) void EvalState::callFunction(Value & fun, Value & arg, Value & v, const Pos & pos)
{ {
std::optional<FunctionCallTrace> trace; std::unique_ptr<FunctionCallTrace> trace;
if (evalSettings.traceFunctionCalls) { if (evalSettings.traceFunctionCalls)
trace.emplace(pos); trace = std::make_unique<FunctionCallTrace>(pos);
}
forceValue(fun, pos); forceValue(fun, pos);