1
0
Fork 0
mirror of https://github.com/NixOS/nix synced 2025-06-26 15:51:15 +02:00

* Finished the ATerm-less parser.

This commit is contained in:
Eelco Dolstra 2010-04-12 23:33:23 +00:00
parent 0d272fca79
commit 10e8b1fd15
6 changed files with 68 additions and 102 deletions

View file

@ -54,6 +54,7 @@ std::ostream & operator << (std::ostream & str, Value & v)
str << "]";
break;
case tThunk:
case tCopy:
str << "<CODE>";
break;
case tLambda:
@ -160,6 +161,16 @@ LocalNoInlineNoReturn(void throwTypeError(const char * s, const string & s2))
throw TypeError(format(s) % s2);
}
LocalNoInlineNoReturn(void throwTypeError(const char * s, const Pos & pos, const string & s2))
{
throw TypeError(format(s) % pos % s2);
}
LocalNoInlineNoReturn(void throwTypeError(const char * s, const Pos & pos))
{
throw TypeError(format(s) % pos);
}
LocalNoInlineNoReturn(void throwAssertionError(const char * s, const Pos & pos))
{
throw AssertionError(format(s) % pos);
@ -175,6 +186,11 @@ LocalNoInline(void addErrorPrefix(Error & e, const char * s, const string & s2))
e.addPrefix(format(s) % s2);
}
LocalNoInline(void addErrorPrefix(Error & e, const char * s, const Pos & pos))
{
e.addPrefix(format(s) % pos);
}
LocalNoInline(void addErrorPrefix(Error & e, const char * s, const string & s2, const string & s3))
{
e.addPrefix(format(s) % s2 % s3);
@ -424,6 +440,11 @@ void ExprAttrs::eval(EvalState & state, Env & env, Value & v)
Value & v2 = (*v.attrs)[i->first];
mkThunk(v2, env, i->second);
}
foreach (list<string>::iterator, i, inherited) {
Value & v2 = (*v.attrs)[*i];
mkCopy(v2, *lookupVar(&env, *i));
}
}
}
@ -555,7 +576,8 @@ void EvalState::callFunction(Value & fun, Value & arg, Value & v)
nrValues++;
if (j == arg.attrs->end()) {
if (!i->def) throwTypeError("the argument named `%1%' required by the function is missing", i->name);
if (!i->def) throwTypeError("function at %1% called without required argument `%2%'",
fun.lambda.fun->pos, i->name);
mkThunk(v, env2, i->def);
} else {
attrsUsed++;
@ -568,10 +590,15 @@ void EvalState::callFunction(Value & fun, Value & arg, Value & v)
TODO: show the names of the expected/unexpected
arguments. */
if (!fun.lambda.fun->formals->ellipsis && attrsUsed != arg.attrs->size())
throwTypeError("function called with unexpected argument");
throwTypeError("function at %1% called with unexpected argument", fun.lambda.fun->pos);
}
eval(env2, fun.lambda.fun->body, v);
try {
eval(env2, fun.lambda.fun->body, v);
} catch (Error & e) {
addErrorPrefix(e, "while evaluating the function at %1%:\n", fun.lambda.fun->pos);
throw;
}
}