mildly cleanup libexpr/eval.hh

Change-Id: I40d01a8f8b7fb101279c6f88ebdf1f0969d9d7f0
This commit is contained in:
Qyriad 2024-06-24 19:08:53 -06:00
parent 4c7165be86
commit b9f91ec3c5
2 changed files with 27 additions and 25 deletions

View file

@ -9,14 +9,13 @@
#include "symbol-table.hh" #include "symbol-table.hh"
#include "config.hh" #include "config.hh"
#include "experimental-features.hh" #include "experimental-features.hh"
#include "input-accessor.hh"
#include "search-path.hh" #include "search-path.hh"
#include "repl-exit-status.hh" #include "repl-exit-status.hh"
#include <gc/gc_allocator.h>
#include <map> #include <map>
#include <optional> #include <optional>
#include <unordered_map> #include <unordered_map>
#include <mutex>
#include <functional> #include <functional>
namespace nix { namespace nix {
@ -38,11 +37,26 @@ namespace eval_cache {
class EvalCache; class EvalCache;
} }
/** Alias for std::map which uses boehmgc's allocator conditional on us actually
* using boehmgc in this build.
*/
#if HAVE_BOEHMGC
template<typename KeyT, typename ValueT>
using GcMap = std::map<
KeyT,
ValueT,
std::less<KeyT>,
traceable_allocator<std::pair<KeyT const, ValueT>>
>;
#else
using GcMap = std::map<KeyT, ValueT>
#endif
/** /**
* Function that implements a primop. * Function that implements a primop.
*/ */
typedef void (* PrimOpFun) (EvalState & state, const PosIdx pos, Value * * args, Value & v); using PrimOpImpl = void(EvalState & state, PosIdx pos, Value ** args, Value & v);
/** /**
* Info about a primitive operation, and its implementation * Info about a primitive operation, and its implementation
@ -76,7 +90,7 @@ struct PrimOp
/** /**
* Implementation of the primop. * Implementation of the primop.
*/ */
std::function<std::remove_pointer<PrimOpFun>::type> fun; std::function<PrimOpImpl> fun;
/** /**
* Optional experimental for this to be gated on. * Optional experimental for this to be gated on.
@ -115,11 +129,7 @@ struct Constant
bool impureOnly = false; bool impureOnly = false;
}; };
#if HAVE_BOEHMGC using ValMap = GcMap<std::string, Value *>;
typedef std::map<std::string, Value *, std::less<std::string>, traceable_allocator<std::pair<const std::string, Value *> > > ValMap;
#else
typedef std::map<std::string, Value *> ValMap;
#endif
struct Env struct Env
{ {
@ -214,7 +224,7 @@ public:
/** /**
* Debugger * Debugger
*/ */
ReplExitStatus (* debugRepl)(ref<EvalState> es, const ValMap & extraEnv); std::function<ReplExitStatus(ref<EvalState> es, ValMap const & extraEnv)> debugRepl;
bool debugStop; bool debugStop;
bool inDebugger = false; bool inDebugger = false;
int trylevel; int trylevel;
@ -252,21 +262,13 @@ private:
/** /**
* A cache from path names to parse trees. * A cache from path names to parse trees.
*/ */
#if HAVE_BOEHMGC using FileParseCache = GcMap<SourcePath, Expr *>;
typedef std::map<SourcePath, Expr *, std::less<SourcePath>, traceable_allocator<std::pair<const SourcePath, Expr *>>> FileParseCache;
#else
typedef std::map<SourcePath, Expr *> FileParseCache;
#endif
FileParseCache fileParseCache; FileParseCache fileParseCache;
/** /**
* A cache from path names to values. * A cache from path names to values.
*/ */
#if HAVE_BOEHMGC using FileEvalCache = GcMap<SourcePath, Value>;
typedef std::map<SourcePath, Value, std::less<SourcePath>, traceable_allocator<std::pair<const SourcePath, Value>>> FileEvalCache;
#else
typedef std::map<SourcePath, Value> FileEvalCache;
#endif
FileEvalCache fileEvalCache; FileEvalCache fileEvalCache;
SearchPath searchPath; SearchPath searchPath;
@ -737,15 +739,15 @@ private:
bool countCalls; bool countCalls;
typedef std::map<std::string, size_t> PrimOpCalls; using PrimOpCalls = std::map<std::string, size_t>;
PrimOpCalls primOpCalls; PrimOpCalls primOpCalls;
typedef std::map<ExprLambda *, size_t> FunctionCalls; using FunctionCalls = std::map<ExprLambda *, size_t>;
FunctionCalls functionCalls; FunctionCalls functionCalls;
void incrFunctionCall(ExprLambda * fun); void incrFunctionCall(ExprLambda * fun);
typedef std::map<PosIdx, size_t> AttrSelects; using AttrSelects = std::map<PosIdx, size_t>;
AttrSelects attrSelects; AttrSelects attrSelects;
friend struct ExprOpUpdate; friend struct ExprOpUpdate;
@ -787,7 +789,7 @@ std::string showType(const Value & v);
*/ */
SourcePath resolveExprPath(SourcePath path); SourcePath resolveExprPath(SourcePath path);
static const std::string corepkgsPrefix{"/__corepkgs__/"}; static constexpr std::string_view corepkgsPrefix{"/__corepkgs__/"};
} }

View file

@ -866,7 +866,7 @@ static void prim_tryEval(EvalState & state, const PosIdx pos, Value * * args, Va
/* increment state.trylevel, and decrement it when this function returns. */ /* increment state.trylevel, and decrement it when this function returns. */
MaintainCount trylevel(state.trylevel); MaintainCount trylevel(state.trylevel);
ReplExitStatus (* savedDebugRepl)(ref<EvalState> es, const ValMap & extraEnv) = nullptr; std::function<ReplExitStatus(ref<EvalState> es, ValMap const & extraEnv)> savedDebugRepl;
if (state.debugRepl && evalSettings.ignoreExceptionsDuringTry) if (state.debugRepl && evalSettings.ignoreExceptionsDuringTry)
{ {
/* to prevent starting the repl from exceptions withing a tryEval, null it. */ /* to prevent starting the repl from exceptions withing a tryEval, null it. */