mirror of
https://github.com/NixOS/nix
synced 2024-09-19 10:50:24 -04:00
refactor: Extract EvalState::addCallDepth
This commit is contained in:
parent
d8c1550189
commit
6068e32aa7
|
@ -4,6 +4,7 @@
|
||||||
#include "print.hh"
|
#include "print.hh"
|
||||||
#include "eval.hh"
|
#include "eval.hh"
|
||||||
#include "eval-error.hh"
|
#include "eval-error.hh"
|
||||||
|
#include "eval-settings.hh"
|
||||||
|
|
||||||
namespace nix {
|
namespace nix {
|
||||||
|
|
||||||
|
@ -138,5 +139,12 @@ inline void EvalState::forceList(Value & v, const PosIdx pos, std::string_view e
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[[gnu::always_inline]]
|
||||||
|
inline CallDepth EvalState::addCallDepth(const PosIdx pos) {
|
||||||
|
if (callDepth > settings.maxCallDepth)
|
||||||
|
error<EvalError>("stack overflow; max-call-depth exceeded").atPos(pos).debugThrow();
|
||||||
|
|
||||||
|
return CallDepth(callDepth);
|
||||||
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1471,26 +1471,9 @@ void ExprLambda::eval(EvalState & state, Env & env, Value & v)
|
||||||
v.mkLambda(&env, this);
|
v.mkLambda(&env, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace {
|
|
||||||
/** Increments a count on construction and decrements on destruction.
|
|
||||||
*/
|
|
||||||
class CallDepth {
|
|
||||||
size_t & count;
|
|
||||||
public:
|
|
||||||
CallDepth(size_t & count) : count(count) {
|
|
||||||
++count;
|
|
||||||
}
|
|
||||||
~CallDepth() {
|
|
||||||
--count;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
void EvalState::callFunction(Value & fun, size_t nrArgs, Value * * args, Value & vRes, const PosIdx pos)
|
void EvalState::callFunction(Value & fun, size_t nrArgs, Value * * args, Value & vRes, const PosIdx pos)
|
||||||
{
|
{
|
||||||
if (callDepth > settings.maxCallDepth)
|
auto _level = addCallDepth(pos);
|
||||||
error<EvalError>("stack overflow; max-call-depth exceeded").atPos(pos).debugThrow();
|
|
||||||
CallDepth _level(callDepth);
|
|
||||||
|
|
||||||
auto trace = settings.traceFunctionCalls
|
auto trace = settings.traceFunctionCalls
|
||||||
? std::make_unique<FunctionCallTrace>(positions[pos])
|
? std::make_unique<FunctionCallTrace>(positions[pos])
|
||||||
|
|
|
@ -41,6 +41,21 @@ namespace eval_cache {
|
||||||
class EvalCache;
|
class EvalCache;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Increments a count on construction and decrements on destruction.
|
||||||
|
*/
|
||||||
|
class CallDepth {
|
||||||
|
size_t & count;
|
||||||
|
|
||||||
|
public:
|
||||||
|
CallDepth(size_t & count) : count(count) {
|
||||||
|
++count;
|
||||||
|
}
|
||||||
|
~CallDepth() {
|
||||||
|
--count;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function that implements a primop.
|
* Function that implements a primop.
|
||||||
*/
|
*/
|
||||||
|
@ -649,6 +664,11 @@ private:
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check that the call depth is within limits, and increment it, until the returned object is destroyed.
|
||||||
|
*/
|
||||||
|
inline CallDepth addCallDepth(const PosIdx pos);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Do a deep equality test between two values. That is, list
|
* Do a deep equality test between two values. That is, list
|
||||||
* elements and attributes are compared recursively.
|
* elements and attributes are compared recursively.
|
||||||
|
|
Loading…
Reference in a new issue