@@ -81,20 +81,20 @@ static const char * makeImmutableString(std::string_view s)
8181 return t;
8282}
8383
84- StringData & StringData::alloc (size_t size)
84+ StringData & StringData::alloc (EvalMemory & mem, size_t size)
8585{
86- void * t = GC_MALLOC_ATOMIC (sizeof (StringData) + size + 1 );
86+ void * t = mem. allocBytes (sizeof (StringData) + size + 1 );
8787 if (!t)
8888 throw std::bad_alloc ();
8989 auto res = new (t) StringData (size);
9090 return *res;
9191}
9292
93- const StringData & StringData::make (std::string_view s)
93+ const StringData & StringData::make (EvalMemory & mem, std::string_view s)
9494{
9595 if (s.empty ())
9696 return " " _sds;
97- auto & res = alloc (s.size ());
97+ auto & res = alloc (mem, s.size ());
9898 std::memcpy (&res.data_ , s.data (), s.size ());
9999 res.data_ [s.size ()] = ' \0 ' ;
100100 return res;
@@ -849,9 +849,9 @@ DebugTraceStacker::DebugTraceStacker(EvalState & evalState, DebugTrace t)
849849 evalState.runDebugRepl (nullptr , trace.env , trace.expr );
850850}
851851
852- void Value::mkString (std::string_view s)
852+ void Value::mkString (std::string_view s, EvalMemory & mem )
853853{
854- mkStringNoCopy (StringData::make (s));
854+ mkStringNoCopy (StringData::make (mem, s));
855855}
856856
857857Value::StringWithContext::Context *
@@ -862,23 +862,23 @@ Value::StringWithContext::Context::fromBuilder(const NixStringContext & context,
862862
863863 auto ctx = new (mem.allocBytes (sizeof (Context) + context.size () * sizeof (value_type))) Context (context.size ());
864864 std::ranges::transform (
865- context, ctx->elems , [](const NixStringContextElem & elt) { return &StringData::make (elt.to_string ()); });
865+ context, ctx->elems , [& ](const NixStringContextElem & elt) { return &StringData::make (mem, elt.to_string ()); });
866866 return ctx;
867867}
868868
869869void Value::mkString (std::string_view s, const NixStringContext & context, EvalMemory & mem)
870870{
871- mkStringNoCopy (StringData::make (s), Value::StringWithContext::Context::fromBuilder (context, mem));
871+ mkStringNoCopy (StringData::make (mem, s), Value::StringWithContext::Context::fromBuilder (context, mem));
872872}
873873
874874void Value::mkStringMove (const StringData & s, const NixStringContext & context, EvalMemory & mem)
875875{
876876 mkStringNoCopy (s, Value::StringWithContext::Context::fromBuilder (context, mem));
877877}
878878
879- void Value::mkPath (const SourcePath & path)
879+ void Value::mkPath (const SourcePath & path, EvalMemory & mem )
880880{
881- mkPath (&*path.accessor , StringData::make (path.path .abs ()));
881+ mkPath (&*path.accessor , StringData::make (mem, path.path .abs ()));
882882}
883883
884884inline Value * EvalState::lookupVar (Env * env, const ExprVar & var, bool noEval)
@@ -943,7 +943,7 @@ void EvalState::mkPos(Value & v, PosIdx p)
943943 auto origin = positions.originOf (p);
944944 if (auto path = std::get_if<SourcePath>(&origin)) {
945945 auto attrs = buildBindings (3 );
946- attrs.alloc (s.file ).mkString (path->path .abs ());
946+ attrs.alloc (s.file ).mkString (path->path .abs (), mem );
947947 makePositionThunks (*this , p, attrs.alloc (s.line ), attrs.alloc (s.column ));
948948 v.mkAttrs (attrs);
949949 } else
@@ -2139,9 +2139,9 @@ void ExprConcatStrings::eval(EvalState & state, Env & env, Value & v)
21392139 for (const auto & part : strings) {
21402140 resultStr += *part;
21412141 }
2142- v.mkPath (state.rootPath (CanonPath (resultStr)));
2142+ v.mkPath (state.rootPath (CanonPath (resultStr)), state. mem );
21432143 } else {
2144- auto & resultStr = StringData::alloc (sSize );
2144+ auto & resultStr = StringData::alloc (state. mem , sSize );
21452145 auto * tmp = resultStr.data ();
21462146 for (const auto & part : strings) {
21472147 std::memcpy (tmp, part->data (), part->size ());
0 commit comments