aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEelco Dolstra <eelco.dolstra@logicblox.com>2014-10-01 15:54:40 +0200
committerEelco Dolstra <eelco.dolstra@logicblox.com>2014-10-01 15:54:40 +0200
commita17c23426e7b2724639cd90c23759299cdaffbb7 (patch)
tree61058083272fd3a20e9bcedd654543311d8f1d2f /src
parentd61853430a3df8914995ae35ac7a0795827d7a87 (diff)
printValue(): Don't print <CYCLE> for repeated values
Diffstat (limited to 'src')
-rw-r--r--src/libexpr/eval.cc16
1 files changed, 9 insertions, 7 deletions
diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc
index 43d8f1399..46a425900 100644
--- a/src/libexpr/eval.cc
+++ b/src/libexpr/eval.cc
@@ -38,13 +38,13 @@ void Bindings::sort()
}
-static void printValue(std::ostream & str, std::set<const Value *> & seen, const Value & v)
+static void printValue(std::ostream & str, std::set<const Value *> & active, const Value & v)
{
- if (seen.find(&v) != seen.end()) {
+ if (active.find(&v) != active.end()) {
str << "<CYCLE>";
return;
}
- seen.insert(&v);
+ active.insert(&v);
switch (v.type) {
case tInt:
@@ -77,7 +77,7 @@ static void printValue(std::ostream & str, std::set<const Value *> & seen, const
sorted[i->name] = i->value;
for (auto & i : sorted) {
str << i.first << " = ";
- printValue(str, seen, *i.second);
+ printValue(str, active, *i.second);
str << "; ";
}
str << "}";
@@ -86,7 +86,7 @@ static void printValue(std::ostream & str, std::set<const Value *> & seen, const
case tList:
str << "[ ";
for (unsigned int n = 0; n < v.list.length; ++n) {
- printValue(str, seen, *v.list.elems[n]);
+ printValue(str, active, *v.list.elems[n]);
str << " ";
}
str << "]";
@@ -107,13 +107,15 @@ static void printValue(std::ostream & str, std::set<const Value *> & seen, const
default:
throw Error("invalid value");
}
+
+ active.erase(&v);
}
std::ostream & operator << (std::ostream & str, const Value & v)
{
- std::set<const Value *> seen;
- printValue(str, seen, v);
+ std::set<const Value *> active;
+ printValue(str, active, v);
return str;
}