libexpr: Optimize prim_derivationStrict by using more symbol comparisons

This commit is contained in:
Tuomas Tynkkynen 2017-03-04 15:24:06 +02:00
parent 0845cdf944
commit 7e0360504d
3 changed files with 15 additions and 10 deletions

View file

@ -294,6 +294,10 @@ EvalState::EvalState(const Strings & _searchPath, ref<Store> store)
, sWrong(symbols.create("wrong")) , sWrong(symbols.create("wrong"))
, sStructuredAttrs(symbols.create("__structuredAttrs")) , sStructuredAttrs(symbols.create("__structuredAttrs"))
, sBuilder(symbols.create("builder")) , sBuilder(symbols.create("builder"))
, sArgs(symbols.create("args"))
, sOutputHash(symbols.create("outputHash"))
, sOutputHashAlgo(symbols.create("outputHashAlgo"))
, sOutputHashMode(symbols.create("outputHashMode"))
, repair(NoRepair) , repair(NoRepair)
, store(store) , store(store)
, baseEnv(allocEnv(128)) , baseEnv(allocEnv(128))

View file

@ -69,7 +69,8 @@ public:
const Symbol sWith, sOutPath, sDrvPath, sType, sMeta, sName, sValue, const Symbol sWith, sOutPath, sDrvPath, sType, sMeta, sName, sValue,
sSystem, sOverrides, sOutputs, sOutputName, sIgnoreNulls, sSystem, sOverrides, sOutputs, sOutputName, sIgnoreNulls,
sFile, sLine, sColumn, sFunctor, sToString, sFile, sLine, sColumn, sFunctor, sToString,
sRight, sWrong, sStructuredAttrs, sBuilder; sRight, sWrong, sStructuredAttrs, sBuilder, sArgs,
sOutputHash, sOutputHashAlgo, sOutputHashMode;
Symbol sDerivationNix; Symbol sDerivationNix;
/* If set, force copying files to the Nix store even if they /* If set, force copying files to the Nix store even if they

View file

@ -589,7 +589,7 @@ static void prim_derivationStrict(EvalState & state, const Pos & pos, Value * *
/* The `args' attribute is special: it supplies the /* The `args' attribute is special: it supplies the
command-line arguments to the builder. */ command-line arguments to the builder. */
if (key == "args") { if (i->name == state.sArgs) {
state.forceList(*i->value, pos); state.forceList(*i->value, pos);
for (unsigned int n = 0; n < i->value->listSize(); ++n) { for (unsigned int n = 0; n < i->value->listSize(); ++n) {
string s = state.coerceToString(posDrvName, *i->value->listElems()[n], context, true); string s = state.coerceToString(posDrvName, *i->value->listElems()[n], context, true);
@ -614,13 +614,13 @@ static void prim_derivationStrict(EvalState & state, const Pos & pos, Value * *
drv.platform = state.forceStringNoCtx(*i->value, posDrvName); drv.platform = state.forceStringNoCtx(*i->value, posDrvName);
else if (i->name == state.sName) else if (i->name == state.sName)
drvName = state.forceStringNoCtx(*i->value, posDrvName); drvName = state.forceStringNoCtx(*i->value, posDrvName);
else if (key == "outputHash") else if (i->name == state.sOutputHash)
outputHash = state.forceStringNoCtx(*i->value, posDrvName); outputHash = state.forceStringNoCtx(*i->value, posDrvName);
else if (key == "outputHashAlgo") else if (i->name == state.sOutputHashAlgo)
outputHashAlgo = state.forceStringNoCtx(*i->value, posDrvName); outputHashAlgo = state.forceStringNoCtx(*i->value, posDrvName);
else if (key == "outputHashMode") else if (i->name == state.sOutputHashMode)
handleHashMode(state.forceStringNoCtx(*i->value, posDrvName)); handleHashMode(state.forceStringNoCtx(*i->value, posDrvName));
else if (key == "outputs") { else if (i->name == state.sOutputs) {
/* Require outputs to be a list of strings. */ /* Require outputs to be a list of strings. */
state.forceList(*i->value, posDrvName); state.forceList(*i->value, posDrvName);
Strings ss; Strings ss;
@ -638,10 +638,10 @@ static void prim_derivationStrict(EvalState & state, const Pos & pos, Value * *
drvName = s; drvName = s;
printMsg(lvlVomit, format("derivation name is '%1%'") % drvName); printMsg(lvlVomit, format("derivation name is '%1%'") % drvName);
} }
else if (key == "outputHash") outputHash = s; else if (i->name == state.sOutputHash) outputHash = s;
else if (key == "outputHashAlgo") outputHashAlgo = s; else if (i->name == state.sOutputHashAlgo) outputHashAlgo = s;
else if (key == "outputHashMode") handleHashMode(s); else if (i->name == state.sOutputHashMode) handleHashMode(s);
else if (key == "outputs") else if (i->name == state.sOutputs)
handleOutputs(tokenizeString<Strings>(s)); handleOutputs(tokenizeString<Strings>(s));
} }