diff options
-rw-r--r-- | src/libexpr/eval.hh | 50 | ||||
-rw-r--r-- | src/libexpr/primops.cc | 2 |
2 files changed, 27 insertions, 25 deletions
diff --git a/src/libexpr/eval.hh b/src/libexpr/eval.hh index 8e390e46d..ed51f8d1d 100644 --- a/src/libexpr/eval.hh +++ b/src/libexpr/eval.hh @@ -9,14 +9,13 @@ #include "symbol-table.hh" #include "config.hh" #include "experimental-features.hh" -#include "input-accessor.hh" #include "search-path.hh" #include "repl-exit-status.hh" +#include <gc/gc_allocator.h> #include <map> #include <optional> #include <unordered_map> -#include <mutex> #include <functional> namespace nix { @@ -38,11 +37,26 @@ namespace eval_cache { 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. */ -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 @@ -76,7 +90,7 @@ struct 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. @@ -115,11 +129,7 @@ struct Constant bool impureOnly = false; }; -#if HAVE_BOEHMGC - 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 +using ValMap = GcMap<std::string, Value *>; struct Env { @@ -214,7 +224,7 @@ public: /** * Debugger */ - ReplExitStatus (* debugRepl)(ref<EvalState> es, const ValMap & extraEnv); + std::function<ReplExitStatus(ref<EvalState> es, ValMap const & extraEnv)> debugRepl; bool debugStop; bool inDebugger = false; int trylevel; @@ -252,21 +262,13 @@ private: /** * A cache from path names to parse trees. */ -#if HAVE_BOEHMGC - typedef std::map<SourcePath, Expr *, std::less<SourcePath>, traceable_allocator<std::pair<const SourcePath, Expr *>>> FileParseCache; -#else - typedef std::map<SourcePath, Expr *> FileParseCache; -#endif + using FileParseCache = GcMap<SourcePath, Expr *>; FileParseCache fileParseCache; /** * A cache from path names to values. */ -#if HAVE_BOEHMGC - typedef std::map<SourcePath, Value, std::less<SourcePath>, traceable_allocator<std::pair<const SourcePath, Value>>> FileEvalCache; -#else - typedef std::map<SourcePath, Value> FileEvalCache; -#endif + using FileEvalCache = GcMap<SourcePath, Value>; FileEvalCache fileEvalCache; SearchPath searchPath; @@ -737,15 +739,15 @@ private: bool countCalls; - typedef std::map<std::string, size_t> PrimOpCalls; + using PrimOpCalls = std::map<std::string, size_t>; PrimOpCalls primOpCalls; - typedef std::map<ExprLambda *, size_t> FunctionCalls; + using FunctionCalls = std::map<ExprLambda *, size_t>; FunctionCalls functionCalls; void incrFunctionCall(ExprLambda * fun); - typedef std::map<PosIdx, size_t> AttrSelects; + using AttrSelects = std::map<PosIdx, size_t>; AttrSelects attrSelects; friend struct ExprOpUpdate; @@ -787,7 +789,7 @@ std::string showType(const Value & v); */ SourcePath resolveExprPath(SourcePath path); -static const std::string corepkgsPrefix{"/__corepkgs__/"}; +static constexpr std::string_view corepkgsPrefix{"/__corepkgs__/"}; } diff --git a/src/libexpr/primops.cc b/src/libexpr/primops.cc index 20851da70..72ae1aeb9 100644 --- a/src/libexpr/primops.cc +++ b/src/libexpr/primops.cc @@ -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. */ 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) { /* to prevent starting the repl from exceptions withing a tryEval, null it. */ |