From 2b4ef8dc1182992ce2b5ef1ea71d72dc0864c5cb Mon Sep 17 00:00:00 2001 From: eldritch horrors Date: Wed, 30 Apr 2025 21:07:51 +0200 Subject: [PATCH] libexpr: deduplicate set and let recursive env calculation Change-Id: Ia7f066e1c02f99f071d10e00020869fac9a13db7 --- lix/libexpr/nixexpr.cc | 55 +++++++++++++++--------------------------- lix/libexpr/nixexpr.hh | 1 + 2 files changed, 20 insertions(+), 36 deletions(-) diff --git a/lix/libexpr/nixexpr.cc b/lix/libexpr/nixexpr.cc index ad1cb3682..76d2e62a3 100644 --- a/lix/libexpr/nixexpr.cc +++ b/lix/libexpr/nixexpr.cc @@ -395,6 +395,16 @@ void ExprOpHasAttr::bindVars(Evaluator & es, const std::shared_ptrbindVars(es, env); } +std::shared_ptr ExprAttrs::buildRecursiveEnv(const std::shared_ptr & env) +{ + auto newEnv = std::make_shared(nullptr, env.get(), attrs.size()); + + Displacement displ = 0; + for (auto & i : attrs) + newEnv->vars.emplace_back(i.first, i.second.displ = displ++); + return newEnv; +} + std::shared_ptr ExprAttrs::bindInheritSources( Evaluator & es, const std::shared_ptr & env) { @@ -421,37 +431,17 @@ void ExprSet::bindVars(Evaluator & es, const std::shared_ptr & if (es.debug) es.debug->exprEnvs.insert(std::make_pair(this, env)); - if (recursive) { - auto newEnv = [&] () -> std::shared_ptr { - auto newEnv = std::make_shared(nullptr, env.get(), attrs.size()); + auto innerEnv = recursive ? buildRecursiveEnv(env) : env; + auto inheritFromEnv = bindInheritSources(es, innerEnv); - Displacement displ = 0; - for (auto & i : attrs) - newEnv->vars.emplace_back(i.first, i.second.displ = displ++); - return newEnv; - }(); + // No need to sort newEnv since attrs is in sorted order. - // No need to sort newEnv since attrs is in sorted order. + for (auto & i : attrs) + i.second.e->bindVars(es, i.second.chooseByKind(innerEnv, env, inheritFromEnv)); - auto inheritFromEnv = bindInheritSources(es, newEnv); - for (auto & i : attrs) - i.second.e->bindVars(es, i.second.chooseByKind(newEnv, env, inheritFromEnv)); - - for (auto & i : dynamicAttrs) { - i.nameExpr->bindVars(es, newEnv); - i.valueExpr->bindVars(es, newEnv); - } - } - else { - auto inheritFromEnv = bindInheritSources(es, env); - - for (auto & i : attrs) - i.second.e->bindVars(es, i.second.chooseByKind(env, env, inheritFromEnv)); - - for (auto & i : dynamicAttrs) { - i.nameExpr->bindVars(es, env); - i.valueExpr->bindVars(es, env); - } + for (auto & i : dynamicAttrs) { + i.nameExpr->bindVars(es, innerEnv); + i.valueExpr->bindVars(es, innerEnv); } } @@ -486,14 +476,7 @@ void ExprCall::bindVars(Evaluator & es, const std::shared_ptr & void ExprLet::bindVars(Evaluator & es, const std::shared_ptr & env) { - auto newEnv = [&] () -> std::shared_ptr { - auto newEnv = std::make_shared(nullptr, env.get(), attrs.size()); - - Displacement displ = 0; - for (auto & i : attrs) - newEnv->vars.emplace_back(i.first, i.second.displ = displ++); - return newEnv; - }(); + auto newEnv = buildRecursiveEnv(env); // No need to sort newEnv since attrs is in sorted order. diff --git a/lix/libexpr/nixexpr.hh b/lix/libexpr/nixexpr.hh index ecdce22d7..f40a1fc2c 100644 --- a/lix/libexpr/nixexpr.hh +++ b/lix/libexpr/nixexpr.hh @@ -236,6 +236,7 @@ struct ExprAttrs typedef std::vector DynamicAttrDefs; DynamicAttrDefs dynamicAttrs; + std::shared_ptr buildRecursiveEnv(const std::shared_ptr & env); std::shared_ptr bindInheritSources( Evaluator & es, const std::shared_ptr & env); Env * buildInheritFromEnv(EvalState & state, Env & up);