* import': unwrap the context. Necessary to make import (x + y)'

work, where x is a store path.
This commit is contained in:
Eelco Dolstra 2006-10-10 15:07:23 +00:00
parent 7bada48b36
commit bd0c40e1e9

View file

@ -13,6 +13,16 @@
namespace nix { namespace nix {
static Expr unwrapContext(EvalState & state, Expr e, ATermList & context)
{
context = ATempty;
e = evalExpr(state, e);
if (matchContext(e, context, e))
e = evalExpr(state, e);
return e;
}
static Expr primBuiltins(EvalState & state, const ATermVector & args) static Expr primBuiltins(EvalState & state, const ATermVector & args)
{ {
/* Return an attribute set containing all primops. This allows /* Return an attribute set containing all primops. This allows
@ -43,8 +53,9 @@ static Expr primImport(EvalState & state, const ATermVector & args)
{ {
ATermList es; ATermList es;
Path path; Path path;
ATermList context; /* don't care the context */
Expr arg = evalExpr(state, args[0]), arg2;
Expr arg = unwrapContext(state, args[0], context), arg2;
if (matchPath(arg, arg2)) if (matchPath(arg, arg2))
path = aterm2String(arg2); path = aterm2String(arg2);
@ -67,7 +78,7 @@ static Expr primImport(EvalState & state, const ATermVector & args)
} }
} }
else throw TypeError("`import' requires a path or derivation as its argument"); else throw TypeError(format("argument of `import' is %1% while a path or derivation is required") % showType(arg));
return evalFile(state, path); return evalFile(state, path);
} }
@ -513,16 +524,6 @@ static Expr primToXML(EvalState & state, const ATermVector & args)
} }
static Expr unwrapContext(EvalState & state, Expr e, ATermList & context)
{
context = ATempty;
e = evalExpr(state, e);
if (matchContext(e, context, e))
e = evalExpr(state, e);
return e;
}
/* Store a string in the Nix store as a source file that can be used /* Store a string in the Nix store as a source file that can be used
as an input by derivations. */ as an input by derivations. */
static Expr primToFile(EvalState & state, const ATermVector & args) static Expr primToFile(EvalState & state, const ATermVector & args)