169 InternalType internalType = tUninitialized;
171 friend std::string showType(
const Value & v);
182 inline bool isThunk()
const {
return internalType == tThunk; };
183 inline bool isApp()
const {
return internalType == tApp; };
184 inline bool isBlackhole()
const;
187 inline bool isLambda()
const {
return internalType == tLambda; };
188 inline bool isPrimOp()
const {
return internalType == tPrimOp; };
189 inline bool isPrimOpApp()
const {
return internalType == tPrimOpApp; };
215 const char * * context;
229 Value * left, * right;
237 using Payload =
union
249 Value *
const * elems;
251 Value * smallList[2];
253 FunctionApplicationThunk app;
256 FunctionApplicationThunk primOpApp;
272 switch (internalType) {
273 case tUninitialized:
break;
274 case tInt:
return nInt;
275 case tBool:
return nBool;
276 case tString:
return nString;
277 case tPath:
return nPath;
278 case tNull:
return nNull;
279 case tAttrs:
return nAttrs;
280 case tList1:
case tList2:
case tListN:
return nList;
281 case tLambda:
case tPrimOp:
case tPrimOpApp:
return nFunction;
282 case tExternal:
return nExternal;
283 case tFloat:
return nFloat;
284 case tThunk:
case tApp:
return nThunk;
292 inline void finishValue(InternalType newType, Payload newPayload)
294 payload = newPayload;
295 internalType = newType;
305 return internalType != tUninitialized;
308 inline void mkInt(NixInt::Inner n)
313 inline void mkInt(NixInt n)
315 finishValue(tInt, { .integer = n });
318 inline void mkBool(
bool b)
320 finishValue(tBool, { .boolean = b });
323 inline void mkString(
const char *
s,
const char * * context = 0)
325 finishValue(tString, { .string = { .c_str =
s, .context = context } });
328 void mkString(std::string_view
s);
330 void mkString(std::string_view
s,
const NixStringContext & context);
332 void mkStringMove(
const char *
s,
const NixStringContext & context);
334 inline void mkString(
const SymbolStr &
s)
339 void mkPath(
const SourcePath & path);
340 void mkPath(std::string_view path);
342 inline void mkPath(SourceAccessor *
accessor,
const char * path)
344 finishValue(tPath, { .path = { .accessor =
accessor, .path = path } });
349 finishValue(tNull, {});
352 inline void mkAttrs(Bindings * a)
354 finishValue(tAttrs, { .attrs = a });
357 Value & mkAttrs(BindingsBuilder &
bindings);
359 void mkList(
const ListBuilder & builder)
361 if (builder.size == 1)
362 finishValue(tList1, { .smallList = { builder.inlineElems[0] } });
363 else if (builder.size == 2)
364 finishValue(tList2, { .smallList = { builder.inlineElems[0], builder.inlineElems[1] } });
366 finishValue(tListN, { .bigList = { .size = builder.size, .elems = builder.elems } });
369 inline void mkThunk(Env * e, Expr * ex)
371 finishValue(tThunk, { .thunk = { .env = e, .expr = ex } });
374 inline void mkApp(Value * l, Value * r)
376 finishValue(tApp, { .app = { .left = l, .right = r } });
379 inline void mkLambda(Env * e, ExprLambda *
f)
381 finishValue(tLambda, { .lambda = { .env = e, .fun =
f } });
384 inline void mkBlackhole();
386 void mkPrimOp(PrimOp *
p);
388 inline void mkPrimOpApp(Value * l, Value * r)
390 finishValue(tPrimOpApp, { .primOpApp = { .left = l, .right = r } });
398 inline void mkExternal(ExternalValueBase * e)
400 finishValue(tExternal, { .external = e });
403 inline void mkFloat(NixFloat n)
405 finishValue(tFloat, { .fpoint = n });
410 return internalType == tList1 || internalType == tList2 || internalType == tListN;
413 Value *
const * listElems()
415 return internalType == tList1 || internalType == tList2 ? payload.smallList : payload.bigList.elems;
418 std::span<Value * const> listItems()
const
421 return std::span<Value * const>(listElems(), listSize());
424 Value *
const * listElems()
const
426 return internalType == tList1 || internalType == tList2 ? payload.smallList : payload.bigList.elems;
429 size_t listSize()
const
431 return internalType == tList1 ? 1 : internalType == tList2 ? 2 : payload.bigList.size;
434 PosIdx determinePos(
const PosIdx pos)
const;
443 SourcePath path()
const
445 assert(internalType == tPath);
447 ref(payload.path.accessor->shared_from_this()),
448 CanonPath(CanonPath::unchecked_t(), payload.path.path));
451 std::string_view string_view()
const
453 assert(internalType == tString);
454 return std::string_view(payload.string.c_str);
457 const char * c_str()
const
459 assert(internalType == tString);
460 return payload.string.c_str;
463 const char * * context()
const
465 return payload.string.context;
468 ExternalValueBase * external()
const
469 {
return payload.external; }
471 const Bindings * attrs()
const
472 {
return payload.attrs; }
474 const PrimOp * primOp()
const
475 {
return payload.primOp; }
478 {
return payload.boolean; }
480 NixInt integer()
const
481 {
return payload.integer; }
483 NixFloat fpoint()
const
484 {
return payload.fpoint; }