From 2021b1d8d18b4335c42e62f3297f876209462ab1 Mon Sep 17 00:00:00 2001 From: regnat Date: Wed, 2 Jun 2021 16:56:21 +0200 Subject: [PATCH] [TMP] Try inlining the getAttrField function MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit See what’s making things slow --- src/libexpr/eval.cc | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc index 1b0815ab0..411494186 100644 --- a/src/libexpr/eval.cc +++ b/src/libexpr/eval.cc @@ -1154,7 +1154,34 @@ void ExprSelect::eval(EvalState & state, Env & env, Value & v) selector.push_back(getName(i, state, env)); try { - state.getAttrField(vTmp, selector, pos, v); + Pos * pos2 = 0; + + Value * vAttrs = &vTmp; + try { + for (auto & name : selector) { + nrLookups++; + Bindings::iterator j; + state.forceValue(*vAttrs, pos); + if (vAttrs->type() != nAttrs || + (j = vAttrs->attrs->find(name)) == vAttrs->attrs->end()) { + throw MissingField("attribute '%s' missing", name); + } + vAttrs = j->value; + pos2 = j->pos; + if (state.countCalls && pos2) state.attrSelects[*pos2]++; + } + + state.forceValue(*vAttrs, ( pos2 != NULL ? *pos2 : pos ) ); + + } catch (Error & e) { + if (pos2 && pos2->file != state.sDerivationNix) { + vector strSelector; + addErrorTrace(e, *pos2, "while evaluating the attribute '%1%'", concatStringsSep(".", selector)); + } + throw; + } + + v = *vAttrs; } catch (MissingField & field) { if (def) { def->eval(state, env, v);