aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTuomas Tynkkynen <tuomas@tuxera.com>2017-03-04 15:24:06 +0200
committerTuomas Tynkkynen <tuomas@tuxera.com>2018-02-17 16:54:21 +0200
commit7e0360504d1a964ad5bd0da996045bc3868d0d7d (patch)
treec86de80ed19930296fc11ec09ae341965f31bcd7
parent0845cdf9443a6b304c1bcec304a462ae4995c744 (diff)
libexpr: Optimize prim_derivationStrict by using more symbol comparisons
-rw-r--r--src/libexpr/eval.cc4
-rw-r--r--src/libexpr/eval.hh3
-rw-r--r--src/libexpr/primops.cc18
3 files changed, 15 insertions, 10 deletions
diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc
index 48542d8e5..2144d3452 100644
--- a/src/libexpr/eval.cc
+++ b/src/libexpr/eval.cc
@@ -294,6 +294,10 @@ EvalState::EvalState(const Strings & _searchPath, ref<Store> store)
, sWrong(symbols.create("wrong"))
, sStructuredAttrs(symbols.create("__structuredAttrs"))
, sBuilder(symbols.create("builder"))
+ , sArgs(symbols.create("args"))
+ , sOutputHash(symbols.create("outputHash"))
+ , sOutputHashAlgo(symbols.create("outputHashAlgo"))
+ , sOutputHashMode(symbols.create("outputHashMode"))
, repair(NoRepair)
, store(store)
, baseEnv(allocEnv(128))
diff --git a/src/libexpr/eval.hh b/src/libexpr/eval.hh
index 51905d7e1..9d8799b79 100644
--- a/src/libexpr/eval.hh
+++ b/src/libexpr/eval.hh
@@ -69,7 +69,8 @@ public:
const Symbol sWith, sOutPath, sDrvPath, sType, sMeta, sName, sValue,
sSystem, sOverrides, sOutputs, sOutputName, sIgnoreNulls,
sFile, sLine, sColumn, sFunctor, sToString,
- sRight, sWrong, sStructuredAttrs, sBuilder;
+ sRight, sWrong, sStructuredAttrs, sBuilder, sArgs,
+ sOutputHash, sOutputHashAlgo, sOutputHashMode;
Symbol sDerivationNix;
/* If set, force copying files to the Nix store even if they
diff --git a/src/libexpr/primops.cc b/src/libexpr/primops.cc
index 89e984d2e..317623b22 100644
--- a/src/libexpr/primops.cc
+++ b/src/libexpr/primops.cc
@@ -589,7 +589,7 @@ static void prim_derivationStrict(EvalState & state, const Pos & pos, Value * *
/* The `args' attribute is special: it supplies the
command-line arguments to the builder. */
- if (key == "args") {
+ if (i->name == state.sArgs) {
state.forceList(*i->value, pos);
for (unsigned int n = 0; n < i->value->listSize(); ++n) {
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);
else if (i->name == state.sName)
drvName = state.forceStringNoCtx(*i->value, posDrvName);
- else if (key == "outputHash")
+ else if (i->name == state.sOutputHash)
outputHash = state.forceStringNoCtx(*i->value, posDrvName);
- else if (key == "outputHashAlgo")
+ else if (i->name == state.sOutputHashAlgo)
outputHashAlgo = state.forceStringNoCtx(*i->value, posDrvName);
- else if (key == "outputHashMode")
+ else if (i->name == state.sOutputHashMode)
handleHashMode(state.forceStringNoCtx(*i->value, posDrvName));
- else if (key == "outputs") {
+ else if (i->name == state.sOutputs) {
/* Require ‘outputs’ to be a list of strings. */
state.forceList(*i->value, posDrvName);
Strings ss;
@@ -638,10 +638,10 @@ static void prim_derivationStrict(EvalState & state, const Pos & pos, Value * *
drvName = s;
printMsg(lvlVomit, format("derivation name is '%1%'") % drvName);
}
- else if (key == "outputHash") outputHash = s;
- else if (key == "outputHashAlgo") outputHashAlgo = s;
- else if (key == "outputHashMode") handleHashMode(s);
- else if (key == "outputs")
+ else if (i->name == state.sOutputHash) outputHash = s;
+ else if (i->name == state.sOutputHashAlgo) outputHashAlgo = s;
+ else if (i->name == state.sOutputHashMode) handleHashMode(s);
+ else if (i->name == state.sOutputs)
handleOutputs(tokenizeString<Strings>(s));
}