1
0
Fork 0
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:
Robert Hensing 2024-08-15 11:36:44 +02:00
parent d8c1550189
commit 6068e32aa7
3 changed files with 29 additions and 18 deletions

View file

@ -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);
};
} }

View file

@ -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])

View file

@ -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.