From 6d6200f37afe10e8da3b08582a926245538af5d6 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Mon, 2 Aug 2010 16:31:05 +0000 Subject: [PATCH] * Optimisation in the // operator: if one of the sets is empty, return the other set. --- src/libexpr/eval.cc | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc index eb1d8d432..96bda43a3 100644 --- a/src/libexpr/eval.cc +++ b/src/libexpr/eval.cc @@ -750,13 +750,15 @@ void ExprOpImpl::eval(EvalState & state, Env & env, Value & v) void ExprOpUpdate::eval(EvalState & state, Env & env, Value & v) { - Value v2; - state.evalAttrs(env, e1, v2); - - state.cloneAttrs(v2, v); - + Value v1, v2; + state.evalAttrs(env, e1, v1); state.evalAttrs(env, e2, v2); - + + if (v1.attrs->size() == 0) { v = v2; return; } + if (v2.attrs->size() == 0) { v = v1; return; } + + state.cloneAttrs(v1, v); + foreach (Bindings::iterator, i, *v2.attrs) { Attr & a = (*v.attrs)[i->first]; mkCopy(a.value, i->second.value);