From af762abadc65ad9b2847a1fda33b8720a8070fd8 Mon Sep 17 00:00:00 2001 From: Vincent Ambo Date: Sat, 23 May 2020 20:30:23 +0100 Subject: fix(3p/nix/libexpr): Ensure ExprOpUpdate merges into destination ... this fixes nixpkgs eval! --- third_party/nix/src/libexpr/eval.cc | 22 +++++----------------- 1 file changed, 5 insertions(+), 17 deletions(-) (limited to 'third_party') diff --git a/third_party/nix/src/libexpr/eval.cc b/third_party/nix/src/libexpr/eval.cc index 4cfcc043be60..60d3cd012df8 100644 --- a/third_party/nix/src/libexpr/eval.cc +++ b/third_party/nix/src/libexpr/eval.cc @@ -1223,7 +1223,7 @@ void ExprOpImpl::eval(EvalState& state, Env& env, Value& v) { mkBool(v, !state.evalBool(env, e1, pos) || state.evalBool(env, e2, pos)); } -void ExprOpUpdate::eval(EvalState& state, Env& env, Value& v) { +void ExprOpUpdate::eval(EvalState& state, Env& env, Value& dest) { Value v1; Value v2; state.evalAttrs(env, e1, v1); @@ -1231,23 +1231,11 @@ void ExprOpUpdate::eval(EvalState& state, Env& env, Value& v) { state.nrOpUpdates++; - if (v1.attrs->empty()) { - v = v2; - return; - } - if (v2.attrs->empty()) { - v = v1; - return; - } - - state.mkAttrs(v, /* capacity = */ 0); - - /* Merge the sets, preferring values from the second set. Make - sure to keep the resulting vector in sorted order. */ - v.attrs->merge(v1.attrs); - v.attrs->merge(v2.attrs); + state.mkAttrs(dest, /* capacity = */ 0); - state.nrOpUpdateValuesCopied += v.attrs->size(); + /* Merge the sets, preferring values from the second set. */ + dest.attrs->merge(*v1.attrs); + dest.attrs->merge(*v2.attrs); } void ExprOpConcatLists::eval(EvalState& state, Env& env, Value& v) { -- cgit 1.4.1