From 9e9dfe36df18ddcbae8172bbd31438d3758dece6 Mon Sep 17 00:00:00 2001 From: Taeer Bar-Yam Date: Mon, 27 Oct 2025 19:30:17 +0100 Subject: [PATCH] libexpr: store ExprList data in Exprs::alloc --- src/libexpr/include/nix/expr/nixexpr.hh | 10 ++++++++-- src/libexpr/parser.y | 10 +++++----- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/libexpr/include/nix/expr/nixexpr.hh b/src/libexpr/include/nix/expr/nixexpr.hh index 86ad01504..26d5addd5 100644 --- a/src/libexpr/include/nix/expr/nixexpr.hh +++ b/src/libexpr/include/nix/expr/nixexpr.hh @@ -442,8 +442,14 @@ struct ExprAttrs : Expr struct ExprList : Expr { - std::vector elems; - ExprList() {}; + std::span elems; + + ExprList(std::pmr::polymorphic_allocator & alloc, std::vector exprs) + : elems({alloc.allocate_object(exprs.size()), exprs.size()}) + { + std::ranges::copy(exprs, elems.begin()); + }; + COMMON_METHODS Value * maybeThunk(EvalState & state, Env & env) override; diff --git a/src/libexpr/parser.y b/src/libexpr/parser.y index 93c944dcf..40d93a15b 100644 --- a/src/libexpr/parser.y +++ b/src/libexpr/parser.y @@ -129,7 +129,7 @@ static Expr * makeCall(PosIdx pos, Expr * fn, Expr * arg) { %type start expr expr_function expr_if expr_op %type expr_select expr_simple expr_app %type expr_pipe_from expr_pipe_into -%type expr_list +%type > list %type binds binds1 %type formals formal_set %type formal @@ -334,7 +334,7 @@ expr_simple { $2->pos = CUR_POS; $$ = $2; } | '{' '}' { $$ = new ExprAttrs(CUR_POS); } - | '[' expr_list ']' { $$ = $2; } + | '[' list ']' { $$ = new ExprList(state->alloc, std::move($2)); } ; string_parts @@ -484,9 +484,9 @@ string_attr | DOLLAR_CURLY expr '}' { $$ = $2; } ; -expr_list - : expr_list expr_select { $$ = $1; $1->elems.push_back($2); /* !!! dangerous */; $2->warnIfCursedOr(state->symbols, state->positions); } - | { $$ = new ExprList; } +list + : list expr_select { $$ = std::move($1); $$.push_back($2); /* !!! dangerous */; $2->warnIfCursedOr(state->symbols, state->positions); } + | { } ; formal_set