about summary refs log tree commit diff
path: root/src/libexpr
diff options
context:
space:
mode:
authorEelco Dolstra <e.dolstra@tudelft.nl>2006-10-10T21·23+0000
committerEelco Dolstra <e.dolstra@tudelft.nl>2006-10-10T21·23+0000
commit0c4c5c2020383db9c2d39d7a3420195568d06312 (patch)
tree5a21b8fd92e06a6b2d2f8a56926c27a69d5337ed /src/libexpr
parentbd0c40e1e93d2239b44bd1f73c2587cd62e66e4d (diff)
* Quick hack to fix NIX-67: evaluation result differing if the Nix
  expression resides in the store.

Diffstat (limited to 'src/libexpr')
-rw-r--r--src/libexpr/eval.cc12
-rw-r--r--src/libexpr/primops.cc17
2 files changed, 16 insertions, 13 deletions
diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc
index fa843b5d3b15..2d54f1fc2325 100644
--- a/src/libexpr/eval.cc
+++ b/src/libexpr/eval.cc
@@ -244,9 +244,11 @@ string coerceToStringWithContext(EvalState & state,
     
     e = evalExpr(state, e);
 
+    bool isWrapped = false;
     ATermList es;
     ATerm e2;
     if (matchContext(e, es, e2)) {
+        isWrapped = true;
         e = e2;
         context = ATconcat(es, context);
     }
@@ -258,7 +260,7 @@ string coerceToStringWithContext(EvalState & state,
     if (matchPath(e, s)) {
         isPath = true;
         Path path = aterm2String(s);
-        if (isInStore(path)) {
+        if (isInStore(path) && !isWrapped) {
             context = ATinsert(context, makePath(toATerm(toStorePath(path))));
         }
         return path;
@@ -295,16 +297,18 @@ static ATerm concatStrings(EvalState & state, const ATermVector & args)
     std::ostringstream s;
     bool isPath = false;
 
+    /* Note that if the first argument in the concatenation is a path,
+       then the result is also a path. */
+
     for (ATermVector::const_iterator i = args.begin(); i != args.end(); ++i) {
         bool isPath2;
         s << coerceToStringWithContext(state, context, *i, isPath2);
         if (i == args.begin()) isPath = isPath2;
     }
 
-    Expr result = isPath
+    return wrapInContext(context, isPath
         ? makePath(toATerm(canonPath(s.str())))
-        : makeStr(toATerm(s.str()));
-    return wrapInContext(context, result);
+        : makeStr(toATerm(s.str())));
 }
 
 
diff --git a/src/libexpr/primops.cc b/src/libexpr/primops.cc
index 0b1ea7f39bf4..761677a706b6 100644
--- a/src/libexpr/primops.cc
+++ b/src/libexpr/primops.cc
@@ -159,8 +159,15 @@ void toString(EvalState & state, Expr e,
     else if (matchPath(e, s)) {
         Path path(canonPath(aterm2String(s)));
 
-        if (!isInStore(path)) {
+        if (isStorePath(path) || (isWrapped && isInStore(path))) {
+            result += path;
+            /* !!! smells hacky.  Check whether this is the Right
+               Thing To Do. */
+            if (!isWrapped)
+                context = ATinsert(context, makePath(toATerm(toStorePath(path))));
+        }
 
+        else {
             if (isDerivation(path))
                 throw EvalError(format("file names are not allowed to end in `%1%'")
                     % drvExtension);
@@ -178,14 +185,6 @@ void toString(EvalState & state, Expr e,
             result += dstPath;
             context = ATinsert(context, makePath(toATerm(dstPath)));
         }
-
-        else {
-            result += path;
-            /* !!! smells hacky.  Check whether this is the Right
-               Thing To Do. */
-            if (!isWrapped)
-                context = ATinsert(context, makePath(toATerm(toStorePath(path))));
-        }
     }
     
     else if (matchList(e, es)) {