Skip to content

Commit 403b9af

Browse files
committed
libexpr: use allocBytes() to allocate StringData
1 parent 77982c5 commit 403b9af

File tree

20 files changed

+83
-83
lines changed

20 files changed

+83
-83
lines changed

src/libcmd/common-eval-args.cc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -168,9 +168,9 @@ Bindings * MixEvalArgs::getAutoArgs(EvalState & state)
168168
? state.rootPath(absPath(getCommandBaseDir()))
169169
: state.rootPath(".")));
170170
},
171-
[&](const AutoArgString & arg) { v->mkString(arg.s); },
172-
[&](const AutoArgFile & arg) { v->mkString(readFile(arg.path.string())); },
173-
[&](const AutoArgStdin & arg) { v->mkString(readFile(STDIN_FILENO)); }},
171+
[&](const AutoArgString & arg) { v->mkString(arg.s, state.mem); },
172+
[&](const AutoArgFile & arg) { v->mkString(readFile(arg.path.string()), state.mem); },
173+
[&](const AutoArgStdin & arg) { v->mkString(readFile(STDIN_FILENO), state.mem); }},
174174
arg);
175175
res.insert(state.symbols.create(name), v);
176176
}

src/libexpr-c/nix_api_value.cc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -497,13 +497,13 @@ nix_err nix_init_bool(nix_c_context * context, nix_value * value, bool b)
497497
}
498498

499499
// todo string context
500-
nix_err nix_init_string(nix_c_context * context, nix_value * value, const char * str)
500+
nix_err nix_init_string(nix_c_context * context, EvalState * s, nix_value * value, const char * str)
501501
{
502502
if (context)
503503
context->last_err_code = NIX_OK;
504504
try {
505505
auto & v = check_value_out(value);
506-
v.mkString(std::string_view(str));
506+
v.mkString(std::string_view(str), s->state.mem);
507507
}
508508
NIXC_CATCH_ERRS
509509
}
@@ -514,7 +514,7 @@ nix_err nix_init_path_string(nix_c_context * context, EvalState * s, nix_value *
514514
context->last_err_code = NIX_OK;
515515
try {
516516
auto & v = check_value_out(value);
517-
v.mkPath(s->state.rootPath(nix::CanonPath(str)));
517+
v.mkPath(s->state.rootPath(nix::CanonPath(str)), s->state.mem);
518518
}
519519
NIXC_CATCH_ERRS
520520
}

src/libexpr-c/nix_api_value.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -520,7 +520,7 @@ nix_err nix_init_bool(nix_c_context * context, nix_value * value, bool b);
520520
* @param[in] str the string, copied
521521
* @return error code, NIX_OK on success.
522522
*/
523-
nix_err nix_init_string(nix_c_context * context, nix_value * value, const char * str);
523+
nix_err nix_init_string(nix_c_context * context, EvalState * s, nix_value * value, const char * str);
524524

525525
/** @brief Set a path
526526
* @ingroup value_create

src/libexpr-tests/json.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ TEST_F(JSONValueTest, StringQuotes)
7373
TEST_F(JSONValueTest, DISABLED_Path)
7474
{
7575
Value v;
76-
v.mkPath(state.rootPath(CanonPath("/test")));
76+
v.mkPath(state.rootPath(CanonPath("/test")), state.mem);
7777
ASSERT_EQ(getJSONValue(v), "\"/nix/store/g1w7hy3qg1w7hy3qg1w7hy3qg1w7hy3q-x\"");
7878
}
7979
} /* namespace nix */

src/libexpr-tests/nix_api_expr.cc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,7 @@ primop_repeat(void * user_data, nix_c_context * context, EvalState * state, nix_
290290
for (int i = 0; i < n; ++i)
291291
result += s;
292292

293-
nix_init_string(context, ret, result.c_str());
293+
nix_init_string(context, state, ret, result.c_str());
294294
}
295295

296296
TEST_F(nix_api_expr_test, nix_expr_primop_arity_2_multiple_calls)
@@ -305,7 +305,7 @@ TEST_F(nix_api_expr_test, nix_expr_primop_arity_2_multiple_calls)
305305

306306
nix_value * hello = nix_alloc_value(ctx, state);
307307
assert_ctx_ok();
308-
nix_init_string(ctx, hello, "hello");
308+
nix_init_string(ctx, state, hello, "hello");
309309
assert_ctx_ok();
310310

311311
nix_value * three = nix_alloc_value(ctx, state);
@@ -340,7 +340,7 @@ TEST_F(nix_api_expr_test, nix_expr_primop_arity_2_single_call)
340340

