diff --git a/src/Expr.cc b/src/Expr.cc index 96bbefaa76..bf68c7bc40 100644 --- a/src/Expr.cc +++ b/src/Expr.cc @@ -5029,7 +5029,7 @@ bool ListExpr::IsPure() const ValPtr ListExpr::Eval(Frame* f) const { - auto v = make_intrusive(TYPE_ANY); + std::vector evs; for ( const auto& expr : exprs ) { @@ -5041,10 +5041,10 @@ ValPtr ListExpr::Eval(Frame* f) const return nullptr; } - v->Append(std::move(ev)); + evs.push_back(std::move(ev)); } - return v; + return make_intrusive(cast_intrusive(type), std::move(evs)); } TypePtr ListExpr::InitType() const diff --git a/src/Val.cc b/src/Val.cc index d95e217fc6..d8edeb532f 100644 --- a/src/Val.cc +++ b/src/Val.cc @@ -1563,6 +1563,12 @@ ListVal::ListVal(TypeTag t) : Val(make_intrusive(t == TYPE_ANY ? nullp tag = t; } +ListVal::ListVal(TypeListPtr tl, std::vector _vals) : Val(std::move(tl)) + { + tag = TYPE_ANY; + vals = std::move(_vals); + } + ValPtr ListVal::SizeVal() const { return val_mgr->Count(vals.size()); diff --git a/src/Val.h b/src/Val.h index 71b4eee1b4..fc891aa7dc 100644 --- a/src/Val.h +++ b/src/Val.h @@ -661,8 +661,15 @@ private: class ListVal final : public Val { public: + // Constructor used to build up a homogeneous list of values; + // or, if 't' is TYPE_ANY, then a heterogeneous one whose type + // is built up as values are appended. explicit ListVal(TypeTag t); + // Constructor used to build the list in one shot, with the type + // pre-computed. + ListVal(TypeListPtr tl, std::vector vals); + ~ListVal() override = default; TypeTag BaseTag() const { return tag; }