From 7af000ddffd6a48e433b096aca6ef6ca03b37306 Mon Sep 17 00:00:00 2001 From: eldritch horrors Date: Wed, 27 Nov 2024 02:09:08 +0100 Subject: [PATCH] libexpr: move symbols into own struct not all of these are even used by eval itself. notably sWith wasn't used at all, sEpsilon was only used by the eval cache one layer up, and other attributes are used in places even further away from eval itself. we can keep this commingling for now, but eventually we should clean it up too. Change-Id: I5684ac614361bf008e04472130c6c02082b4c2d7 --- lix/legacy/user-env.cc | 20 ++--- lix/libcmd/installable-flake.cc | 8 +- lix/libexpr/eval-cache.cc | 4 +- lix/libexpr/eval.cc | 120 +++++++++++++------------- lix/libexpr/eval.hh | 32 +++---- lix/libexpr/flake/flake.cc | 12 ++- lix/libexpr/get-drvs.cc | 22 ++--- lix/libexpr/parser/parser.cc | 2 +- lix/libexpr/primops.cc | 86 +++++++++--------- lix/libexpr/primops/context.cc | 10 +-- lix/libexpr/primops/fetchMercurial.cc | 2 +- lix/libexpr/primops/fetchTree.cc | 6 +- lix/libexpr/print.cc | 2 +- lix/libexpr/value-to-json.cc | 2 +- lix/libexpr/value-to-xml.cc | 4 +- lix/nix/app.cc | 8 +- lix/nix/bundle.cc | 6 +- lix/nix/flake.cc | 6 +- lix/nix/search.cc | 8 +- tests/unit/libexpr/value/print.cc | 6 +- 20 files changed, 183 insertions(+), 183 deletions(-) diff --git a/lix/legacy/user-env.cc b/lix/legacy/user-env.cc index 082a73811..cf918b9c5 100644 --- a/lix/legacy/user-env.cc +++ b/lix/legacy/user-env.cc @@ -47,22 +47,22 @@ bool createUserEnv(EvalState & state, DrvInfos & elems, auto attrs = state.buildBindings(7 + outputs.size()); - attrs.alloc(state.sType).mkString("derivation"); - attrs.alloc(state.sName).mkString(i.queryName()); + attrs.alloc(state.s.type).mkString("derivation"); + attrs.alloc(state.s.name).mkString(i.queryName()); auto system = i.querySystem(); if (!system.empty()) - attrs.alloc(state.sSystem).mkString(system); - attrs.alloc(state.sOutPath).mkString(state.store->printStorePath(i.queryOutPath())); + attrs.alloc(state.s.system).mkString(system); + attrs.alloc(state.s.outPath).mkString(state.store->printStorePath(i.queryOutPath())); if (drvPath) - attrs.alloc(state.sDrvPath).mkString(state.store->printStorePath(*drvPath)); + attrs.alloc(state.s.drvPath).mkString(state.store->printStorePath(*drvPath)); // Copy each output meant for installation. - auto & vOutputs = attrs.alloc(state.sOutputs); + auto & vOutputs = attrs.alloc(state.s.outputs); state.mkList(vOutputs, outputs.size()); for (const auto & [m, j] : enumerate(outputs)) { (vOutputs.listElems()[m] = state.allocValue())->mkString(j.first); auto outputAttrs = state.buildBindings(2); - outputAttrs.alloc(state.sOutPath).mkString(state.store->printStorePath(*j.second)); + outputAttrs.alloc(state.s.outPath).mkString(state.store->printStorePath(*j.second)); attrs.alloc(j.first).mkAttrs(outputAttrs); /* This is only necessary when installing store paths, e.g., @@ -81,7 +81,7 @@ bool createUserEnv(EvalState & state, DrvInfos & elems, meta.insert(state.symbols.create(j), v); } - attrs.alloc(state.sMeta).mkAttrs(meta); + attrs.alloc(state.s.meta).mkAttrs(meta); (manifest.listElems()[n++] = state.allocValue())->mkAttrs(attrs); @@ -117,9 +117,9 @@ bool createUserEnv(EvalState & state, DrvInfos & elems, debug("evaluating user environment builder"); state.forceValue(topLevel, topLevel.determinePos(noPos)); NixStringContext context; - Attr & aDrvPath(*topLevel.attrs->find(state.sDrvPath)); + Attr & aDrvPath(*topLevel.attrs->find(state.s.drvPath)); auto topLevelDrv = state.coerceToStorePath(aDrvPath.pos, *aDrvPath.value, context, ""); - Attr & aOutPath(*topLevel.attrs->find(state.sOutPath)); + Attr & aOutPath(*topLevel.attrs->find(state.s.outPath)); auto topLevelOut = state.coerceToStorePath(aOutPath.pos, *aOutPath.value, context, ""); /* Realise the resulting store expression. */ diff --git a/lix/libcmd/installable-flake.cc b/lix/libcmd/installable-flake.cc index 919245df4..8a6e2b274 100644 --- a/lix/libcmd/installable-flake.cc +++ b/lix/libcmd/installable-flake.cc @@ -118,8 +118,8 @@ DerivedPathsWithInfo InstallableFlake::toDerivedPaths() std::optional priority; - if (attr->maybeGetAttr(state->sOutputSpecified)) { - } else if (auto aMeta = attr->maybeGetAttr(state->sMeta)) { + if (attr->maybeGetAttr(state->s.outputSpecified)) { + } else if (auto aMeta = attr->maybeGetAttr(state->s.meta)) { if (auto aPriority = aMeta->maybeGetAttr("priority")) priority = aPriority->getInt().value; } @@ -130,12 +130,12 @@ DerivedPathsWithInfo InstallableFlake::toDerivedPaths() .outputs = std::visit(overloaded { [&](const ExtendedOutputsSpec::Default & d) -> OutputsSpec { std::set outputsToInstall; - if (auto aOutputSpecified = attr->maybeGetAttr(state->sOutputSpecified)) { + if (auto aOutputSpecified = attr->maybeGetAttr(state->s.outputSpecified)) { if (aOutputSpecified->getBool()) { if (auto aOutputName = attr->maybeGetAttr("outputName")) outputsToInstall = { aOutputName->getString() }; } - } else if (auto aMeta = attr->maybeGetAttr(state->sMeta)) { + } else if (auto aMeta = attr->maybeGetAttr(state->s.meta)) { if (auto aOutputsToInstall = aMeta->maybeGetAttr("outputsToInstall")) for (auto & s : aOutputsToInstall->getListOfStrings()) outputsToInstall.insert(s); diff --git a/lix/libexpr/eval-cache.cc b/lix/libexpr/eval-cache.cc index 9590baaf4..51deeacee 100644 --- a/lix/libexpr/eval-cache.cc +++ b/lix/libexpr/eval-cache.cc @@ -372,7 +372,7 @@ AttrCursor::AttrCursor( AttrKey AttrCursor::getKey() { if (!parent) - return {0, root->state.sEpsilon}; + return {0, root->state.s.epsilon}; if (!parent->first->cachedValue) { parent->first->cachedValue = root->db->getAttr(parent->first->getKey()); assert(parent->first->cachedValue); @@ -748,7 +748,7 @@ bool AttrCursor::isDerivation() StorePath AttrCursor::forceDerivation() { - auto aDrvPath = getAttr(root->state.sDrvPath); + auto aDrvPath = getAttr(root->state.s.drvPath); auto drvPath = root->state.store->parseStorePath(aDrvPath->getString()); if (!root->state.store->isValidPath(drvPath) && !settings.readOnlyMode) { /* The eval cache contains 'drvPath', but the actual path has diff --git a/lix/libexpr/eval.cc b/lix/libexpr/eval.cc index 360a492c8..cbeb48b86 100644 --- a/lix/libexpr/eval.cc +++ b/lix/libexpr/eval.cc @@ -196,53 +196,49 @@ void initLibExpr() libexprInitialised = true; } -EvalState::EvalState( - const SearchPath & _searchPath, - ref store, - std::shared_ptr buildStore) - : sWith(symbols.create("")) - , sOutPath(symbols.create("outPath")) - , sDrvPath(symbols.create("drvPath")) - , sType(symbols.create("type")) - , sMeta(symbols.create("meta")) - , sName(symbols.create("name")) - , sValue(symbols.create("value")) - , sSystem(symbols.create("system")) - , sOverrides(symbols.create("__overrides")) - , sOutputs(symbols.create("outputs")) - , sOutputName(symbols.create("outputName")) - , sIgnoreNulls(symbols.create("__ignoreNulls")) - , sFile(symbols.create("file")) - , sLine(symbols.create("line")) - , sColumn(symbols.create("column")) - , sFunctor(symbols.create("__functor")) - , sToString(symbols.create("__toString")) - , sRight(symbols.create("right")) - , sWrong(symbols.create("wrong")) - , sStructuredAttrs(symbols.create("__structuredAttrs")) - , sAllowedReferences(symbols.create("allowedReferences")) - , sAllowedRequisites(symbols.create("allowedRequisites")) - , sDisallowedReferences(symbols.create("disallowedReferences")) - , sDisallowedRequisites(symbols.create("disallowedRequisites")) - , sMaxSize(symbols.create("maxSize")) - , sMaxClosureSize(symbols.create("maxClosureSize")) - , sBuilder(symbols.create("builder")) - , sArgs(symbols.create("args")) - , sContentAddressed(symbols.create("__contentAddressed")) - , sImpure(symbols.create("__impure")) - , sOutputHash(symbols.create("outputHash")) - , sOutputHashAlgo(symbols.create("outputHashAlgo")) - , sOutputHashMode(symbols.create("outputHashMode")) - , sRecurseForDerivations(symbols.create("recurseForDerivations")) - , sDescription(symbols.create("description")) - , sSelf(symbols.create("self")) - , sEpsilon(symbols.create("")) - , sStartSet(symbols.create("startSet")) - , sOperator(symbols.create("operator")) - , sKey(symbols.create("key")) - , sPath(symbols.create("path")) - , sPrefix(symbols.create("prefix")) - , sOutputSpecified(symbols.create("outputSpecified")) +StaticSymbols::StaticSymbols(SymbolTable & symbols) + : outPath(symbols.create("outPath")) + , drvPath(symbols.create("drvPath")) + , type(symbols.create("type")) + , meta(symbols.create("meta")) + , name(symbols.create("name")) + , value(symbols.create("value")) + , system(symbols.create("system")) + , overrides(symbols.create("__overrides")) + , outputs(symbols.create("outputs")) + , outputName(symbols.create("outputName")) + , ignoreNulls(symbols.create("__ignoreNulls")) + , file(symbols.create("file")) + , line(symbols.create("line")) + , column(symbols.create("column")) + , functor(symbols.create("__functor")) + , toString(symbols.create("__toString")) + , right(symbols.create("right")) + , wrong(symbols.create("wrong")) + , structuredAttrs(symbols.create("__structuredAttrs")) + , allowedReferences(symbols.create("allowedReferences")) + , allowedRequisites(symbols.create("allowedRequisites")) + , disallowedReferences(symbols.create("disallowedReferences")) + , disallowedRequisites(symbols.create("disallowedRequisites")) + , maxSize(symbols.create("maxSize")) + , maxClosureSize(symbols.create("maxClosureSize")) + , builder(symbols.create("builder")) + , args(symbols.create("args")) + , contentAddressed(symbols.create("__contentAddressed")) + , impure(symbols.create("__impure")) + , outputHash(symbols.create("outputHash")) + , outputHashAlgo(symbols.create("outputHashAlgo")) + , outputHashMode(symbols.create("outputHashMode")) + , recurseForDerivations(symbols.create("recurseForDerivations")) + , description(symbols.create("description")) + , self(symbols.create("self")) + , epsilon(symbols.create("")) + , startSet(symbols.create("startSet")) + , operator_(symbols.create("operator")) + , key(symbols.create("key")) + , path(symbols.create("path")) + , prefix(symbols.create("prefix")) + , outputSpecified(symbols.create("outputSpecified")) , exprSymbols{ .sub = symbols.create("__sub"), .lessThan = symbols.create("__lessThan"), @@ -254,6 +250,14 @@ EvalState::EvalState( .body = symbols.create("body"), .overrides = symbols.create("__overrides"), } +{ +} + +EvalState::EvalState( + const SearchPath & _searchPath, + ref store, + std::shared_ptr buildStore) + : s(symbols) , repair(NoRepair) , derivationInternal(rootPath(CanonPath("/builtin/derivation.nix"))) , store(store) @@ -774,8 +778,8 @@ void EvalState::mkPos(Value & v, PosIdx p) auto origin = positions.originOf(p); if (auto path = std::get_if(&origin)) { auto attrs = buildBindings(3); - attrs.alloc(sFile).mkString(path->path.abs()); - makePositionThunks(*this, p, attrs.alloc(sLine), attrs.alloc(sColumn)); + attrs.alloc(s.file).mkString(path->path.abs()); + makePositionThunks(*this, p, attrs.alloc(s.line), attrs.alloc(s.column)); v.mkAttrs(attrs); } else v.mkNull(); @@ -1072,7 +1076,7 @@ void ExprAttrs::eval(EvalState & state, Env & env, Value & v) dynamicEnv = &env2; Env * inheritEnv = inheritFromExprs ? buildInheritFromEnv(state, env2) : nullptr; - AttrDefs::iterator overrides = attrs.find(state.sOverrides); + AttrDefs::iterator overrides = attrs.find(state.s.overrides); bool hasOverrides = overrides != attrs.end(); /* The recursive attributes are evaluated in the new @@ -1680,7 +1684,7 @@ void EvalState::callFunction(Value & fun, size_t nrArgs, Value * * args, Value & } } - else if (vCur.type() == nAttrs && (functor = vCur.attrs->get(sFunctor))) { + else if (vCur.type() == nAttrs && (functor = vCur.attrs->get(s.functor))) { /* 'vCur' may be allocated on the stack of the calling function, but for functors we may keep a reference, so heap-allocate a copy and use that instead. */ @@ -1755,7 +1759,7 @@ void EvalState::autoCallFunction(Bindings & args, Value & fun, Value & res) forceValue(fun, pos); if (fun.type() == nAttrs) { - auto found = fun.attrs->find(sFunctor); + auto found = fun.attrs->find(s.functor); if (found != fun.attrs->end()) { Value * v = allocValue(); callFunction(*found->value, fun, *v, pos); @@ -2168,7 +2172,7 @@ bool EvalState::forceBool(Value & v, const PosIdx pos, std::string_view errorCtx bool EvalState::isFunctor(Value & fun) { - return fun.type() == nAttrs && fun.attrs->find(sFunctor) != fun.attrs->end(); + return fun.type() == nAttrs && fun.attrs->find(s.functor) != fun.attrs->end(); } @@ -2236,7 +2240,7 @@ std::string_view EvalState::forceStringNoCtx(Value & v, const PosIdx pos, std::s bool EvalState::isDerivation(Value & v) { if (v.type() != nAttrs) return false; - Bindings::iterator i = v.attrs->find(sType); + Bindings::iterator i = v.attrs->find(s.type); if (i == v.attrs->end()) return false; forceValue(*i->value, i->pos); if (i->value->type() != nString) return false; @@ -2247,7 +2251,7 @@ bool EvalState::isDerivation(Value & v) std::optional EvalState::tryAttrsToString(const PosIdx pos, Value & v, NixStringContext & context, bool coerceMore, bool copyToStore) { - auto i = v.attrs->find(sToString); + auto i = v.attrs->find(s.toString); if (i != v.attrs->end()) { Value v1; callFunction(*i->value, v, v1, pos); @@ -2290,7 +2294,7 @@ BackedStringView EvalState::coerceToString( auto maybeString = tryAttrsToString(pos, v, context, coerceMore, copyToStore); if (maybeString) return std::move(*maybeString); - auto i = v.attrs->find(sOutPath); + auto i = v.attrs->find(s.outPath); if (i == v.attrs->end()) { error( "cannot coerce %1% to a string: %2%", @@ -2495,8 +2499,8 @@ bool EvalState::eqValues(Value & v1, Value & v2, const PosIdx pos, std::string_v /* If both sets denote a derivation (type = "derivation"), then compare their outPaths. */ if (isDerivation(v1) && isDerivation(v2)) { - Bindings::iterator i = v1.attrs->find(sOutPath); - Bindings::iterator j = v2.attrs->find(sOutPath); + Bindings::iterator i = v1.attrs->find(s.outPath); + Bindings::iterator j = v2.attrs->find(s.outPath); if (i != v1.attrs->end() && j != v2.attrs->end()) return eqValues(*i->value, *j->value, pos, errorCtx); } diff --git a/lix/libexpr/eval.hh b/lix/libexpr/eval.hh index fec3b8c88..3aa75312c 100644 --- a/lix/libexpr/eval.hh +++ b/lix/libexpr/eval.hh @@ -153,27 +153,27 @@ struct DebugTrace { }; +struct StaticSymbols +{ + const Symbol outPath, drvPath, type, meta, name, value, system, overrides, outputs, outputName, + ignoreNulls, file, line, column, functor, toString, right, wrong, structuredAttrs, + allowedReferences, allowedRequisites, disallowedReferences, disallowedRequisites, maxSize, + maxClosureSize, builder, args, contentAddressed, impure, outputHash, outputHashAlgo, + outputHashMode, recurseForDerivations, description, self, epsilon, startSet, operator_, key, + path, prefix, outputSpecified; + + const Expr::AstSymbols exprSymbols; + + explicit StaticSymbols(SymbolTable & symbols); +}; + + class EvalState { public: SymbolTable symbols; PosTable positions; - - const Symbol sWith, sOutPath, sDrvPath, sType, sMeta, sName, sValue, - sSystem, sOverrides, sOutputs, sOutputName, sIgnoreNulls, - sFile, sLine, sColumn, sFunctor, sToString, - sRight, sWrong, sStructuredAttrs, - sAllowedReferences, sAllowedRequisites, sDisallowedReferences, sDisallowedRequisites, - sMaxSize, sMaxClosureSize, - sBuilder, sArgs, - sContentAddressed, sImpure, - sOutputHash, sOutputHashAlgo, sOutputHashMode, - sRecurseForDerivations, - sDescription, sSelf, sEpsilon, sStartSet, sOperator, sKey, sPath, - sPrefix, - sOutputSpecified; - - const Expr::AstSymbols exprSymbols; + const StaticSymbols s; /** * If set, force copying files to the Nix store even if they diff --git a/lix/libexpr/flake/flake.cc b/lix/libexpr/flake/flake.cc index 4f0c4caed..b9b6139b3 100644 --- a/lix/libexpr/flake/flake.cc +++ b/lix/libexpr/flake/flake.cc @@ -245,7 +245,7 @@ static Flake getFlake( Value vInfo; state.evalFile(CanonPath(flakeFile), vInfo, true); // FIXME: symlink attack - if (auto description = vInfo.attrs->get(state.sDescription)) { + if (auto description = vInfo.attrs->get(state.s.description)) { expectType(state, nString, *description->value, description->pos); flake.description = description->value->string.s; } @@ -255,14 +255,12 @@ static Flake getFlake( if (auto inputs = vInfo.attrs->get(sInputs)) flake.inputs = parseFlakeInputs(state, inputs->value, inputs->pos, flakeDir, lockRootPath, 0); - auto sOutputs = state.symbols.create("outputs"); - - if (auto outputs = vInfo.attrs->get(sOutputs)) { + if (auto outputs = vInfo.attrs->get(state.s.outputs)) { expectType(state, nFunction, *outputs->value, outputs->pos); if (outputs->value->isLambda() && outputs->value->lambda.fun->hasFormals()) { for (auto & formal : outputs->value->lambda.fun->formals->formals) { - if (formal.name != state.sSelf) + if (formal.name != state.s.self) flake.inputs.emplace(state.symbols[formal.name], FlakeInput { .ref = parseFlakeRef(state.symbols[formal.name]) }); @@ -314,9 +312,9 @@ static Flake getFlake( } for (auto & attr : *vInfo.attrs) { - if (attr.name != state.sDescription && + if (attr.name != state.s.description && attr.name != sInputs && - attr.name != sOutputs && + attr.name != state.s.outputs && attr.name != sNixConfig) throw Error("flake '%s' has an unsupported attribute '%s', at %s", lockedRef, state.symbols[attr.name], state.positions[attr.pos]); diff --git a/lix/libexpr/get-drvs.cc b/lix/libexpr/get-drvs.cc index 087eabc75..91ae4cfc6 100644 --- a/lix/libexpr/get-drvs.cc +++ b/lix/libexpr/get-drvs.cc @@ -49,7 +49,7 @@ DrvInfo::DrvInfo(EvalState & state, ref store, const std::string & drvPat std::string DrvInfo::queryName() { if (name == "" && attrs) { - auto i = attrs->find(state->sName); + auto i = attrs->find(state->s.name); if (i == attrs->end()) state->error("derivation name missing").debugThrow(); name = state->forceStringNoCtx(*i->value, noPos, "while evaluating the 'name' attribute of a derivation"); } @@ -60,7 +60,7 @@ std::string DrvInfo::queryName() std::string DrvInfo::querySystem() { if (system == "" && attrs) { - auto i = attrs->find(state->sSystem); + auto i = attrs->find(state->s.system); system = i == attrs->end() ? "unknown" : state->forceStringNoCtx(*i->value, i->pos, "while evaluating the 'system' attribute of a derivation"); } return system; @@ -70,7 +70,7 @@ std::string DrvInfo::querySystem() std::optional DrvInfo::queryDrvPath() { if (!drvPath && attrs) { - Bindings::iterator i = attrs->find(state->sDrvPath); + Bindings::iterator i = attrs->find(state->s.drvPath); NixStringContext context; if (i == attrs->end()) drvPath = {std::nullopt}; @@ -92,7 +92,7 @@ StorePath DrvInfo::requireDrvPath() StorePath DrvInfo::queryOutPath() { if (!outPath && attrs) { - Bindings::iterator i = attrs->find(state->sOutPath); + Bindings::iterator i = attrs->find(state->s.outPath); NixStringContext context; if (i != attrs->end()) outPath = state->coerceToStorePath(i->pos, *i->value, context, "while evaluating the output path of a derivation"); @@ -118,7 +118,7 @@ void DrvInfo::fillOutputs(bool withPaths) return; } - Attr * outputs = this->attrs->get(this->state->sOutputs); + Attr * outputs = this->attrs->get(this->state->s.outputs); if (outputs == nullptr) { fillDefault(); return; @@ -157,7 +157,7 @@ void DrvInfo::fillOutputs(bool withPaths) state->forceAttrs(*out->value, outputs->pos, errMsg); // ...and evaluate its `outPath` attribute. - Attr * outPath = out->value->attrs->get(this->state->sOutPath); + Attr * outPath = out->value->attrs->get(this->state->s.outPath); if (outPath == nullptr) { continue; // FIXME: throw error? @@ -201,7 +201,7 @@ DrvInfo::Outputs DrvInfo::queryOutputs(bool withPaths, bool onlyOutputsToInstall // output by its attribute, e.g. `pkgs.lix.dev`, which (lol?) sets the magic // attribute `outputSpecified = true`, and changes the `outputName` attr to the // explicitly selected-into output. - if (Attr * outSpecAttr = attrs->get(state->sOutputSpecified)) { + if (Attr * outSpecAttr = attrs->get(state->s.outputSpecified)) { bool outputSpecified = this->state->forceBool( *outSpecAttr->value, outSpecAttr->pos, @@ -236,7 +236,7 @@ DrvInfo::Outputs DrvInfo::queryOutputs(bool withPaths, bool onlyOutputsToInstall std::string DrvInfo::queryOutputName() { if (outputName == "" && attrs) { - Bindings::iterator i = attrs->find(state->sOutputName); + Bindings::iterator i = attrs->find(state->s.outputName); outputName = i != attrs->end() ? state->forceStringNoCtx(*i->value, noPos, "while evaluating the output name of a derivation") : ""; } return outputName; @@ -247,7 +247,7 @@ Bindings * DrvInfo::getMeta() { if (meta) return meta; if (!attrs) return 0; - Bindings::iterator a = attrs->find(state->sMeta); + Bindings::iterator a = attrs->find(state->s.meta); if (a == attrs->end()) return 0; state->forceAttrs(*a->value, a->pos, "while evaluating the 'meta' attribute of a derivation"); meta = a->value->attrs; @@ -274,7 +274,7 @@ bool DrvInfo::checkMeta(Value & v) return true; } else if (v.type() == nAttrs) { - Bindings::iterator i = v.attrs->find(state->sOutPath); + Bindings::iterator i = v.attrs->find(state->s.outPath); if (i != v.attrs->end()) return false; for (auto & i : *v.attrs) if (!checkMeta(*i.value)) return false; @@ -483,7 +483,7 @@ static void getDerivations(EvalState & state, Value & vIn, should we recurse into it? => Only if it has a `recurseForDerivations = true' attribute. */ if (attr->value->type() == nAttrs) { - Attr * recurseForDrvs = attr->value->attrs->get(state.sRecurseForDerivations); + Attr * recurseForDrvs = attr->value->attrs->get(state.s.recurseForDerivations); if (recurseForDrvs == nullptr) { continue; } diff --git a/lix/libexpr/parser/parser.cc b/lix/libexpr/parser/parser.cc index 9094a85e9..a01938e77 100644 --- a/lix/libexpr/parser/parser.cc +++ b/lix/libexpr/parser/parser.cc @@ -35,7 +35,7 @@ Expr * EvalState::parse( positions, basePath, positions.addOrigin(origin, length), - exprSymbols, + this->s.exprSymbols, featureSettings, }; diff --git a/lix/libexpr/primops.cc b/lix/libexpr/primops.cc index b59141e46..bd09a7215 100644 --- a/lix/libexpr/primops.cc +++ b/lix/libexpr/primops.cc @@ -191,11 +191,11 @@ static void import(EvalState & state, const PosIdx pos, Value & vPath, Value * v if (auto storePath = isValidDerivationInStore()) { Derivation drv = state.store->readDerivation(*storePath); auto attrs = state.buildBindings(3 + drv.outputs.size()); - attrs.alloc(state.sDrvPath).mkString(path2, { + attrs.alloc(state.s.drvPath).mkString(path2, { NixStringContextElem::DrvDeep { .drvPath = *storePath }, }); - attrs.alloc(state.sName).mkString(drv.env["name"]); - auto & outputsVal = attrs.alloc(state.sOutputs); + attrs.alloc(state.s.name).mkString(drv.env["name"]); + auto & outputsVal = attrs.alloc(state.s.outputs); state.mkList(outputsVal, drv.outputs.size()); for (const auto & [i, o] : enumerate(drv.outputs)) { @@ -507,7 +507,7 @@ static void prim_genericClosure(EvalState & state, const PosIdx pos, Value * * a state.forceAttrs(*args[0], noPos, "while evaluating the first argument passed to builtins.genericClosure"); /* Get the start set. */ - Bindings::iterator startSet = getAttr(state, state.sStartSet, args[0]->attrs, "in the attrset passed as argument to builtins.genericClosure"); + Bindings::iterator startSet = getAttr(state, state.s.startSet, args[0]->attrs, "in the attrset passed as argument to builtins.genericClosure"); state.forceList(*startSet->value, noPos, "while evaluating the 'startSet' attribute passed as argument to builtins.genericClosure"); @@ -521,7 +521,7 @@ static void prim_genericClosure(EvalState & state, const PosIdx pos, Value * * a } /* Get the operator. */ - Bindings::iterator op = getAttr(state, state.sOperator, args[0]->attrs, "in the attrset passed as argument to builtins.genericClosure"); + Bindings::iterator op = getAttr(state, state.s.operator_, args[0]->attrs, "in the attrset passed as argument to builtins.genericClosure"); state.forceFunction(*op->value, noPos, "while evaluating the 'operator' attribute passed as argument to builtins.genericClosure"); /* Construct the closure by applying the operator to elements of @@ -538,7 +538,7 @@ static void prim_genericClosure(EvalState & state, const PosIdx pos, Value * * a state.forceAttrs(*e, noPos, "while evaluating one of the elements generated by (or initially passed to) builtins.genericClosure"); - Bindings::iterator key = getAttr(state, state.sKey, e->attrs, "in one of the attrsets generated by (or initially passed to) builtins.genericClosure"); + Bindings::iterator key = getAttr(state, state.s.key, e->attrs, "in one of the attrsets generated by (or initially passed to) builtins.genericClosure"); state.forceValue(*key->value, noPos); if (!doneKeys.insert(key->value).second) continue; @@ -650,10 +650,10 @@ static void prim_tryEval(EvalState & state, const PosIdx pos, Value * * args, Va try { state.forceValue(*args[0], pos); - attrs.insert(state.sValue, args[0]); + attrs.insert(state.s.value, args[0]); attrs.alloc("success").mkBool(true); } catch (AssertionError & e) { - attrs.alloc(state.sValue).mkBool(false); + attrs.alloc(state.s.value).mkBool(false); attrs.alloc("success").mkBool(false); } @@ -735,7 +735,7 @@ static void prim_derivationStrict(EvalState & state, const PosIdx pos, Value * * Bindings * attrs = args[0]->attrs; /* Figure out the name first (for stack backtraces). */ - Bindings::iterator nameAttr = getAttr(state, state.sName, attrs, "in the attrset passed as argument to builtins.derivationStrict"); + Bindings::iterator nameAttr = getAttr(state, state.s.name, attrs, "in the attrset passed as argument to builtins.derivationStrict"); std::string drvName; try { @@ -781,7 +781,7 @@ drvName, Bindings * attrs, Value & v) using nlohmann::json; std::optional jsonObject; auto pos = v.determinePos(noPos); - auto attr = attrs->find(state.sStructuredAttrs); + auto attr = attrs->find(state.s.structuredAttrs); if (attr != attrs->end() && state.forceBool(*attr->value, pos, "while evaluating the `__structuredAttrs` " @@ -790,7 +790,7 @@ drvName, Bindings * attrs, Value & v) /* Check whether null attributes should be ignored. */ bool ignoreNulls = false; - attr = attrs->find(state.sIgnoreNulls); + attr = attrs->find(state.s.ignoreNulls); if (attr != attrs->end()) ignoreNulls = state.forceBool(*attr->value, pos, "while evaluating the `__ignoreNulls` attribute " "passed to builtins.derivationStrict"); @@ -810,7 +810,7 @@ drvName, Bindings * attrs, Value & v) outputs.insert("out"); for (auto & i : attrs->lexicographicOrder(state.symbols)) { - if (i->name == state.sIgnoreNulls) continue; + if (i->name == state.s.ignoreNulls) continue; const std::string & key = state.symbols[i->name]; vomit("processing attribute '%1%'", key); @@ -860,19 +860,19 @@ drvName, Bindings * attrs, Value & v) if (i->value->type() == nNull) continue; } - if (i->name == state.sContentAddressed && state.forceBool(*i->value, pos, context_below)) { + if (i->name == state.s.contentAddressed && state.forceBool(*i->value, pos, context_below)) { contentAddressed = true; experimentalFeatureSettings.require(Xp::CaDerivations); } - else if (i->name == state.sImpure && state.forceBool(*i->value, pos, context_below)) { + else if (i->name == state.s.impure && state.forceBool(*i->value, pos, context_below)) { isImpure = true; experimentalFeatureSettings.require(Xp::ImpureDerivations); } /* The `args' attribute is special: it supplies the command-line arguments to the builder. */ - else if (i->name == state.sArgs) { + else if (i->name == state.s.args) { state.forceList(*i->value, pos, context_below); for (auto elem : i->value->listItems()) { auto s = state.coerceToString(pos, *elem, context, @@ -888,21 +888,21 @@ drvName, Bindings * attrs, Value & v) if (jsonObject) { - if (i->name == state.sStructuredAttrs) continue; + if (i->name == state.s.structuredAttrs) continue; (*jsonObject)[key] = printValueAsJSON(state, true, *i->value, pos, context); - if (i->name == state.sBuilder) + if (i->name == state.s.builder) drv.builder = state.forceString(*i->value, context, pos, context_below); - else if (i->name == state.sSystem) + else if (i->name == state.s.system) drv.platform = state.forceStringNoCtx(*i->value, pos, context_below); - else if (i->name == state.sOutputHash) + else if (i->name == state.s.outputHash) outputHash = state.forceStringNoCtx(*i->value, pos, context_below); - else if (i->name == state.sOutputHashAlgo) + else if (i->name == state.s.outputHashAlgo) outputHashAlgo = state.forceStringNoCtx(*i->value, pos, context_below); - else if (i->name == state.sOutputHashMode) + else if (i->name == state.s.outputHashMode) handleHashMode(state.forceStringNoCtx(*i->value, pos, context_below)); - else if (i->name == state.sOutputs) { + else if (i->name == state.s.outputs) { /* Require ‘outputs’ to be a list of strings. */ state.forceList(*i->value, pos, context_below); Strings ss; @@ -911,29 +911,29 @@ drvName, Bindings * attrs, Value & v) handleOutputs(ss); } - if (i->name == state.sAllowedReferences) + if (i->name == state.s.allowedReferences) warn("In a derivation named '%s', 'structuredAttrs' disables the effect of the derivation attribute 'allowedReferences'; use 'outputChecks..allowedReferences' instead", drvName); - if (i->name == state.sAllowedRequisites) + if (i->name == state.s.allowedRequisites) warn("In a derivation named '%s', 'structuredAttrs' disables the effect of the derivation attribute 'allowedRequisites'; use 'outputChecks..allowedRequisites' instead", drvName); - if (i->name == state.sDisallowedReferences) + if (i->name == state.s.disallowedReferences) warn("In a derivation named '%s', 'structuredAttrs' disables the effect of the derivation attribute 'disallowedReferences'; use 'outputChecks..disallowedReferences' instead", drvName); - if (i->name == state.sDisallowedRequisites) + if (i->name == state.s.disallowedRequisites) warn("In a derivation named '%s', 'structuredAttrs' disables the effect of the derivation attribute 'disallowedRequisites'; use 'outputChecks..disallowedRequisites' instead", drvName); - if (i->name == state.sMaxSize) + if (i->name == state.s.maxSize) warn("In a derivation named '%s', 'structuredAttrs' disables the effect of the derivation attribute 'maxSize'; use 'outputChecks..maxSize' instead", drvName); - if (i->name == state.sMaxClosureSize) + if (i->name == state.s.maxClosureSize) warn("In a derivation named '%s', 'structuredAttrs' disables the effect of the derivation attribute 'maxClosureSize'; use 'outputChecks..maxClosureSize' instead", drvName); } else { auto s = state.coerceToString(pos, *i->value, context, context_below, true).toOwned(); drv.env.emplace(key, s); - if (i->name == state.sBuilder) drv.builder = std::move(s); - else if (i->name == state.sSystem) drv.platform = std::move(s); - else if (i->name == state.sOutputHash) outputHash = std::move(s); - else if (i->name == state.sOutputHashAlgo) outputHashAlgo = std::move(s); - else if (i->name == state.sOutputHashMode) handleHashMode(s); - else if (i->name == state.sOutputs) + if (i->name == state.s.builder) drv.builder = std::move(s); + else if (i->name == state.s.system) drv.platform = std::move(s); + else if (i->name == state.s.outputHash) outputHash = std::move(s); + else if (i->name == state.s.outputHashAlgo) outputHashAlgo = std::move(s); + else if (i->name == state.s.outputHashMode) handleHashMode(s); + else if (i->name == state.s.outputs) handleOutputs(tokenizeString(s)); } @@ -1109,7 +1109,7 @@ drvName, Bindings * attrs, Value & v) } auto result = state.buildBindings(1 + drv.outputs.size()); - result.alloc(state.sDrvPath).mkString(drvPathS, { + result.alloc(state.s.drvPath).mkString(drvPathS, { NixStringContextElem::DrvDeep { .drvPath = drvPath }, }); for (auto & i : drv.outputs) @@ -1287,11 +1287,11 @@ static void prim_findFile(EvalState & state, const PosIdx pos, Value * * args, V state.forceAttrs(*v2, pos, "while evaluating an element of the list passed to builtins.findFile"); std::string prefix; - Bindings::iterator i = v2->attrs->find(state.sPrefix); + Bindings::iterator i = v2->attrs->find(state.s.prefix); if (i != v2->attrs->end()) prefix = state.forceStringNoCtx(*i->value, pos, "while evaluating the `prefix` attribute of an element of the list passed to builtins.findFile"); - i = getAttr(state, state.sPath, v2->attrs, "in an element of the __nixPath"); + i = getAttr(state, state.s.path, v2->attrs, "in an element of the __nixPath"); NixStringContext context; auto path = state.coerceToString(pos, *i->value, context, @@ -1580,7 +1580,7 @@ static void prim_path(EvalState & state, const PosIdx pos, Value * * args, Value auto n = state.symbols[attr.name]; if (n == "path") path.emplace(state.coerceToPath(attr.pos, *attr.value, context, "while evaluating the 'path' attribute passed to 'builtins.path'")); - else if (attr.name == state.sName) + else if (attr.name == state.s.name) name = state.forceStringNoCtx(*attr.value, attr.pos, "while evaluating the `name` attribute passed to builtins.path"); else if (n == "filter") state.forceFunction(*(filterFun = attr.value), attr.pos, "while evaluating the `filter` parameter passed to builtins.path"); @@ -1794,13 +1794,13 @@ static void prim_listToAttrs(EvalState & state, const PosIdx pos, Value * * args for (auto v2 : args[0]->listItems()) { state.forceAttrs(*v2, pos, "while evaluating an element of the list passed to builtins.listToAttrs"); - Bindings::iterator j = getAttr(state, state.sName, v2->attrs, "in a {name=...; value=...;} pair"); + Bindings::iterator j = getAttr(state, state.s.name, v2->attrs, "in a {name=...; value=...;} pair"); auto name = state.forceStringNoCtx(*j->value, j->pos, "while evaluating the `name` attribute of an element of the list passed to builtins.listToAttrs"); auto sym = state.symbols.create(name); if (seen.insert(sym).second) { - Bindings::iterator j2 = getAttr(state, state.sValue, v2->attrs, "in a {name=...; value=...;} pair"); + Bindings::iterator j2 = getAttr(state, state.s.value, v2->attrs, "in a {name=...; value=...;} pair"); attrs.insert(sym, j2->value, j2->pos); } } @@ -2256,13 +2256,13 @@ static void prim_partition(EvalState & state, const PosIdx pos, Value * * args, auto attrs = state.buildBindings(2); - auto & vRight = attrs.alloc(state.sRight); + auto & vRight = attrs.alloc(state.s.right); auto rsize = right.size(); state.mkList(vRight, rsize); if (rsize) memcpy(vRight.listElems(), right.data(), sizeof(Value *) * rsize); - auto & vWrong = attrs.alloc(state.sWrong); + auto & vWrong = attrs.alloc(state.s.wrong); auto wsize = wrong.size(); state.mkList(vWrong, wsize); if (wsize) @@ -2740,7 +2740,7 @@ static void prim_parseDrvName(EvalState & state, const PosIdx pos, Value * * arg auto name = state.forceStringNoCtx(*args[0], pos, "while evaluating the first argument passed to builtins.parseDrvName"); DrvName parsed(name); auto attrs = state.buildBindings(2); - attrs.alloc(state.sName).mkString(parsed.name); + attrs.alloc(state.s.name).mkString(parsed.name); attrs.alloc("version").mkString(parsed.version); v.mkAttrs(attrs); } diff --git a/lix/libexpr/primops/context.cc b/lix/libexpr/primops/context.cc index b5ed5c4a1..c4a33b4f6 100644 --- a/lix/libexpr/primops/context.cc +++ b/lix/libexpr/primops/context.cc @@ -140,16 +140,15 @@ void prim_getContext(EvalState & state, const PosIdx pos, Value * * args, Value auto attrs = state.buildBindings(contextInfos.size()); - auto sPath = state.symbols.create("path"); auto sAllOutputs = state.symbols.create("allOutputs"); for (const auto & info : contextInfos) { auto infoAttrs = state.buildBindings(3); if (info.second.path) - infoAttrs.alloc(sPath).mkBool(true); + infoAttrs.alloc(state.s.path).mkBool(true); if (info.second.allOutputs) infoAttrs.alloc(sAllOutputs).mkBool(true); if (!info.second.outputs.empty()) { - auto & outputsVal = infoAttrs.alloc(state.sOutputs); + auto & outputsVal = infoAttrs.alloc(state.s.outputs); state.mkList(outputsVal, info.second.outputs.size()); for (const auto & [i, output] : enumerate(info.second.outputs)) (outputsVal.listElems()[i] = state.allocValue())->mkString(output); @@ -173,7 +172,6 @@ static void prim_appendContext(EvalState & state, const PosIdx pos, Value * * ar state.forceAttrs(*args[1], pos, "while evaluating the second argument passed to builtins.appendContext"); - auto sPath = state.symbols.create("path"); auto sAllOutputs = state.symbols.create("allOutputs"); for (auto & i : *args[1]->attrs) { const auto & name = state.symbols[i.name]; @@ -186,7 +184,7 @@ static void prim_appendContext(EvalState & state, const PosIdx pos, Value * * ar if (!settings.readOnlyMode) state.store->ensurePath(namePath); state.forceAttrs(*i.value, i.pos, "while evaluating the value of a string context"); - auto iter = i.value->attrs->find(sPath); + auto iter = i.value->attrs->find(state.s.path); if (iter != i.value->attrs->end()) { if (state.forceBool(*iter->value, iter->pos, "while evaluating the `path` attribute of a string context")) context.emplace(NixStringContextElem::Opaque { @@ -209,7 +207,7 @@ static void prim_appendContext(EvalState & state, const PosIdx pos, Value * * ar } } - iter = i.value->attrs->find(state.sOutputs); + iter = i.value->attrs->find(state.s.outputs); if (iter != i.value->attrs->end()) { state.forceList(*iter->value, iter->pos, "while evaluating the `outputs` attribute of a string context"); if (iter->value->listSize() && !isDerivation(name)) { diff --git a/lix/libexpr/primops/fetchMercurial.cc b/lix/libexpr/primops/fetchMercurial.cc index 329e65e1d..31c49750b 100644 --- a/lix/libexpr/primops/fetchMercurial.cc +++ b/lix/libexpr/primops/fetchMercurial.cc @@ -68,7 +68,7 @@ static void prim_fetchMercurial(EvalState & state, const PosIdx pos, Value * * a auto [tree, input2] = input.fetch(state.store); auto attrs2 = state.buildBindings(8); - state.mkStorePathString(tree.storePath, attrs2.alloc(state.sOutPath)); + state.mkStorePathString(tree.storePath, attrs2.alloc(state.s.outPath)); if (input2.getRef()) attrs2.alloc("branch").mkString(*input2.getRef()); // Backward compatibility: set 'rev' to diff --git a/lix/libexpr/primops/fetchTree.cc b/lix/libexpr/primops/fetchTree.cc index 1763b0679..cb91930cf 100644 --- a/lix/libexpr/primops/fetchTree.cc +++ b/lix/libexpr/primops/fetchTree.cc @@ -27,7 +27,7 @@ void emitTreeAttrs( auto attrs = state.buildBindings(10); - state.mkStorePathString(tree.storePath, attrs.alloc(state.sOutPath)); + state.mkStorePathString(tree.storePath, attrs.alloc(state.s.outPath)); // FIXME: support arbitrary input attributes. @@ -122,7 +122,7 @@ static void fetchTree( fetchers::Attrs attrs; - if (auto aType = args[0]->attrs->get(state.sType)) { + if (auto aType = args[0]->attrs->get(state.s.type)) { if (type) state.error( "unexpected attribute 'type'" @@ -136,7 +136,7 @@ static void fetchTree( attrs.emplace("type", type.value()); for (auto & attr : *args[0]->attrs) { - if (attr.name == state.sType) continue; + if (attr.name == state.s.type) continue; state.forceValue(*attr.value, attr.pos); if (attr.value->type() == nPath || attr.value->type() == nString) { auto s = state.coerceToString(attr.pos, *attr.value, context, "", false, false).toOwned(); diff --git a/lix/libexpr/print.cc b/lix/libexpr/print.cc index 9884ab066..f6a0e6819 100644 --- a/lix/libexpr/print.cc +++ b/lix/libexpr/print.cc @@ -231,7 +231,7 @@ private: void printDerivation(Value & v) { - Bindings::iterator i = v.attrs->find(state.sDrvPath); + Bindings::iterator i = v.attrs->find(state.s.drvPath); NixStringContext context; std::string storePath; if (i != v.attrs->end()) diff --git a/lix/libexpr/value-to-json.cc b/lix/libexpr/value-to-json.cc index 7be32ee68..b6b7caa03 100644 --- a/lix/libexpr/value-to-json.cc +++ b/lix/libexpr/value-to-json.cc @@ -52,7 +52,7 @@ json printValueAsJSON(EvalState & state, bool strict, out = *maybeString; break; } - auto i = v.attrs->find(state.sOutPath); + auto i = v.attrs->find(state.s.outPath); if (i == v.attrs->end()) { out = json::object(); StringSet names; diff --git a/lix/libexpr/value-to-xml.cc b/lix/libexpr/value-to-xml.cc index 39409a1e6..c8cf581fd 100644 --- a/lix/libexpr/value-to-xml.cc +++ b/lix/libexpr/value-to-xml.cc @@ -89,14 +89,14 @@ static void printValueAsXML(EvalState & state, bool strict, bool location, Bindings::iterator a = v.attrs->find(state.symbols.create("derivation")); Path drvPath; - a = v.attrs->find(state.sDrvPath); + a = v.attrs->find(state.s.drvPath); if (a != v.attrs->end()) { if (strict) state.forceValue(*a->value, a->pos); if (a->value->type() == nString) xmlAttrs["drvPath"] = drvPath = a->value->string.s; } - a = v.attrs->find(state.sOutPath); + a = v.attrs->find(state.s.outPath); if (a != v.attrs->end()) { if (strict) state.forceValue(*a->value, a->pos); if (a->value->type() == nString) diff --git a/lix/nix/app.cc b/lix/nix/app.cc index 14c314f2a..03a94d2d4 100644 --- a/lix/nix/app.cc +++ b/lix/nix/app.cc @@ -99,11 +99,11 @@ UnresolvedApp InstallableValue::toApp(EvalState & state) else if (type == "derivation") { auto drvPath = cursor->forceDerivation(); - auto outPath = cursor->getAttr(state.sOutPath)->getString(); - auto outputName = cursor->getAttr(state.sOutputName)->getString(); - auto name = cursor->getAttr(state.sName)->getString(); + auto outPath = cursor->getAttr(state.s.outPath)->getString(); + auto outputName = cursor->getAttr(state.s.outputName)->getString(); + auto name = cursor->getAttr(state.s.name)->getString(); auto aPname = cursor->maybeGetAttr("pname"); - auto aMeta = cursor->maybeGetAttr(state.sMeta); + auto aMeta = cursor->maybeGetAttr(state.s.meta); auto aMainProgram = aMeta ? aMeta->maybeGetAttr("mainProgram") : nullptr; auto mainProgram = aMainProgram diff --git a/lix/nix/bundle.cc b/lix/nix/bundle.cc index 927375afc..badcdd69c 100644 --- a/lix/nix/bundle.cc +++ b/lix/nix/bundle.cc @@ -96,14 +96,14 @@ struct CmdBundle : InstallableCommand if (!evalState->isDerivation(*vRes)) throw Error("the bundler '%s' does not produce a derivation", bundler.what()); - auto attr1 = vRes->attrs->get(evalState->sDrvPath); + auto attr1 = vRes->attrs->get(evalState->s.drvPath); if (!attr1) throw Error("the bundler '%s' does not produce a derivation", bundler.what()); NixStringContext context2; auto drvPath = evalState->coerceToStorePath(attr1->pos, *attr1->value, context2, ""); - auto attr2 = vRes->attrs->get(evalState->sOutPath); + auto attr2 = vRes->attrs->get(evalState->s.outPath); if (!attr2) throw Error("the bundler '%s' does not produce a derivation", bundler.what()); @@ -119,7 +119,7 @@ struct CmdBundle : InstallableCommand auto outPathS = store->printStorePath(outPath); if (!outLink) { - auto * attr = vRes->attrs->get(evalState->sName); + auto * attr = vRes->attrs->get(evalState->s.name); if (!attr) throw Error("attribute 'name' missing"); outLink = evalState->forceStringNoCtx(*attr->value, attr->pos, ""); diff --git a/lix/nix/flake.cc b/lix/nix/flake.cc index 47a2573c0..75a7fe6bf 100644 --- a/lix/nix/flake.cc +++ b/lix/nix/flake.cc @@ -1242,10 +1242,10 @@ struct CmdFlakeShow : FlakeCommand, MixJSON auto showDerivation = [&]() { - auto name = visitor.getAttr(state->sName)->getString(); + auto name = visitor.getAttr(state->s.name)->getString(); std::optional description; - if (auto aMeta = visitor.maybeGetAttr(state->sMeta)) { - if (auto aDescription = aMeta->maybeGetAttr(state->sDescription)) + if (auto aMeta = visitor.maybeGetAttr(state->s.meta)) { + if (auto aDescription = aMeta->maybeGetAttr(state->s.description)) description = aDescription->getString(); } diff --git a/lix/nix/search.cc b/lix/nix/search.cc index 5d7e0871b..12ef32695 100644 --- a/lix/nix/search.cc +++ b/lix/nix/search.cc @@ -111,10 +111,10 @@ struct CmdSearch : InstallableCommand, MixJSON }; if (cursor.isDerivation()) { - DrvName name(cursor.getAttr(state->sName)->getString()); + DrvName name(cursor.getAttr(state->s.name)->getString()); - auto aMeta = cursor.maybeGetAttr(state->sMeta); - auto aDescription = aMeta ? aMeta->maybeGetAttr(state->sDescription) : nullptr; + auto aMeta = cursor.maybeGetAttr(state->s.meta); + auto aDescription = aMeta ? aMeta->maybeGetAttr(state->s.description) : nullptr; auto description = aDescription ? aDescription->getString() : ""; std::replace(description.begin(), description.end(), '\n', ' '); auto attrPath2 = concatStringsSep(".", attrPathS); @@ -183,7 +183,7 @@ struct CmdSearch : InstallableCommand, MixJSON recurse(); else if (attrPathS[0] == "legacyPackages" && attrPath.size() > 2) { - auto attr = cursor.maybeGetAttr(state->sRecurseForDerivations); + auto attr = cursor.maybeGetAttr(state->s.recurseForDerivations); if (attr && attr->getBool()) recurse(); } diff --git a/tests/unit/libexpr/value/print.cc b/tests/unit/libexpr/value/print.cc index 714286374..8eaa54b8b 100644 --- a/tests/unit/libexpr/value/print.cc +++ b/tests/unit/libexpr/value/print.cc @@ -437,7 +437,7 @@ TEST_F(ValuePrintingTests, ansiColorsDerivation) vDerivation.mkString("derivation"); BindingsBuilder builder(state, state.allocBindings(10)); - builder.insert(state.sType, &vDerivation); + builder.insert(state.s.type, &vDerivation); Value vAttrs; vAttrs.mkAttrs(builder.finish()); @@ -488,8 +488,8 @@ TEST_F(ValuePrintingTests, ansiColorsDerivationError) vDerivation.mkString("derivation"); BindingsBuilder builder(state, state.allocBindings(10)); - builder.insert(state.sType, &vDerivation); - builder.insert(state.sDrvPath, &vError); + builder.insert(state.s.type, &vDerivation); + builder.insert(state.s.drvPath, &vError); Value vAttrs; vAttrs.mkAttrs(builder.finish());