about summary refs log tree commit diff
path: root/src/libexpr
diff options
context:
space:
mode:
Diffstat (limited to 'src/libexpr')
-rw-r--r--src/libexpr/eval.cc14
-rw-r--r--src/libexpr/primops.cc14
2 files changed, 15 insertions, 13 deletions
diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc
index eb1d8d432c69..96bda43a322a 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);
diff --git a/src/libexpr/primops.cc b/src/libexpr/primops.cc
index 42c8586116aa..68f66acc74ed 100644
--- a/src/libexpr/primops.cc
+++ b/src/libexpr/primops.cc
@@ -788,13 +788,13 @@ static void prim_intersectAttrs(EvalState & state, Value * * args, Value & v)
     state.forceAttrs(*args[1]);
         
     state.mkAttrs(v);
-    
-    foreach (Bindings::iterator, i, *args[1]->attrs) {
-        Bindings::iterator j = args[0]->attrs->find(i->first);
-        if (j != args[0]->attrs->end()) {
-            Attr & a = (*v.attrs)[i->first];
-            mkCopy(a.value, i->second.value);
-            a.pos = i->second.pos;
+
+    foreach (Bindings::iterator, i, *args[0]->attrs) {
+        Bindings::iterator j = args[1]->attrs->find(i->first);
+        if (j != args[1]->attrs->end()) {
+            Attr & a = (*v.attrs)[j->first];
+            mkCopy(a.value, j->second.value);
+            a.pos = j->second.pos;
         }
     }
 }