aboutsummaryrefslogtreecommitdiff
path: root/src/libexpr/eval.cc
diff options
context:
space:
mode:
authorEelco Dolstra <e.dolstra@tudelft.nl>2006-05-04 12:21:08 +0000
committerEelco Dolstra <e.dolstra@tudelft.nl>2006-05-04 12:21:08 +0000
commit0832956089516d32371060c98df4f8d0cbff2b0f (patch)
treeff054ab5727324f0de5bdc56460aeafded11f5f5 /src/libexpr/eval.cc
parent9840368cad6088e4221fb323202861c97d70bb37 (diff)
* Use the new ATermMap.
Diffstat (limited to 'src/libexpr/eval.cc')
-rw-r--r--src/libexpr/eval.cc44
1 files changed, 21 insertions, 23 deletions
diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc
index 6d2b20e53..38f198fb8 100644
--- a/src/libexpr/eval.cc
+++ b/src/libexpr/eval.cc
@@ -4,7 +4,7 @@
EvalState::EvalState()
- : normalForms(32768, 50)
+ : normalForms(32768), primOps(128)
{
nrEvaluated = nrCached = 0;
@@ -17,7 +17,7 @@ EvalState::EvalState()
void EvalState::addPrimOp(const string & name,
unsigned int arity, PrimOp primOp)
{
- primOps.set(name, makePrimOpDef(arity, ATmakeBlob(0, (void *) primOp)));
+ primOps.set(toATerm(name), makePrimOpDef(arity, ATmakeBlob(0, (void *) primOp)));
}
@@ -25,7 +25,6 @@ void EvalState::addPrimOp(const string & name,
static Expr substArgs(Expr body, ATermList formals, Expr arg)
{
ATermMap subs(ATgetLength(formals) * 2);
- Expr undefined = makeUndefined();
/* ({x ? E1; y ? E2, z}: E3) {x = E4; z = E5;}
@@ -44,7 +43,7 @@ static Expr substArgs(Expr body, ATermList formals, Expr arg)
for (ATermIterator i(formals); i; ++i) {
Expr name, def;
if (matchNoDefFormal(*i, name))
- subs.set(name, undefined);
+ subs.set(name, makeUndefined());
else if (matchDefFormal(*i, name, def))
subs.set(name, def);
else abort(); /* can't happen */
@@ -52,22 +51,21 @@ static Expr substArgs(Expr body, ATermList formals, Expr arg)
/* Get the actual arguments, and check that they match with the
formals. */
- ATermMap args;
+ ATermMap args(128); /* !!! fix */
queryAllAttrs(arg, args);
- for (ATermIterator i(args.keys()); i; ++i) {
- Expr key = *i;
- Expr cur = subs.get(key);
- if (!cur)
+ for (ATermMap::const_iterator i = args.begin(); i != args.end(); ++i) {
+ Expr cur = subs.get(i->key);
+ if (!subs.get(i->key))
throw Error(format("unexpected function argument `%1%'")
- % aterm2String(key));
- subs.set(key, args.get(key));
+ % aterm2String(i->key));
+ subs.set(i->key, i->value);
}
/* Check that all arguments are defined. */
- for (ATermIterator i(subs.keys()); i; ++i)
- if (subs.get(*i) == undefined)
+ for (ATermMap::const_iterator i = subs.begin(); i != subs.end(); ++i)
+ if (i->value == makeUndefined())
throw Error(format("required function argument `%1%' missing")
- % aterm2String(*i));
+ % aterm2String(i->key));
return substitute(Substitution(0, &subs), body);
}
@@ -85,7 +83,7 @@ ATerm expandRec(ATerm e, ATermList rbnds, ATermList nrbnds)
Pos pos;
/* Create the substitution list. */
- ATermMap subs;
+ ATermMap subs(ATgetLength(rbnds) + ATgetLength(nrbnds));
for (ATermIterator i(rbnds); i; ++i) {
if (!matchBind(*i, name, e2, pos)) abort(); /* can't happen */
subs.set(name, makeSelect(e, name));
@@ -98,7 +96,7 @@ ATerm expandRec(ATerm e, ATermList rbnds, ATermList nrbnds)
Substitution subs_(0, &subs);
/* Create the non-recursive set. */
- ATermMap as;
+ ATermMap as(ATgetLength(rbnds) + ATgetLength(nrbnds));
for (ATermIterator i(rbnds); i; ++i) {
if (!matchBind(*i, name, e2, pos)) abort(); /* can't happen */
as.set(name, makeAttrRHS(substitute(subs_, e2), pos));
@@ -118,7 +116,7 @@ static Expr updateAttrs(Expr e1, Expr e2)
{
/* Note: e1 and e2 should be in normal form. */
- ATermMap attrs;
+ ATermMap attrs(128); /* !!! */
queryAllAttrs(e1, attrs, true);
queryAllAttrs(e2, attrs, true);
@@ -217,12 +215,12 @@ string coerceToStringWithContext(EvalState & state,
}
if (matchAttrs(e, es)) {
- ATermMap attrs;
+ ATermMap attrs(128); /* !!! */
queryAllAttrs(e, attrs, false);
- Expr a = attrs.get("type");
+ Expr a = attrs.get(toATerm("type"));
if (a && evalString(state, a) == "derivation") {
- a = attrs.get("outPath");
+ a = attrs.get(toATerm("outPath"));
if (!a) throw Error("output path missing from derivation");
context = ATinsert(context, e);
return evalPath(state, a);
@@ -342,7 +340,7 @@ Expr evalExpr2(EvalState & state, Expr e)
else if (matchFunction1(e1, name, e4, pos)) {
try {
- ATermMap subs;
+ ATermMap subs(1);
subs.set(name, e2);
return evalExpr(state, substitute(Substitution(0, &subs), e4));
} catch (Error & e) {
@@ -392,7 +390,7 @@ Expr evalExpr2(EvalState & state, Expr e)
/* Withs. */
if (matchWith(e, e1, e2, pos)) {
- ATermMap attrs;
+ ATermMap attrs(128); /* !!! */
try {
e1 = evalExpr(state, e1);
queryAllAttrs(e1, attrs);
@@ -442,7 +440,7 @@ Expr evalExpr2(EvalState & state, Expr e)
/* Attribute existence test (?). */
if (matchOpHasAttr(e, e1, name)) {
- ATermMap attrs;
+ ATermMap attrs(128); /* !!! */
queryAllAttrs(evalExpr(state, e1), attrs);
return makeBool(attrs.get(name) != 0);
}