From 159e621d1a9c4391b53f3d822109c36931934698 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Fri, 2 Aug 2013 15:21:17 +0000 Subject: Overload the ‘+’ operator to support integer addition MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/libexpr/eval.cc | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) (limited to 'src/libexpr/eval.cc') diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc index f891496a7568..766440fc67cb 100644 --- a/src/libexpr/eval.cc +++ b/src/libexpr/eval.cc @@ -968,31 +968,39 @@ void ExprConcatStrings::eval(EvalState & state, Env & env, Value & v) { PathSet context; std::ostringstream s; - - bool first = true, isPath = false; - Value vStr; + int n = 0; + + bool first = true; + ValueType firstType; foreach (vector::iterator, i, *es) { - (*i)->eval(state, env, vStr); + Value vTmp; + (*i)->eval(state, env, vTmp); /* If the first element is a path, then the result will also be a path, we don't copy anything (yet - that's done later, since paths are copied when they are used in a derivation), and none of the strings are allowed to have contexts. */ if (first) { - isPath = !forceString && vStr.type == tPath; + firstType = vTmp.type; first = false; } - s << state.coerceToString(vStr, context, false, !isPath); + if (firstType == tInt && !forceString) { + if (vTmp.type != tInt) + throwEvalError("cannot add %1% to an integer", showType(vTmp)); + n += vTmp.integer; + } else + s << state.coerceToString(vTmp, context, false, firstType != tPath); } - - if (isPath && !context.empty()) - throwEvalError("a string that refers to a store path cannot be appended to a path, in `%1%'", s.str()); - if (isPath) + if (firstType == tInt) + mkInt(v, n); + else if (firstType == tPath) { + if (!context.empty()) + throwEvalError("a string that refers to a store path cannot be appended to a path, in `%1%'", s.str()); mkPath(v, s.str().c_str()); - else + } else mkString(v, s.str(), context); } -- cgit 1.4.1