Alias traceable_allocator to std::allocator when building without GC

This allows us to get rid of a bunch of #ifdefs.
This commit is contained in:
Eelco Dolstra 2024-09-19 20:07:04 +02:00
parent ca3fc1693b
commit b9f78abb7f
7 changed files with 8 additions and 52 deletions

View file

@ -127,14 +127,9 @@ ref<EvalState> EvalCommand::getEvalState()
{ {
if (!evalState) { if (!evalState) {
evalState = evalState =
#if HAVE_BOEHMGC
std::allocate_shared<EvalState>( std::allocate_shared<EvalState>(
traceable_allocator<EvalState>(), traceable_allocator<EvalState>(),
#else lookupPath, getEvalStore(), fetchSettings, evalSettings, getStore());
std::make_shared<EvalState>(
#endif
lookupPath, getEvalStore(), fetchSettings, evalSettings, getStore())
;
evalState->repair = repair; evalState->repair = repair;

View file

@ -99,11 +99,7 @@ static const char * makeImmutableString(std::string_view s)
RootValue allocRootValue(Value * v) RootValue allocRootValue(Value * v)
{ {
#if HAVE_BOEHMGC
return std::allocate_shared<Value *>(traceable_allocator<Value *>(), v); return std::allocate_shared<Value *>(traceable_allocator<Value *>(), v);
#else
return std::make_shared<Value *>(v);
#endif
} }
// Pretty print types for assertion errors // Pretty print types for assertion errors

View file

@ -139,11 +139,7 @@ struct Constant
bool impureOnly = false; 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;
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
typedef std::unordered_map<PosIdx, DocComment> DocCommentMap; typedef std::unordered_map<PosIdx, DocComment> DocCommentMap;
@ -329,21 +325,13 @@ private:
/** /**
* A cache from path names to parse trees. * A cache from path names to parse trees.
*/ */
#if HAVE_BOEHMGC
typedef std::unordered_map<SourcePath, Expr *, std::hash<SourcePath>, std::equal_to<SourcePath>, traceable_allocator<std::pair<const SourcePath, Expr *>>> FileParseCache; typedef std::unordered_map<SourcePath, Expr *, std::hash<SourcePath>, std::equal_to<SourcePath>, traceable_allocator<std::pair<const SourcePath, Expr *>>> FileParseCache;
#else
typedef std::unordered_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
typedef std::unordered_map<SourcePath, Value, std::hash<SourcePath>, std::equal_to<SourcePath>, traceable_allocator<std::pair<const SourcePath, Value>>> FileEvalCache; typedef std::unordered_map<SourcePath, Value, std::hash<SourcePath>, std::equal_to<SourcePath>, traceable_allocator<std::pair<const SourcePath, Value>>> FileEvalCache;
#else
typedef std::unordered_map<SourcePath, Value> FileEvalCache;
#endif
FileEvalCache fileEvalCache; FileEvalCache fileEvalCache;
/** /**

View file

@ -2,28 +2,15 @@
#include <boost/container/small_vector.hpp> #include <boost/container/small_vector.hpp>
#if HAVE_BOEHMGC #include "value.hh"
#include <gc/gc.h>
#include <gc/gc_cpp.h>
#include <gc/gc_allocator.h>
#endif
namespace nix { namespace nix {
struct Value;
/** /**
* A GC compatible vector that may used a reserved portion of `nItems` on the stack instead of allocating on the heap. * A GC compatible vector that may used a reserved portion of `nItems` on the stack instead of allocating on the heap.
*/ */
#if HAVE_BOEHMGC
template <typename T, size_t nItems> template <typename T, size_t nItems>
using SmallVector = boost::container::small_vector<T, nItems, traceable_allocator<T>>; using SmallVector = boost::container::small_vector<T, nItems, traceable_allocator<T>>;
#else
template <typename T, size_t nItems>
using SmallVector = boost::container::small_vector<T, nItems>;
#endif
/** /**
* A vector of value pointers. See `SmallVector`. * A vector of value pointers. See `SmallVector`.
@ -39,4 +26,4 @@ using SmallValueVector = SmallVector<Value *, nItems>;
template <size_t nItems> template <size_t nItems>
using SmallTemporaryValueVector = SmallVector<Value, nItems>; using SmallTemporaryValueVector = SmallVector<Value, nItems>;
} }

View file

@ -83,11 +83,7 @@ public:
}; };
#if HAVE_BOEHMGC
typedef std::list<PackageInfo, traceable_allocator<PackageInfo>> PackageInfos; typedef std::list<PackageInfo, traceable_allocator<PackageInfo>> PackageInfos;
#else
typedef std::list<PackageInfo> PackageInfos;
#endif
/** /**

View file

@ -3136,11 +3136,7 @@ static void prim_zipAttrsWith(EvalState & state, const PosIdx pos, Value * * arg
std::optional<ListBuilder> list; std::optional<ListBuilder> list;
}; };
#if HAVE_BOEHMGC
std::map<Symbol, Item, std::less<Symbol>, traceable_allocator<std::pair<const Symbol, Item>>> attrsSeen; std::map<Symbol, Item, std::less<Symbol>, traceable_allocator<std::pair<const Symbol, Item>>> attrsSeen;
#else
std::map<Symbol, Item> attrsSeen;
#endif
state.forceFunction(*args[0], pos, "while evaluating the first argument passed to builtins.zipAttrsWith"); state.forceFunction(*args[0], pos, "while evaluating the first argument passed to builtins.zipAttrsWith");
state.forceList(*args[1], pos, "while evaluating the second argument passed to builtins.zipAttrsWith"); state.forceList(*args[1], pos, "while evaluating the second argument passed to builtins.zipAttrsWith");

View file

@ -12,7 +12,11 @@
#if HAVE_BOEHMGC #if HAVE_BOEHMGC
#include <gc/gc_allocator.h> #include <gc/gc_allocator.h>
#else
template<typename T>
using traceable_allocator = std::allocator<T>;
#endif #endif
#include <nlohmann/json_fwd.hpp> #include <nlohmann/json_fwd.hpp>
namespace nix { namespace nix {
@ -498,15 +502,9 @@ void Value::mkBlackhole()
} }
#if HAVE_BOEHMGC
typedef std::vector<Value *, traceable_allocator<Value *>> ValueVector; typedef std::vector<Value *, traceable_allocator<Value *>> ValueVector;
typedef std::unordered_map<Symbol, Value *, std::hash<Symbol>, std::equal_to<Symbol>, traceable_allocator<std::pair<const Symbol, Value *>>> ValueMap; typedef std::unordered_map<Symbol, Value *, std::hash<Symbol>, std::equal_to<Symbol>, traceable_allocator<std::pair<const Symbol, Value *>>> ValueMap;
typedef std::map<Symbol, ValueVector, std::less<Symbol>, traceable_allocator<std::pair<const Symbol, ValueVector>>> ValueVectorMap; typedef std::map<Symbol, ValueVector, std::less<Symbol>, traceable_allocator<std::pair<const Symbol, ValueVector>>> ValueVectorMap;
#else
typedef std::vector<Value *> ValueVector;
typedef std::unordered_map<Symbol, Value *> ValueMap;
typedef std::map<Symbol, ValueVector> ValueVectorMap;
#endif
/** /**