@@ -39,6 +39,7 @@ typedef enum {
3939 tExternal,
4040 tPrimOp,
4141 tAttrs,
42+ tPath,
4243 /* layout: Pair of pointers payload */
4344 tListSmall,
4445 tPrimOpApp,
@@ -48,7 +49,6 @@ typedef enum {
4849 /* layout: Single untaggable field */
4950 tListN,
5051 tString,
51- tPath,
5252} InternalType;
5353
5454/* *
@@ -225,7 +225,6 @@ struct ValueBase
225225
226226 struct Path
227227 {
228- SourceAccessor * accessor;
229228 const char * path;
230229 };
231230
@@ -415,7 +414,7 @@ class alignas(16) ValueStorage<ptrSize, std::enable_if_t<detail::useBitPackedVal
415414 * That leaves the first 8 bytes free for storing the InternalType in the upper
416415 * bits.
417416 *
418- * PrimaryDiscriminator::pdListN - pdPath - Only has 3 available padding bits
417+ * PrimaryDiscriminator::pdListN - pdString - Only has 3 available padding bits
419418 * because:
420419 * - tListN needs a size, whose lower bits we can't borrow.
421420 * - tString and tPath have C-string fields, which don't necessarily need to
@@ -436,7 +435,6 @@ class alignas(16) ValueStorage<ptrSize, std::enable_if_t<detail::useBitPackedVal
436435 /* The order of these enumations must be the same as in InternalType. */
437436 pdListN, // < layout: Single untaggable field.
438437 pdString,
439- pdPath,
440438 pdPairOfPointers, // < layout: Pair of pointers payload
441439 };
442440
@@ -469,7 +467,7 @@ class alignas(16) ValueStorage<ptrSize, std::enable_if_t<detail::useBitPackedVal
469467 template <PrimaryDiscriminator discriminator, typename T, typename U>
470468 void setUntaggablePayload (T * firstPtrField, U untaggableField) noexcept
471469 {
472- static_assert (discriminator >= pdListN && discriminator <= pdPath );
470+ static_assert (discriminator >= pdListN && discriminator <= pdString );
473471 auto firstFieldPayload = std::bit_cast<PackedPointer>(firstPtrField);
474472 assertAligned (firstFieldPayload);
475473 payload[0 ] = static_cast <int >(discriminator) | firstFieldPayload;
@@ -515,7 +513,6 @@ protected:
515513 /* The order must match that of the enumerations defined in InternalType. */
516514 case pdListN:
517515 case pdString:
518- case pdPath:
519516 return static_cast <InternalType>(tListN + (pd - pdListN));
520517 case pdPairOfPointers:
521518 return static_cast <InternalType>(tListSmall + (payload[1 ] & discriminatorMask));
@@ -578,6 +575,11 @@ protected:
578575 attrs = std::bit_cast<Bindings *>(payload[1 ]);
579576 }
580577
578+ void getStorage (Path & path) const noexcept
579+ {
580+ path.path = std::bit_cast<const char *>(payload[1 ]);
581+ }
582+
581583 void getStorage (List & list) const noexcept
582584 {
583585 list.elems = untagPointer<decltype (list.elems )>(payload[0 ]);
@@ -590,12 +592,6 @@ protected:
590592 string.c_str = std::bit_cast<const char *>(payload[1 ]);
591593 }
592594
593- void getStorage (Path & path) const noexcept
594- {
595- path.accessor = untagPointer<decltype (path.accessor )>(payload[0 ]);
596- path.path = std::bit_cast<const char *>(payload[1 ]);
597- }
598-
599595 void setStorage (NixInt integer) noexcept
600596 {
601597 setSingleDWordPayload<tInt>(integer.value );
@@ -631,6 +627,11 @@ protected:
631627 setSingleDWordPayload<tAttrs>(std::bit_cast<PackedPointer>(bindings));
632628 }
633629
630+ void setStorage (Path path) noexcept
631+ {
632+ setSingleDWordPayload<tPath>(std::bit_cast<PackedPointer>(path.path ));
633+ }
634+
634635 void setStorage (List list) noexcept
635636 {
636637 setUntaggablePayload<pdListN>(list.elems , list.size );
@@ -640,11 +641,6 @@ protected:
640641 {
641642 setUntaggablePayload<pdString>(string.context , string.c_str );
642643 }
643-
644- void setStorage (Path path) noexcept
645- {
646- setUntaggablePayload<pdPath>(path.accessor , path.path );
647- }
648644};
649645
650646/* *
@@ -1002,11 +998,11 @@ public:
1002998
1003999 void mkStringMove (const char * s, const NixStringContext & context);
10041000
1005- void mkPath (const SourcePath & path);
1001+ void mkPath (const CanonPath & path);
10061002
1007- inline void mkPath (SourceAccessor * accessor, const char * path) noexcept
1003+ inline void mkPath (const char * path) noexcept
10081004 {
1009- setStorage (Path{.accessor = accessor, . path = path});
1005+ setStorage (Path{.path = path});
10101006 }
10111007
10121008 inline void mkNull () noexcept
@@ -1102,9 +1098,9 @@ public:
11021098 */
11031099 bool isTrivial () const ;
11041100
1105- SourcePath path () const
1101+ CanonPath path () const
11061102 {
1107- return SourcePath ( ref ( pathAccessor ()-> shared_from_this ()), CanonPath (CanonPath::unchecked_t (), pathStr () ));
1103+ return CanonPath (CanonPath::unchecked_t (), pathStr ());
11081104 }
11091105
11101106 std::string_view string_view () const noexcept
@@ -1176,11 +1172,6 @@ public:
11761172 {
11771173 return getStorage<Path>().path ;
11781174 }
1179-
1180- SourceAccessor * pathAccessor () const noexcept
1181- {
1182- return getStorage<Path>().accessor ;
1183- }
11841175};
11851176
11861177extern ExprBlackHole eBlackHole;
0 commit comments