From 71f026292ba1b401237a16ab6e0fb57c36c93df5 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Thu, 1 Apr 2010 09:55:57 +0000 Subject: * Make `derivation' lazy again for performance. It also turns out that there are some places in Nixpkgs (php_configurable / composableDerivation, it seems) that call `derivation' with incorrect arguments (namely, the `name' attribute missing) but get away with it because of laziness. --- src/libexpr/primops.cc | 36 ++++++++---------------------------- 1 file changed, 8 insertions(+), 28 deletions(-) (limited to 'src/libexpr/primops.cc') diff --git a/src/libexpr/primops.cc b/src/libexpr/primops.cc index 65b736787463..98a31dc3a565 100644 --- a/src/libexpr/primops.cc +++ b/src/libexpr/primops.cc @@ -448,34 +448,9 @@ static void prim_derivationStrict(EvalState & state, Value * * args, Value & v) state.drvHashes[drvPath] = hashDerivationModulo(state, drv); /* !!! assumes a single output */ - //state.mkAttrs(v); - state.cloneAttrs(*args[0], v); + state.mkAttrs(v); mkString((*v.attrs)[toATerm("outPath")], outPath, singleton(drvPath)); mkString((*v.attrs)[toATerm("drvPath")], drvPath, singleton("=" + drvPath)); - mkString((*v.attrs)[toATerm("type")], "derivation"); // !!! remove -} - - -static void prim_derivationLazy(EvalState & state, Value * * args, Value & v) -{ - state.forceAttrs(*args[0]); - - state.cloneAttrs(*args[0], v); - - mkString((*v.attrs)[toATerm("type")], "derivation"); - - /* !!! */ - -#if 0 - Expr drvStrict = makeCall(makeVar(toATerm("derivation!")), eAttrs); - - attrs.set(toATerm("outPath"), - makeAttrRHS(makeSelect(drvStrict, toATerm("outPath")), makeNoPos())); - attrs.set(toATerm("drvPath"), - makeAttrRHS(makeSelect(drvStrict, toATerm("drvPath")), makeNoPos())); - - return makeAttrs(attrs); -#endif } @@ -1039,6 +1014,12 @@ void EvalState::createBaseEnv() mkString(v, thisSystem.c_str()); addConstant("__currentSystem", v); + /* Add a wrapper around the derivation primop that computes the + `drvPath' and `outPath' attributes lazily. */ + string s = "attrs: let res = derivationStrict attrs; in attrs // { drvPath = res.drvPath; outPath = res.outPath; type = \"derivation\"; }"; + mkThunk(v, baseEnv, parseExprFromString(*this, s, "/")); + addConstant("derivation", v); + // Miscellaneous addPrimOp("import", 1, prim_import); addPrimOp("isNull", 1, prim_isNull); @@ -1059,8 +1040,7 @@ void EvalState::createBaseEnv() addPrimOp("__trace", 2, prim_trace); // Derivations - addPrimOp("derivation", 1, prim_derivationStrict); - //addPrimOp("derivation", 1, prim_derivationLazy); + addPrimOp("derivationStrict", 1, prim_derivationStrict); // Paths addPrimOp("__toPath", 1, prim_toPath); -- cgit 1.4.1