Author: eelco
Date: Wed Jul 6 12:28:57 2011
New Revision: 27616
URL: https://svn.nixos.org/websvn/nix/?rev=27616&sc=1
Log:
* Change the right-hand side of the ‘.’ operator from an attribute to
an attribute path. This is a refactoring to support default values.
Modified:
nix/trunk/src/libexpr/eval.cc
nix/trunk/src/libexpr/nixexpr.cc
nix/trunk/src/libexpr/nixexpr.hh
nix/trunk/src/libexpr/parser.y
Modified: nix/trunk/src/libexpr/eval.cc
==============================================================================
--- nix/trunk/src/libexpr/eval.cc Wed Jul 6 10:58:53 2011 (r27615)
+++ nix/trunk/src/libexpr/eval.cc Wed Jul 6 12:28:57 2011 (r27616)
@@ -636,21 +636,35 @@
void ExprSelect::eval(EvalState & state, Env & env, Value & v)
{
- nrLookups++;
- Value v2;
- state.evalAttrs(env, e, v2);
- nrLookupSize += v2.attrs->size();
- Bindings::iterator i = v2.attrs->find(name);
- if (i == v2.attrs->end())
- throwEvalError("attribute `%1%' missing", name);
- try {
- state.forceValue(*i->value);
+ Value vTmp;
+ Pos * pos = 0;
+ Value * vAttrs = &vTmp;
+
+ state.eval(env, e, vTmp);
+
+ try {
+
+ foreach (AttrPath::const_iterator, i, attrPath) {
+ nrLookups++;
+ state.forceAttrs(*vAttrs);
+ nrLookupSize += vAttrs->attrs->size();
+ Bindings::iterator j;
+ if ((j = vAttrs->attrs->find(*i)) == vAttrs->attrs->end())
+ throwEvalError("attribute `%1%' missing",
showAttrPath(attrPath));
+ vAttrs = j->value;
+ pos = j->pos;
+ }
+
+ state.forceValue(*vAttrs);
+
} catch (Error & e) {
- addErrorPrefix(e, "while evaluating the attribute `%1%' at %2%:\n",
- name, *i->pos);
+ if (pos)
+ addErrorPrefix(e, "while evaluating the attribute `%1%' at %2%:\n",
+ showAttrPath(attrPath), *pos);
throw;
}
- v = *i->value;
+
+ v = *vAttrs;
}
Modified: nix/trunk/src/libexpr/nixexpr.cc
==============================================================================
--- nix/trunk/src/libexpr/nixexpr.cc Wed Jul 6 10:58:53 2011 (r27615)
+++ nix/trunk/src/libexpr/nixexpr.cc Wed Jul 6 12:28:57 2011 (r27616)
@@ -43,7 +43,7 @@
void ExprSelect::show(std::ostream & str)
{
- str << "(" << *e << ")." << name;
+ str << "(" << *e << ")." << showAttrPath(attrPath);
}
void ExprOpHasAttr::show(std::ostream & str)
Modified: nix/trunk/src/libexpr/nixexpr.hh
==============================================================================
--- nix/trunk/src/libexpr/nixexpr.hh Wed Jul 6 10:58:53 2011 (r27615)
+++ nix/trunk/src/libexpr/nixexpr.hh Wed Jul 6 12:28:57 2011 (r27616)
@@ -122,8 +122,9 @@
struct ExprSelect : Expr
{
Expr * e;
- Symbol name;
- ExprSelect(Expr * e, const Symbol & name) : e(e), name(name) { };
+ AttrPath attrPath;
+ ExprSelect(Expr * e, const AttrPath & attrPath) : e(e), attrPath(attrPath)
{ };
+ ExprSelect(Expr * e, const Symbol & name) : e(e) {
attrPath.push_back(name); };
COMMON_METHODS
};
Modified: nix/trunk/src/libexpr/parser.y
==============================================================================
--- nix/trunk/src/libexpr/parser.y Wed Jul 6 10:58:53 2011 (r27615)
+++ nix/trunk/src/libexpr/parser.y Wed Jul 6 12:28:57 2011 (r27616)
@@ -325,8 +325,8 @@
;
expr_select
- : expr_select '.' ID
- { $$ = new ExprSelect($1, data->symbols.create($3)); }
+ : expr_simple '.' attrpath
+ { $$ = new ExprSelect($1, *$3); }
| expr_simple { $$ = $1; }
;
@@ -382,7 +382,7 @@
| binds INHERIT '(' expr ')' ids ';'
{ $$ = $1;
/* !!! Should ensure sharing of the expression in $4. */
- foreach (AttrPath::iterator, i, *$6) {
+ foreach (vector<Symbol>::iterator, i, *$6) {
if ($$->attrs.find(*i) != $$->attrs.end())
dupAttr(*i, makeCurPos(@6, data), $$->attrs[*i].pos);
$$->attrs[*i] = ExprAttrs::AttrDef(new ExprSelect($4, *i),
makeCurPos(@6, data));
_______________________________________________
nix-commits mailing list
[email protected]
http://mail.cs.uu.nl/mailman/listinfo/nix-commits