341341
nix_value * hello = nix_alloc_value(ctx, state);
342342
assert_ctx_ok();
343-
nix_init_string(ctx, hello, "hello");
343+
nix_init_string(ctx, state, hello, "hello");
344344
assert_ctx_ok();
345345

346346
nix_value * three = nix_alloc_value(ctx, state);

src/libexpr-tests/nix_api_value.cc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ TEST_F(nix_api_expr_test, nix_value_set_get_string)
8080
{
8181
std::string string_value;
8282
const char * myString = "some string";
83-
nix_init_string(ctx, value, myString);
83+
nix_init_string(ctx, state, value, myString);
8484

8585
nix_get_string(ctx, value, OBSERVE_STRING(string_value));
8686
ASSERT_STREQ(myString, string_value.c_str());
@@ -306,7 +306,7 @@ TEST_F(nix_api_expr_test, nix_build_and_init_attr)
306306
nix_init_int(ctx, intValue, 42);
307307

308308
nix_value * stringValue = nix_alloc_value(ctx, state);
309-
nix_init_string(ctx, stringValue, "foo");
309+
nix_init_string(ctx, state, stringValue, "foo");
310310

311311
nix_bindings_builder_insert(ctx, builder, "a", intValue);
312312
nix_bindings_builder_insert(ctx, builder, "b", stringValue);
@@ -625,7 +625,7 @@ TEST_F(nix_api_expr_test, nix_value_init)
625625
TEST_F(nix_api_expr_test, nix_value_init_apply_error)
626626
{
627627
nix_value * some_string = nix_alloc_value(ctx, state);
628-
nix_init_string(ctx, some_string, "some string");
628+
nix_init_string(ctx, state, some_string, "some string");
629629
assert_ctx_ok();
630630

631631
nix_value * v = nix_alloc_value(ctx, state);

src/libexpr-tests/value/print.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -268,7 +268,7 @@ struct StringPrintingTests : LibExprTest
268268
void test(std::string_view literal, std::string_view expected, unsigned int maxLength, A... args)
269269
{
270270
Value v;
271-
v.mkString(literal);
271+
v.mkString(literal, state.mem);
272272

273273
std::stringstream out;
274274
printValue(state, out, v, PrintOptions{.maxStringLength = maxLength});
@@ -353,7 +353,7 @@ TEST_F(ValuePrintingTests, ansiColorsStringElided)
353353
TEST_F(ValuePrintingTests, ansiColorsPath)
354354
{
355355
Value v;
356-
v.mkPath(state.rootPath(CanonPath("puppy")));
356+
v.mkPath(state.rootPath(CanonPath("puppy")), state.mem);
357357

358358
test(v, ANSI_GREEN "/puppy" ANSI_NORMAL, PrintOptions{.ansiColors = true});
359359
}

src/libexpr/eval.cc

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -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

857857
Value::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

869869
void 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

874874
void 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

884884
inline 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());

src/libexpr/include/nix/expr/value.hh

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -232,13 +232,13 @@ public:
232232
* Allocate StringData on the (possibly) GC-managed heap and copy
233233
* the contents of s to it.
234234
*/
235-
static const StringData & make(std::string_view s);
235+
static const StringData & make(EvalMemory & mem, std::string_view s);
236236

237237
/**
238238
* Allocate StringData on the (possibly) GC-managed heap.
239239
* @param size Length of the string (without the NUL terminator).
240240
*/
241-
static StringData & alloc(size_t size);
241+
static StringData & alloc(EvalMemory & mem, size_t size);
242242

243243
size_t size() const
244244
{
@@ -1147,13 +1147,13 @@ public:
11471147
setStorage(StringWithContext{.str = &s, .context = context});
11481148
}
11491149

1150-
void mkString(std::string_view s);
1150+
void mkString(std::string_view s, EvalMemory & mem);
11511151

11521152
void mkString(std::string_view s, const NixStringContext & context, EvalMemory & mem);
11531153

11541154
void mkStringMove(const StringData & s, const NixStringContext & context, EvalMemory & mem);
11551155

1156-
void mkPath(const SourcePath & path);
1156+
void mkPath(const SourcePath & path, EvalMemory & mem);
11571157

11581158
inline void mkPath(SourceAccessor * accessor, const StringData & path) noexcept
11591159
{

src/libexpr/json-to-value.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ class JSONSax : nlohmann::json_sax<json>
151151
bool string(string_t & val) override
152152
{
153153
forceNoNullByte(val);
154-
rs->value(state).mkString(val);
154+
rs->value(state).mkString(val, state.mem);
155155
rs->add();
156156
return true;
157157
}

0 commit comments

Comments
 (0)