forceInt: Show position info

This commit is contained in:
Eelco Dolstra 2014-04-04 18:58:15 +02:00
parent c28de6d96e
commit b62d36963c
3 changed files with 11 additions and 11 deletions

View File

@ -1151,11 +1151,11 @@ void EvalState::strictForceValue(Value & v)
}
NixInt EvalState::forceInt(Value & v)
NixInt EvalState::forceInt(Value & v, const Pos & pos)
{
forceValue(v);
if (v.type != tInt)
throwTypeError("value is %1% while an integer was expected", v);
throwTypeError("value is %1% while an integer was expected, at %2%", v, pos);
return v.integer;
}

View File

@ -158,7 +158,7 @@ public:
void strictForceValue(Value & v);
/* Force `v', and then verify that it has the expected type. */
NixInt forceInt(Value & v);
NixInt forceInt(Value & v, const Pos & pos);
bool forceBool(Value & v);
inline void forceAttrs(Value & v);
inline void forceList(Value & v);

View File

@ -954,7 +954,7 @@ static void elemAt(EvalState & state, const Pos & pos, Value & list, int n, Valu
/* Return the n-1'th element of a list. */
static void prim_elemAt(EvalState & state, const Pos & pos, Value * * args, Value & v)
{
elemAt(state, pos, *args[0], state.forceInt(*args[1]), v);
elemAt(state, pos, *args[0], state.forceInt(*args[1], pos), v);
}
@ -1061,27 +1061,27 @@ static void prim_length(EvalState & state, const Pos & pos, Value * * args, Valu
static void prim_add(EvalState & state, const Pos & pos, Value * * args, Value & v)
{
mkInt(v, state.forceInt(*args[0]) + state.forceInt(*args[1]));
mkInt(v, state.forceInt(*args[0], pos) + state.forceInt(*args[1], pos));
}
static void prim_sub(EvalState & state, const Pos & pos, Value * * args, Value & v)
{
mkInt(v, state.forceInt(*args[0]) - state.forceInt(*args[1]));
mkInt(v, state.forceInt(*args[0], pos) - state.forceInt(*args[1], pos));
}
static void prim_mul(EvalState & state, const Pos & pos, Value * * args, Value & v)
{
mkInt(v, state.forceInt(*args[0]) * state.forceInt(*args[1]));
mkInt(v, state.forceInt(*args[0], pos) * state.forceInt(*args[1], pos));
}
static void prim_div(EvalState & state, const Pos & pos, Value * * args, Value & v)
{
NixInt i2 = state.forceInt(*args[1]);
NixInt i2 = state.forceInt(*args[1], pos);
if (i2 == 0) throw EvalError(format("division by zero, at %1%") % pos);
mkInt(v, state.forceInt(*args[0]) / i2);
mkInt(v, state.forceInt(*args[0], pos) / i2);
}
@ -1116,8 +1116,8 @@ static void prim_toString(EvalState & state, const Pos & pos, Value * * args, Va
non-negative. */
static void prim_substring(EvalState & state, const Pos & pos, Value * * args, Value & v)
{
int start = state.forceInt(*args[0]);
int len = state.forceInt(*args[1]);
int start = state.forceInt(*args[0], pos);
int len = state.forceInt(*args[1], pos);
PathSet context;
string s = state.coerceToString(*args[2], context);