Skip to content

Commit ac8b1ef

Browse files
authored
Merge pull request #14379 from Radvendii/exprlist-alloc
libexpr: store ExprList data in Exprs::alloc
2 parents 7f1d927 + 9e9dfe3 commit ac8b1ef

File tree

2 files changed

+13
-7
lines changed

2 files changed

+13
-7
lines changed

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -442,8 +442,14 @@ struct ExprAttrs : Expr
442442

443443
struct ExprList : Expr
444444
{
445-
std::vector<Expr *> elems;
446-
ExprList() {};
445+
std::span<Expr *> elems;
446+
447+
ExprList(std::pmr::polymorphic_allocator<char> & alloc, std::vector<Expr *> exprs)
448+
: elems({alloc.allocate_object<Expr *>(exprs.size()), exprs.size()})
449+
{
450+
std::ranges::copy(exprs, elems.begin());
451+
};
452+
447453
COMMON_METHODS
448454
Value * maybeThunk(EvalState & state, Env & env) override;
449455

src/libexpr/parser.y

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ static Expr * makeCall(PosIdx pos, Expr * fn, Expr * arg) {
129129
%type <nix::Expr *> start expr expr_function expr_if expr_op
130130
%type <nix::Expr *> expr_select expr_simple expr_app
131131
%type <nix::Expr *> expr_pipe_from expr_pipe_into
132-
%type <nix::ExprList *> expr_list
132+
%type <std::vector<Expr *>> list
133133
%type <nix::ExprAttrs *> binds binds1
134134
%type <nix::Formals *> formals formal_set
135135
%type <nix::Formal> formal
@@ -334,7 +334,7 @@ expr_simple
334334
{ $2->pos = CUR_POS; $$ = $2; }
335335
| '{' '}'
336336
{ $$ = new ExprAttrs(CUR_POS); }
337-
| '[' expr_list ']' { $$ = $2; }
337+
| '[' list ']' { $$ = new ExprList(state->alloc, std::move($2)); }
338338
;
339339

340340
string_parts
@@ -484,9 +484,9 @@ string_attr
484484
| DOLLAR_CURLY expr '}' { $$ = $2; }
485485
;
486486

487-
expr_list
488-
: expr_list expr_select { $$ = $1; $1->elems.push_back($2); /* !!! dangerous */; $2->warnIfCursedOr(state->symbols, state->positions); }
489-
| { $$ = new ExprList; }
487+
list
488+
: list expr_select { $$ = std::move($1); $$.push_back($2); /* !!! dangerous */; $2->warnIfCursedOr(state->symbols, state->positions); }
489+
| { }
490490
;
491491

492492
formal_set

0 commit comments

Comments
 (0)