From d4ae5c5fbc9f599a05eb0de269cdc4a247b2d1a6 Mon Sep 17 00:00:00 2001 From: Jon Siwek Date: Wed, 13 Jan 2021 15:16:52 -0800 Subject: [PATCH] Adjust memory management for &default argument expression type-check Mainly, there was an extra Ref(). In theory, the front-insertion was also not efficient. --- src/Expr.cc | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/Expr.cc b/src/Expr.cc index b5c21247fa..4db734f0ad 100644 --- a/src/Expr.cc +++ b/src/Expr.cc @@ -5277,7 +5277,7 @@ bool check_and_promote_args(ListExpr* const args, RecordType* types) if ( el.length() < ntypes ) { - ExprPList def_elements; + std::vector def_elements; // Start from rightmost parameter, work backward to fill in missing // arguments using &default expressions. @@ -5300,12 +5300,13 @@ bool check_and_promote_args(ListExpr* const args, RecordType* types) // separately for each instance, rather than // one instance inheriting the transformed version // from another. - auto e = def_attr->GetExpr(); - def_elements.push_front(e->Duplicate().release()); + const auto& e = def_attr->GetExpr(); + def_elements.emplace_back(e->Duplicate()); } - for ( const auto& elem : def_elements ) - el.push_back(elem->Ref()); + auto ne = def_elements.size(); + while ( ne ) + el.push_back(def_elements[--ne].release()); } TypeList* tl = new TypeList();