Nix 2.93.3
Lix: A modern, delicious implementation of the Nix package manager; unstable internal interfaces
Loading...
Searching...
No Matches
eval.hh
Go to the documentation of this file.
1#pragma once
3
6#include "lix/libexpr/gc-alloc.hh"
11#include "lix/libutil/types.hh"
12#include "lix/libexpr/value.hh"
15#include "lix/libutil/config.hh"
19#include "lix/libutil/backed-string-view.hh"
20
21#include <concepts>
22#include <map>
23#include <optional>
24#include <unordered_map>
25#include <functional>
26
27namespace nix {
28
29class Store;
30class EvalState;
31class StorePath;
33enum RepairFlag : bool;
34struct MemoryInputAccessor;
35namespace eval_cache {
36 class EvalCache;
37}
38
42using PrimOpImpl = void(EvalState & state, Value ** args, Value & v);
43
47struct PrimOp
48{
52 std::string name;
53
58 std::vector<std::string> args;
59
66 size_t arity = 0;
67
71 const char * doc = nullptr;
72
76 std::function<PrimOpImpl> fun;
77
81 std::optional<ExperimentalFeature> experimentalFeature;
82};
83
84std::ostream & operator<<(std::ostream & output, PrimOp & primOp);
85
90{
96 ValueType type = nThunk;
97
101 const char * doc = nullptr;
102
106 bool impureOnly = false;
107};
108
109using ValMap = GcMap<std::string, Value *>;
110
111struct Env
112{
113 Env * up;
114 Value * values[0];
115};
116
117void printEnvBindings(const EvalState &es, const Expr & expr, const Env & env);
118void printEnvBindings(const SymbolTable & st, const StaticEnv & se, const Env & env, int lvl = 0);
119
120std::unique_ptr<ValMap> mapStaticEnvBindings(const SymbolTable & st, const StaticEnv & se, const Env & env);
121
122void copyContext(const Value & v, NixStringContext & context);
123
124
125std::string printValue(EvalState & state, Value & v);
126std::ostream & operator << (std::ostream & os, const ValueType t);
127
128
132void initLibExpr();
133
134
135struct RegexCache;
136
138 std::shared_ptr<Pos> pos;
139 const Expr & expr;
140 const Env & env;
141 HintFmt hint;
142 bool isError;
143 std::shared_ptr<const DebugTrace> parent;
144};
145
146struct DebugState
147{
148private:
149 std::weak_ptr<const DebugTrace> latestTrace;
150 const PosTable & positions;
151 const SymbolTable & symbols;
152
153public:
154 std::function<ReplExitStatus(ValMap const & extraEnv, NeverAsync)> errorCallback;
155 bool stop = false;
156 bool inDebugger = false;
157 std::map<const Expr *, const std::shared_ptr<const StaticEnv>> exprEnvs;
158 int trylevel = 0;
159
160 explicit DebugState(
161 const PosTable & positions,
162 const SymbolTable & symbols,
163 std::function<ReplExitStatus(ValMap const & extraEnv, NeverAsync)> errorCallback
164 )
165 : positions(positions)
166 , symbols(symbols)
167 , errorCallback(errorCallback)
168 {
169 assert(errorCallback);
170 }
171
172 void onEvalError(const EvalError * error, const Env & env, const Expr & expr, NeverAsync = {});
173
174 const std::shared_ptr<const StaticEnv> staticEnvFor(const Expr & expr) const
175 {
176 if (auto i = exprEnvs.find(&expr); i != exprEnvs.end()) {
177 return i->second;
178 }
179 return nullptr;
180 }
181
182 class TraceFrame
183 {
184 friend struct DebugState;
185 template<std::derived_from<EvalError> T>
186 friend class EvalErrorBuilder;
187
188 // holds both the data for this frame *and* a deleter that pulls this frame
189 // off the trace stack. EvalErrorBuilder uses this for withFrame fake trace
190 // frames, and to avoid needing to see this class definition in its header.
191 const std::shared_ptr<const DebugTrace> entry = nullptr;
192
193 explicit TraceFrame(std::shared_ptr<const DebugTrace> entry): entry(std::move(entry)) {}
194
195 public:
196 TraceFrame(std::nullptr_t) {}
197 };
198
199 TraceFrame addTrace(DebugTrace t);
200
204 {
205 for (auto current = latestTrace.lock(); current; current = current->parent) {
206 co_yield current.get();
207 }
208 }
209};
210
211struct StaticSymbols
212{
213 const Symbol outPath, drvPath, type, meta, name, value, system, overrides, outputs, outputName,
214 ignoreNulls, file, line, column, functor, toString, right, wrong, structuredAttrs,
215 allowedReferences, allowedRequisites, disallowedReferences, disallowedRequisites, maxSize,
216 maxClosureSize, builder, args, contentAddressed, impure, outputHash, outputHashAlgo,
217 outputHashMode, recurseForDerivations, description, self, startSet, operator_, key,
218 path, prefix, outputSpecified;
219
220 const Expr::AstSymbols exprSymbols;
221
222 explicit StaticSymbols(SymbolTable & symbols);
223};
224
225class EvalMemory
226{
230 std::shared_ptr<void *> valueAllocCache;
231
235 std::shared_ptr<void *> env1AllocCache;
236
237public:
239 {
240 unsigned long nrEnvs = 0;
241 unsigned long nrValuesInEnvs = 0;
242 unsigned long nrValues = 0;
243 unsigned long nrAttrsets = 0;
244 unsigned long nrAttrsInAttrsets = 0;
245 unsigned long nrListElems = 0;
246 };
247
248 EvalMemory();
249
250 EvalMemory(const EvalMemory &) = delete;
251 EvalMemory(EvalMemory &&) = delete;
252 EvalMemory & operator=(const EvalMemory &) = delete;
253 EvalMemory & operator=(EvalMemory &&) = delete;
254
255 inline Value * allocValue();
256 inline Env & allocEnv(size_t size);
257
258 Bindings * allocBindings(size_t capacity);
259 Value newList(size_t length);
260
261 BindingsBuilder buildBindings(SymbolTable & symbols, size_t capacity)
262 {
263 return BindingsBuilder(*this, symbols, allocBindings(capacity));
264 }
265
266 const Statistics getStats() const { return stats; }
267
268private:
269 Statistics stats;
270};
271
272class EvalBuiltins
273{
274 EvalMemory & mem;
275 SymbolTable & symbols;
276
277public:
278 explicit EvalBuiltins(
279 EvalMemory & mem,
280 SymbolTable & symbols,
281 const SearchPath & searchPath,
282 const Path & storeDir,
283 size_t size = 128
284 );
285
291
295 std::shared_ptr<StaticEnv> staticEnv; // !!! should be private
296
303 std::vector<std::pair<std::string, Constant>> constantInfos;
304
305private:
306 unsigned int baseEnvDispl = 0;
307
308 void createBaseEnv(const SearchPath & searchPath, const Path & storeDir);
309
310 Value * addConstant(const std::string & name, const Value & v, Constant info);
311
312 void addConstant(const std::string & name, Value * v, Constant info);
313
314 Value * addPrimOp(PrimOp && primOp);
315
316 Value prepareNixPath(const SearchPath & searchPath);
317
318public:
319 Value & get(const std::string & name);
320
321 struct Doc
322 {
323 Pos pos;
324 std::optional<std::string> name;
325 size_t arity;
326 std::vector<std::string> args;
331 const char * doc;
332 };
333
334 std::optional<Doc> getDoc(Value & v);
335};
336
337struct CachedEvalFile;
338
340{
341 RootValue vCallFlake;
342 RootValue vImportedDrvToDerivation;
343
347 std::shared_ptr<RegexCache> regexes;
348
352 std::map<SourcePath, std::shared_ptr<CachedEvalFile>> fileEval;
353};
354
356{
357 const PosTable & positions;
358 DebugState * debug;
359
360 template<std::derived_from<EvalError> T, typename... Args>
361 [[gnu::noinline]]
362 EvalErrorBuilder<T> make(const Args & ... args) {
363 return EvalErrorBuilder<T>(positions, debug, args...);
364 }
365};
366
367class EvalPaths
368{
369 ref<Store> store;
370 SearchPath searchPath_;
371 EvalErrorContext & errors;
372
373public:
374 EvalPaths(
375 AsyncIoRoot & aio,
376 const ref<Store> & store,
377 SearchPath searchPath,
378 EvalErrorContext & errors
379 );
380
381 const SearchPath & searchPath() const { return searchPath_; }
382
383private:
384 struct AllowedPath
385 {
386 struct ComponentLess : std::less<>
387 {
388 // we'll only use this for string-likes, it's fine. trust me sis.
389 using is_transparent = void;
390 };
391
392 std::map<std::string, AllowedPath, ComponentLess> children;
393
394 bool allowAllChildren = false;
395 };
396
401 std::optional<AllowedPath> allowedPaths;
402
403
404 /* Cache for calls to addToStore(); maps source paths to the store
405 paths. */
406 std::map<SourcePath, StorePath> srcToStore;
407
408 std::map<std::string, std::optional<std::string>> searchPathResolved;
409
413 std::unordered_map<Path, CheckedSourcePath> resolvedPaths;
414
415public:
419 void allowPath(const Path & path);
420
425 void allowPath(const StorePath & storePath);
426
430 void allowAndSetStorePathString(const StorePath & storePath, Value & v);
431
437
442
443 void checkURI(const std::string & uri);
444
454 Path toRealPath(const Path & path, const NixStringContext & context);
455
462 template<typename T, typename E>
463 struct PathResult : private std::variant<T, EvalErrorBuilder<E>>
464 {
465 PathResult(T p) : std::variant<T, EvalErrorBuilder<E>>(std::move(p)) {}
466 PathResult(EvalErrorBuilder<E> e) : std::variant<T, EvalErrorBuilder<E>>(std::move(e)) {}
467
468 T unwrap(NeverAsync = {}) &&
469 {
470 return std::visit(
472 [](T & p) -> T { return std::move(p); },
473 [](EvalErrorBuilder<E> & e) -> T {
474 std::move(e).debugThrow(always_progresses);
475 }
476 },
477 static_cast<std::variant<T, EvalErrorBuilder<E>> &>(*this)
478 );
479 }
480 };
481
485 kj::Promise<Result<PathResult<SourcePath, ThrownError>>> findFile(const std::string_view path);
486 kj::Promise<Result<PathResult<SourcePath, ThrownError>>>
487 findFile(const SearchPath & searchPath, const std::string_view path, const PosIdx pos = noPos);
488
496 kj::Promise<Result<std::optional<std::string>>>
498
499 kj::Promise<Result<PathResult<StorePath, EvalError>>> copyPathToStore(
500 NixStringContext & context, const SourcePath & path, RepairFlag repair = NoRepair
501 );
502
509 void mkStorePathString(const StorePath & storePath, Value & v);
510};
511
513{
514 unsigned long nrLookups = 0;
515 unsigned long nrAvoided = 0;
516 unsigned long nrOpUpdates = 0;
517 unsigned long nrOpUpdateValuesCopied = 0;
518 unsigned long nrListConcats = 0;
519 unsigned long nrPrimOpCalls = 0;
520 unsigned long nrFunctionCalls = 0;
521 unsigned long nrThunks = 0;
522
523 bool countCalls = false;
524
525 std::map<std::string, size_t> primOpCalls;
526 std::map<ExprLambda *, size_t> functionCalls;
527 std::map<PosIdx, size_t> attrSelects;
528
529 void addCall(ExprLambda & fun);
530};
531
532class Evaluator
533{
534 friend class EvalBuiltins;
535 friend class EvalState;
536
537 EvalState * activeEval = nullptr;
538
539public:
540 SymbolTable symbols;
541 PosTable positions;
542 const StaticSymbols s;
543 EvalMemory mem;
544 EvalRuntimeCaches caches;
545 EvalPaths paths;
546 EvalBuiltins builtins;
547 EvalStatistics stats;
548
553 RepairFlag repair;
554
559
564
565 std::unique_ptr<DebugState> debug;
566 EvalErrorContext errors;
567
568 Evaluator(
569 AsyncIoRoot & aio,
570 const SearchPath & _searchPath,
572 std::shared_ptr<Store> buildStore = nullptr,
573 std::function<ReplExitStatus(EvalState & es, ValMap const & extraEnv)> debugRepl = nullptr
574 );
575
576 Evaluator(const Evaluator &) = delete;
577 Evaluator(Evaluator &&) = delete;
578 Evaluator & operator=(const Evaluator &) = delete;
579 Evaluator & operator=(Evaluator &&) = delete;
580
585 Expr & parseExprFromFile(const CheckedSourcePath & path, std::shared_ptr<StaticEnv> & staticEnv);
586
591 std::string s,
592 const SourcePath & basePath,
593 std::shared_ptr<StaticEnv> & staticEnv,
594 const FeatureSettings & xpSettings = featureSettings
595 );
597 std::string s,
598 const SourcePath & basePath,
599 const FeatureSettings & xpSettings = featureSettings
600 );
601
602 std::variant<std::unique_ptr<Expr>, ExprReplBindings>
603 parseReplInput(
604 std::string s,
605 const SourcePath & basePath,
606 std::shared_ptr<StaticEnv> & staticEnv,
607 const FeatureSettings & xpSettings = featureSettings
608 );
609
610 Expr & parseStdin();
611
615 void evalLazily(Expr & e, Value & v);
616
617private:
618 Expr * parse(
619 char * text,
620 size_t length,
621 Pos::Origin origin,
622 const SourcePath & basePath,
623 std::shared_ptr<StaticEnv> & staticEnv,
624 const FeatureSettings & xpSettings = featureSettings);
625
626 std::variant<std::unique_ptr<Expr>, ExprReplBindings>
627 parse_repl(
628 char * text,
629 size_t length,
630 Pos::Origin origin,
631 const SourcePath & basePath,
632 std::shared_ptr<StaticEnv> & staticEnv,
633 const FeatureSettings & xpSettings = featureSettings
634 );
635
636public:
637 BindingsBuilder buildBindings(size_t capacity)
638 {
639 return mem.buildBindings(symbols, capacity);
640 }
641
648 void maybePrintStats();
649
653 void printStatistics();
654
661 bool fullGC();
662
681};
682
683
684class EvalState
685{
686 friend class Evaluator;
687
688 explicit EvalState(AsyncIoRoot & aio, Evaluator & ctx);
689
690public:
691 Evaluator & ctx;
692 AsyncIoRoot & aio;
693
694 EvalState(const EvalState &) = delete;
695 EvalState(EvalState &&) = delete;
696 EvalState & operator=(const EvalState &) = delete;
697 EvalState & operator=(EvalState &&) = delete;
698
699 ~EvalState();
700
704 void evalFile(const SourcePath & path, Value & v);
705
706 void resetFileCache();
707
713 void eval(Expr & e, Value & v);
714
719 inline bool evalBool(Env & env, Expr & e);
720 inline void evalAttrs(Env & env, Expr & e, Value & v);
721 inline void evalList(Env & env, Expr & e, Value & v);
722
729 inline void forceValue(Value & v, const PosIdx pos);
730
731 void tryFixupBlackHolePos(Value & v, PosIdx pos);
732
737 void forceValueDeep(Value & v);
738
742 NixInt forceInt(Value & v, const PosIdx pos, std::string_view errorCtx);
743 NixFloat forceFloat(Value & v, const PosIdx pos, std::string_view errorCtx);
744 bool forceBool(Value & v, const PosIdx pos, std::string_view errorCtx);
745
746 void forceAttrs(Value & v, const PosIdx pos, std::string_view errorCtx);
747 inline void forceList(Value & v, const PosIdx pos, std::string_view errorCtx);
751 void forceFunction(Value & v, const PosIdx pos, std::string_view errorCtx);
752 std::string_view forceString(Value & v, const PosIdx pos, std::string_view errorCtx);
753 std::string_view forceString(Value & v, NixStringContext & context, const PosIdx pos, std::string_view errorCtx);
754 std::string_view forceStringNoCtx(Value & v, const PosIdx pos, std::string_view errorCtx);
755
760 [[nodiscard]] StringMap realiseContext(const NixStringContext & context);
761
762public:
767 bool isDerivation(Value & v);
768
769 std::optional<std::string> tryAttrsToString(const PosIdx pos, Value & v,
770 NixStringContext & context, bool coerceMore = false, bool copyToStore = true);
771
780 BackedStringView coerceToString(const PosIdx pos, Value & v, NixStringContext & context,
781 std::string_view errorCtx,
782 bool coerceMore = false, bool copyToStore = true,
783 bool canonicalizePath = true);
784
792 SourcePath coerceToPath(const PosIdx pos, Value & v, NixStringContext & context, std::string_view errorCtx);
793
797 StorePath coerceToStorePath(const PosIdx pos, Value & v, NixStringContext & context, std::string_view errorCtx);
798
802 std::pair<SingleDerivedPath, std::string_view> coerceToSingleDerivedPathUnchecked(const PosIdx pos, Value & v, std::string_view errorCtx);
803
819 SingleDerivedPath coerceToSingleDerivedPath(const PosIdx pos, Value & v, std::string_view errorCtx);
820
821private:
822
823 inline Value * lookupVar(Env * env, const ExprVar & var, bool noEval);
824
825 friend struct ExprVar;
826 friend struct ExprSet;
827 friend struct ExprLet;
828
832 size_t callDepth = 0;
833
834public:
835
840 bool eqValues(Value & v1, Value & v2, const PosIdx pos, std::string_view errorCtx);
841
842 bool isFunctor(Value & fun);
843
844 // FIXME: use std::span
845 void callFunction(Value & fun, size_t nrArgs, Value * * args, Value & vRes, const PosIdx pos);
846
847 void callFunction(Value & fun, Value & arg, Value & vRes, const PosIdx pos)
848 {
849 Value * args[] = {&arg};
850 callFunction(fun, 1, args, vRes, pos);
851 }
852
857 void autoCallFunction(Bindings & args, Value & fun, Value & res, PosIdx pos);
858
859 void mkPos(Value & v, PosIdx pos);
860
881 void mkOutputString(
882 Value & value,
883 const SingleDerivedPath::Built & b,
884 std::optional<StorePath> optStaticOutputPath,
885 const ExperimentalFeatureSettings & xpSettings = experimentalFeatureSettings);
886
893 const SingleDerivedPath & p,
894 Value & v);
895
896 void concatLists(Value & v, size_t nrLists, Value * * lists, const PosIdx pos, std::string_view errorCtx);
897
898private:
899
904 std::string mkOutputStringRaw(
905 const SingleDerivedPath::Built & b,
906 std::optional<StorePath> optStaticOutputPath,
907 const ExperimentalFeatureSettings & xpSettings = experimentalFeatureSettings);
908
913 std::string mkSingleDerivedPathStringRaw(
914 const SingleDerivedPath & p);
915};
916
923std::string_view showType(ValueType type, bool withArticle = true);
924std::string showType(const Value & v);
925
926static constexpr std::string_view corepkgsPrefix{"/__corepkgs__/"};
927
928
929}
930
931#include "lix/libexpr/eval-inline.hh" // IWYU pragma: keep
Definition backed-string-view.hh:17
Definition args.hh:31
Definition attr-set.hh:128
Definition attr-set.hh:48
Definition source-path.hh:89
Definition eval.hh:183
Env & env
Definition eval.hh:290
std::vector< std::pair< std::string, Constant > > constantInfos
Definition eval.hh:303
std::shared_ptr< StaticEnv > staticEnv
Definition eval.hh:295
Definition eval-error.hh:61
Definition eval-error.hh:25
Definition eval.hh:226
Definition eval.hh:368
void allowPath(const Path &path)
Definition eval.cc:371
kj::Promise< Result< std::optional< std::string > > > resolveSearchPathPath(const SearchPath::Path &path)
Definition eval.cc:2837
void allowAndSetStorePathString(const StorePath &storePath, Value &v)
Definition eval.cc:392
CheckedSourcePath checkSourcePath(const SourcePath &path)
Definition eval.cc:399
CheckedSourcePath resolveExprPath(SourcePath path)
Definition eval.cc:2717
Path toRealPath(const Path &path, const NixStringContext &context)
Definition eval.cc:518
void mkStorePathString(const StorePath &storePath, Value &v)
Definition eval.cc:880
kj::Promise< Result< PathResult< SourcePath, ThrownError > > > findFile(const std::string_view path)
Definition eval.cc:2799
Definition eval.hh:685
StringMap realiseContext(const NixStringContext &context)
Definition primops.cc:45
SourcePath coerceToPath(const PosIdx pos, Value &v, NixStringContext &context, std::string_view errorCtx)
Definition eval.cc:2417
StorePath coerceToStorePath(const PosIdx pos, Value &v, NixStringContext &context, std::string_view errorCtx)
Definition eval.cc:2426
void forceValueDeep(Value &v)
Definition eval.cc:2097
void autoCallFunction(Bindings &args, Value &fun, Value &res, PosIdx pos)
Definition eval.cc:1756
NixInt forceInt(Value &v, const PosIdx pos, std::string_view errorCtx)
Definition eval.cc:2134
void forceValue(Value &v, const PosIdx pos)
Definition eval-inline.hh:69
void mkOutputString(Value &value, const SingleDerivedPath::Built &b, std::optional< StorePath > optStaticOutputPath, const ExperimentalFeatureSettings &xpSettings=experimentalFeatureSettings)
Definition eval.cc:905
std::pair< SingleDerivedPath, std::string_view > coerceToSingleDerivedPathUnchecked(const PosIdx pos, Value &v, std::string_view errorCtx)
Definition eval.cc:2435
void evalFile(const SourcePath &path, Value &v)
Definition eval.cc:991
bool eqValues(Value &v1, Value &v2, const PosIdx pos, std::string_view errorCtx)
Definition eval.cc:2492
BackedStringView coerceToString(const PosIdx pos, Value &v, NixStringContext &context, std::string_view errorCtx, bool coerceMore=false, bool copyToStore=true, bool canonicalizePath=true)
Definition eval.cc:2292
SingleDerivedPath coerceToSingleDerivedPath(const PosIdx pos, Value &v, std::string_view errorCtx)
Definition eval.cc:2465
void mkSingleDerivedPathString(const SingleDerivedPath &p, Value &v)
Definition eval.cc:943
bool isDerivation(Value &v)
Definition eval.cc:2261
void eval(Expr &e, Value &v)
Definition eval.cc:1037
void forceFunction(Value &v, const PosIdx pos, std::string_view errorCtx)
Definition eval.cc:2200
bool evalBool(Env &env, Expr &e)
Definition eval.cc:1051
void printStatistics()
Definition eval.cc:2599
void evalLazily(Expr &e, Value &v)
Definition eval.cc:860
box_ptr< EvalState > begin(AsyncIoRoot &aio)
Definition eval.cc:352
Expr & parseExprFromString(std::string s, const SourcePath &basePath, std::shared_ptr< StaticEnv > &staticEnv, const FeatureSettings &xpSettings=featureSettings)
Definition eval.cc:2755
const ref< Store > store
Definition eval.hh:558
RepairFlag repair
Definition eval.hh:553
bool fullGC()
Definition eval.cc:2570
Expr & parseExprFromFile(const CheckedSourcePath &path)
Definition eval.cc:2742
ref< Store > buildStore
Definition eval.hh:563
void maybePrintStats()
Definition eval.cc:2584
Definition fmt.hh:157
Definition pos-idx.hh:9
Definition pos-table.hh:13
Definition path.hh:21
Definition store-api.hh:195
Definition symbol-table.hh:73
Definition symbol-table.hh:50
Definition box_ptr.hh:16
Definition eval-cache.hh:38
Definition ref.hh:19
void(EvalState &state, Value **args, Value &v) PrimOpImpl
Definition eval.hh:42
ReplExitStatus
Definition repl-exit-status.hh:9
SourcePath.
Definition async.hh:39
Definition eval.cc:986
Definition eval.hh:90
const char * doc
Definition eval.hh:101
bool impureOnly
Definition eval.hh:106
ValueType type
Definition eval.hh:96
Definition eval.hh:147
Generator< const DebugTrace * > traces()
Definition eval.hh:203
Definition eval.hh:137
Definition eval.hh:112
Definition eval.hh:322
const char * doc
Definition eval.hh:331
Definition eval.hh:356
Definition eval.hh:239
Definition eval.hh:340
std::shared_ptr< RegexCache > regexes
Definition eval.hh:347
std::map< SourcePath, std::shared_ptr< CachedEvalFile > > fileEval
Definition eval.hh:352
Definition eval.hh:513
Definition nixexpr.hh:446
Definition nixexpr.hh:356
Definition nixexpr.hh:111
Definition nixexpr.hh:104
Definition config.hh:382
Definition generator.hh:236
Definition types.hh:172
Definition position.hh:19
Definition eval.hh:48
std::vector< std::string > args
Definition eval.hh:58
std::function< PrimOpImpl > fun
Definition eval.hh:76
std::optional< ExperimentalFeature > experimentalFeature
Definition eval.hh:81
std::string name
Definition eval.hh:52
size_t arity
Definition eval.hh:66
const char * doc
Definition eval.hh:71
Definition primops.cc:2553
Definition search-path.hh:83
Definition search-path.hh:16
Definition derived-path.hh:101
Definition source-path.hh:23
Definition nixexpr.hh:606
Definition eval.hh:212
Definition value.hh:190
Definition types.hh:164
std::string Path
Definition types.hh:28
constexpr NeverAsync always_progresses
Definition types.hh:181
ValueType
Definition value.hh:48
std::shared_ptr< Value * > RootValue
Definition value.hh:848