diff options
-rw-r--r-- | src/eval.cc | 38 | ||||
-rw-r--r-- | src/test-builder-2.sh | 5 | ||||
-rw-r--r-- | src/test.cc | 13 |
3 files changed, 44 insertions, 12 deletions
diff --git a/src/eval.cc b/src/eval.cc index c96cf6467ecc..e6a3478a1551 100644 --- a/src/eval.cc +++ b/src/eval.cc @@ -165,7 +165,7 @@ static Hash computeDerived(Hash sourceHash, string targetName, /* Register targetHash -> targetPath. !!! this should be in values.cc. */ - setDB(nixDB, dbNFs, sourceHash, targetName); + setDB(nixDB, dbRefs, targetHash, targetName); /* Register that targetHash was produced by evaluating sourceHash; i.e., that targetHash is a normal form of @@ -227,6 +227,34 @@ static Hash evalExternal(Expr e) } +/* Evaluate a list of arguments into normal form. */ +void evalArgs(ATermList args, ATermList & argsNF, Environment & env) +{ + argsNF = ATempty; + + while (!ATisEmpty(args)) { + ATerm eName, eVal, arg = ATgetFirst(args); + if (!ATmatch(arg, "Tup(<term>, <term>)", &eName, &eVal)) + throw badTerm("invalid argument", arg); + + string name = evalString(eName); + eVal = evalValue(eVal).e; + + char * s; + if (ATmatch(eVal, "Str(<str>)", &s)) { + env[name] = s; + } else if (ATmatch(eVal, "External(<str>)", &s)) { + env[name] = queryValuePath(parseHash(s)); + } else throw badTerm("invalid argument value", eVal); + + argsNF = ATappend(argsNF, + ATmake("Tup(Str(<str>), <term>)", name.c_str(), eVal)); + + args = ATgetNext(args); + } +} + + /* Evaluate an expression. */ EvalResult evalValue(Expr e) { @@ -263,12 +291,8 @@ EvalResult evalValue(Expr e) Hash prog = evalExternal(eProg); Environment env; - while (!ATisEmpty(args)) { - debug("arg"); - Expr arg = ATgetFirst(args); - throw badTerm("foo", arg); - args = ATgetNext(args); - } + ATermList argsNF; + evalArgs(args, argsNF, env); Hash sourceHash = hashExpr( ATmake("Exec(Str(<str>), External(<str>), [])", diff --git a/src/test-builder-2.sh b/src/test-builder-2.sh index 25a66532ff4d..010e1c80576b 100644 --- a/src/test-builder-2.sh +++ b/src/test-builder-2.sh @@ -1,5 +1,8 @@ #! /bin/sh +echo "builder 2" + mkdir $out || exit 1 cd $out || exit 1 -echo "Hello World" > bla +echo "Hallo Wereld" > bla +cat $src >> bla \ No newline at end of file diff --git a/src/test.cc b/src/test.cc index b37a16a1fe0c..bf7ee191f0b7 100644 --- a/src/test.cc +++ b/src/test.cc @@ -74,13 +74,18 @@ void runTests() Hash builder1 = addValue("./test-builder-1.sh"); - evalTest(ATmake("Exec(Str(<str>), External(<str>), [])", - thisSystem.c_str(), ((string) builder1).c_str())); + Expr e1 = ATmake("Exec(Str(<str>), External(<str>), [])", + thisSystem.c_str(), ((string) builder1).c_str()); + + evalTest(e1); Hash builder2 = addValue("./test-builder-2.sh"); - evalTest(ATmake("Exec(Str(<str>), External(<str>), [])", - thisSystem.c_str(), ((string) builder2).c_str())); + Expr e2 = ATmake( + "Exec(Str(<str>), External(<str>), [Tup(Str(\"src\"), <term>)])", + thisSystem.c_str(), ((string) builder2).c_str(), e1); + + evalTest(e2); } |