* Quick hack to fix NIX-67: evaluation result differing if the Nix

expression resides in the store.
This commit is contained in:
Eelco Dolstra 2006-10-10 21:23:35 +00:00
parent bd0c40e1e9
commit 0c4c5c2020
2 changed files with 16 additions and 13 deletions

View file

@ -244,9 +244,11 @@ string coerceToStringWithContext(EvalState & state,
e = evalExpr(state, e); e = evalExpr(state, e);
bool isWrapped = false;
ATermList es; ATermList es;
ATerm e2; ATerm e2;
if (matchContext(e, es, e2)) { if (matchContext(e, es, e2)) {
isWrapped = true;
e = e2; e = e2;
context = ATconcat(es, context); context = ATconcat(es, context);
} }
@ -258,7 +260,7 @@ string coerceToStringWithContext(EvalState & state,
if (matchPath(e, s)) { if (matchPath(e, s)) {
isPath = true; isPath = true;
Path path = aterm2String(s); Path path = aterm2String(s);
if (isInStore(path)) { if (isInStore(path) && !isWrapped) {
context = ATinsert(context, makePath(toATerm(toStorePath(path)))); context = ATinsert(context, makePath(toATerm(toStorePath(path))));
} }
return path; return path;
@ -295,16 +297,18 @@ static ATerm concatStrings(EvalState & state, const ATermVector & args)
std::ostringstream s; std::ostringstream s;
bool isPath = false; 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) { for (ATermVector::const_iterator i = args.begin(); i != args.end(); ++i) {
bool isPath2; bool isPath2;
s << coerceToStringWithContext(state, context, *i, isPath2); s << coerceToStringWithContext(state, context, *i, isPath2);
if (i == args.begin()) isPath = isPath2; if (i == args.begin()) isPath = isPath2;
} }
Expr result = isPath return wrapInContext(context, isPath
? makePath(toATerm(canonPath(s.str()))) ? makePath(toATerm(canonPath(s.str())))
: makeStr(toATerm(s.str())); : makeStr(toATerm(s.str())));
return wrapInContext(context, result);
} }

View file

@ -159,8 +159,15 @@ void toString(EvalState & state, Expr e,
else if (matchPath(e, s)) { else if (matchPath(e, s)) {
Path path(canonPath(aterm2String(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)) if (isDerivation(path))
throw EvalError(format("file names are not allowed to end in `%1%'") throw EvalError(format("file names are not allowed to end in `%1%'")
% drvExtension); % drvExtension);
@ -178,14 +185,6 @@ void toString(EvalState & state, Expr e,
result += dstPath; result += dstPath;
context = ATinsert(context, makePath(toATerm(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)) { else if (matchList(e, es)) {