chore(3p/nix/libexpr): Remove unused __overrides feature
This feature does not appear in nixpkgs, so I don't care about it. My only goal is evaluating nixpkgs.
This commit is contained in:
parent
6b447f4b25
commit
92792264f7
3 changed files with 11 additions and 57 deletions
58
third_party/nix/src/libexpr/eval.cc
vendored
58
third_party/nix/src/libexpr/eval.cc
vendored
|
@ -299,7 +299,6 @@ EvalState::EvalState(const Strings& _searchPath, const ref<Store>& store)
|
|||
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")),
|
||||
|
@ -799,8 +798,8 @@ void ExprString::eval(EvalState& state, Env& env, Value& v) { v = this->v; }
|
|||
|
||||
void ExprPath::eval(EvalState& state, Env& env, Value& v) { v = this->v; }
|
||||
|
||||
void ExprAttrs::eval(EvalState& state, Env& env, Value& v) {
|
||||
state.mkAttrs(v, attrs.size() + dynamicAttrs.size());
|
||||
void ExprAttrs::eval(EvalState& state, Env& env, Value& value) {
|
||||
state.mkAttrs(value, attrs.size() + dynamicAttrs.size());
|
||||
Env* dynamicEnv = &env;
|
||||
|
||||
if (recursive) {
|
||||
|
@ -810,61 +809,26 @@ void ExprAttrs::eval(EvalState& state, Env& env, Value& v) {
|
|||
env2.up = &env;
|
||||
dynamicEnv = &env2;
|
||||
|
||||
// TODO(tazjin): contains?
|
||||
AttrDefs::iterator overrides = attrs.find(state.sOverrides);
|
||||
bool hasOverrides = overrides != attrs.end();
|
||||
|
||||
/* The recursive attributes are evaluated in the new
|
||||
environment, while the inherited attributes are evaluated
|
||||
in the original environment. */
|
||||
size_t displ = 0;
|
||||
for (auto& i : attrs) {
|
||||
for (auto& attr : attrs) {
|
||||
Value* vAttr;
|
||||
if (hasOverrides && !i.second.inherited) {
|
||||
vAttr = state.allocValue();
|
||||
mkThunk(*vAttr, env2, i.second.e);
|
||||
} else {
|
||||
vAttr = i.second.e->maybeThunk(state, i.second.inherited ? env : env2);
|
||||
}
|
||||
vAttr = attr.second.e->maybeThunk(state,
|
||||
attr.second.inherited ? env : env2);
|
||||
env2.values[displ++] = vAttr;
|
||||
v.attrs->push_back(Attr(i.first, vAttr, &i.second.pos));
|
||||
}
|
||||
|
||||
/* If the rec contains an attribute called `__overrides', then
|
||||
evaluate it, and add the attributes in that set to the rec.
|
||||
This allows overriding of recursive attributes, which is
|
||||
otherwise not possible. (You can use the // operator to
|
||||
replace an attribute, but other attributes in the rec will
|
||||
still reference the original value, because that value has
|
||||
been substituted into the bodies of the other attributes.
|
||||
Hence we need __overrides.) */
|
||||
if (hasOverrides) {
|
||||
Value* vOverrides = v.attrs->find(overrides->first)->second.value;
|
||||
state.forceAttrs(*vOverrides);
|
||||
Bindings* newBnds = Bindings::NewGC();
|
||||
for (auto& i : *v.attrs) { // TODO(tazjin): copy constructor?
|
||||
newBnds->push_back(i.second);
|
||||
}
|
||||
for (auto& i : *vOverrides->attrs) {
|
||||
auto j = attrs.find(i.second.name);
|
||||
if (j != attrs.end()) {
|
||||
newBnds->push_back(i.second);
|
||||
env2.values[j->second.displ] = i.second.value;
|
||||
} else {
|
||||
newBnds->push_back(i.second);
|
||||
}
|
||||
}
|
||||
v.attrs = newBnds;
|
||||
value.attrs->push_back(Attr(attr.first, vAttr, &attr.second.pos));
|
||||
}
|
||||
} else {
|
||||
// TODO(tazjin): insert range
|
||||
for (auto& i : attrs) {
|
||||
v.attrs->push_back(
|
||||
value.attrs->push_back(
|
||||
Attr(i.first, i.second.e->maybeThunk(state, env), &i.second.pos));
|
||||
}
|
||||
}
|
||||
|
||||
/* Dynamic attrs apply *after* rec and __overrides. */
|
||||
/* Dynamic attrs apply *after* rec. */
|
||||
for (auto& i : dynamicAttrs) {
|
||||
Value nameVal;
|
||||
i.nameExpr->eval(state, *dynamicEnv, nameVal);
|
||||
|
@ -874,14 +838,14 @@ void ExprAttrs::eval(EvalState& state, Env& env, Value& v) {
|
|||
}
|
||||
state.forceStringNoCtx(nameVal);
|
||||
Symbol nameSym = state.symbols.Create(nameVal.string.s);
|
||||
Bindings::iterator j = v.attrs->find(nameSym);
|
||||
if (j != v.attrs->end()) {
|
||||
Bindings::iterator j = value.attrs->find(nameSym);
|
||||
if (j != value.attrs->end()) {
|
||||
throwEvalError("dynamic attribute '%1%' at %2% already defined at %3%",
|
||||
nameSym, i.pos, *j->second.pos);
|
||||
}
|
||||
|
||||
i.valueExpr->setName(nameSym);
|
||||
v.attrs->push_back(
|
||||
value.attrs->push_back(
|
||||
Attr(nameSym, i.valueExpr->maybeThunk(state, *dynamicEnv), &i.pos));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1 +0,0 @@
|
|||
2
|
|
@ -1,9 +0,0 @@
|
|||
let
|
||||
|
||||
overrides = { a = 2; };
|
||||
|
||||
in (rec {
|
||||
__overrides = overrides;
|
||||
x = a;
|
||||
a = 1;
|
||||
}).x
|
Loading…
Reference in a new issue