From ef8dd58d9bb41d5c4dba1765bb4342f4082fba5a Mon Sep 17 00:00:00 2001 From: Taeer Bar-Yam Date: Mon, 27 Oct 2025 18:31:55 +0100 Subject: [PATCH 1/2] parser.y: use std::move() to avoid unnecessary copies With #14314, in some places in the parser we started using C++ objects directly rather than pointers. In those places lines like `$$ = $1` now imply a copy when we don't need one. This commit changes those to `$$ = std::move($1)` to avoid those copies. --- src/libexpr/parser.y | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/libexpr/parser.y b/src/libexpr/parser.y index 93c944dcf..2257e1b45 100644 --- a/src/libexpr/parser.y +++ b/src/libexpr/parser.y @@ -345,8 +345,8 @@ string_parts string_parts_interpolated : string_parts_interpolated STR - { $$ = $1; $$.emplace_back(state->at(@2), new ExprString(state->alloc, $2)); } - | string_parts_interpolated DOLLAR_CURLY expr '}' { $$ = $1; $$.emplace_back(state->at(@2), $3); } + { $$ = std::move($1); $$.emplace_back(state->at(@2), new ExprString(state->alloc, $2)); } + | string_parts_interpolated DOLLAR_CURLY expr '}' { $$ = std::move($1); $$.emplace_back(state->at(@2), $3); } | DOLLAR_CURLY expr '}' { $$.emplace_back(state->at(@1), $2); } | STR DOLLAR_CURLY expr '}' { $$.emplace_back(state->at(@1), new ExprString(state->alloc, $1)); @@ -391,8 +391,8 @@ path_start ; ind_string_parts - : ind_string_parts IND_STR { $$ = $1; $$.emplace_back(state->at(@2), $2); } - | ind_string_parts DOLLAR_CURLY expr '}' { $$ = $1; $$.emplace_back(state->at(@2), $3); } + : ind_string_parts IND_STR { $$ = std::move($1); $$.emplace_back(state->at(@2), $2); } + | ind_string_parts DOLLAR_CURLY expr '}' { $$ = std::move($1); $$.emplace_back(state->at(@2), $3); } | { } ; @@ -440,9 +440,9 @@ binds1 ; attrs - : attrs attr { $$ = $1; $$.emplace_back(AttrName(state->symbols.create($2)), state->at(@2)); } + : attrs attr { $$ = std::move($1); $$.emplace_back(AttrName(state->symbols.create($2)), state->at(@2)); } | attrs string_attr - { $$ = $1; + { $$ = std::move($1); std::visit(overloaded { [&](std::string_view str) { $$.emplace_back(AttrName(state->symbols.create(str)), state->at(@2)); }, [&](Expr * expr) { @@ -457,20 +457,20 @@ attrs ; attrpath - : attrpath '.' attr { $$ = $1; $$.push_back(AttrName(state->symbols.create($3))); } + : attrpath '.' attr { $$ = std::move($1); $$.push_back(AttrName(state->symbols.create($3))); } | attrpath '.' string_attr - { $$ = $1; + { $$ = std::move($1); std::visit(overloaded { [&](std::string_view str) { $$.push_back(AttrName(state->symbols.create(str))); }, [&](Expr * expr) { $$.push_back(AttrName(expr)); } - }, $3); + }, std::move($3)); } | attr { $$.push_back(AttrName(state->symbols.create($1))); } | string_attr { std::visit(overloaded { [&](std::string_view str) { $$.push_back(AttrName(state->symbols.create(str))); }, [&](Expr * expr) { $$.push_back(AttrName(expr)); } - }, $1); + }, std::move($1)); } ; @@ -480,7 +480,7 @@ attr ; string_attr - : '"' string_parts '"' { $$ = $2; } + : '"' string_parts '"' { $$ = std::move($2); } | DOLLAR_CURLY expr '}' { $$ = $2; } ; From 50e8d17f3c08a3d929c2a663a9711dca7a656635 Mon Sep 17 00:00:00 2001 From: Taeer Bar-Yam Date: Mon, 27 Oct 2025 18:46:30 +0100 Subject: [PATCH 2/2] parser.y: use emplace_back() for vector --- src/libexpr/parser.y | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/libexpr/parser.y b/src/libexpr/parser.y index 2257e1b45..cf563e869 100644 --- a/src/libexpr/parser.y +++ b/src/libexpr/parser.y @@ -440,11 +440,11 @@ binds1 ; attrs - : attrs attr { $$ = std::move($1); $$.emplace_back(AttrName(state->symbols.create($2)), state->at(@2)); } + : attrs attr { $$ = std::move($1); $$.emplace_back(state->symbols.create($2), state->at(@2)); } | attrs string_attr { $$ = std::move($1); std::visit(overloaded { - [&](std::string_view str) { $$.emplace_back(AttrName(state->symbols.create(str)), state->at(@2)); }, + [&](std::string_view str) { $$.emplace_back(state->symbols.create(str), state->at(@2)); }, [&](Expr * expr) { throw ParseError({ .msg = HintFmt("dynamic attributes not allowed in inherit"), @@ -457,19 +457,19 @@ attrs ; attrpath - : attrpath '.' attr { $$ = std::move($1); $$.push_back(AttrName(state->symbols.create($3))); } + : attrpath '.' attr { $$ = std::move($1); $$.emplace_back(state->symbols.create($3)); } | attrpath '.' string_attr { $$ = std::move($1); std::visit(overloaded { - [&](std::string_view str) { $$.push_back(AttrName(state->symbols.create(str))); }, - [&](Expr * expr) { $$.push_back(AttrName(expr)); } + [&](std::string_view str) { $$.emplace_back(state->symbols.create(str)); }, + [&](Expr * expr) { $$.emplace_back(expr); } }, std::move($3)); } - | attr { $$.push_back(AttrName(state->symbols.create($1))); } + | attr { $$.emplace_back(state->symbols.create($1)); } | string_attr { std::visit(overloaded { - [&](std::string_view str) { $$.push_back(AttrName(state->symbols.create(str))); }, - [&](Expr * expr) { $$.push_back(AttrName(expr)); } + [&](std::string_view str) { $$.emplace_back(state->symbols.create(str)); }, + [&](Expr * expr) { $$.emplace_back(expr); } }, std::move($1)); } ;