printValue(): Don't show repeated values

Fixes #6157.
This commit is contained in:
Eelco Dolstra 2022-03-03 13:07:50 +01:00
parent 6097790863
commit ecff9d969a
3 changed files with 16 additions and 15 deletions

View file

@ -86,15 +86,10 @@ RootValue allocRootValue(Value * v)
}
void printValue(std::ostream & str, std::set<const Value *> & active, const Value & v)
void printValue(std::ostream & str, std::set<const Value *> & seen, const Value & v)
{
checkInterrupt();
if (!active.insert(&v).second) {
str << "<CYCLE>";
return;
}
switch (v.internalType) {
case tInt:
str << v.integer;
@ -120,10 +115,14 @@ void printValue(std::ostream & str, std::set<const Value *> & active, const Valu
str << "null";
break;
case tAttrs: {
seen.insert(&v);
str << "{ ";
for (auto & i : v.attrs->lexicographicOrder()) {
str << i->name << " = ";
printValue(str, active, *i->value);
if (seen.count(i->value))
str << "<REPEAT>";
else
printValue(str, seen, *i->value);
str << "; ";
}
str << "}";
@ -132,9 +131,13 @@ void printValue(std::ostream & str, std::set<const Value *> & active, const Valu
case tList1:
case tList2:
case tListN:
seen.insert(&v);
str << "[ ";
for (auto v2 : v.listItems()) {
printValue(str, active, *v2);
if (seen.count(v2))
str << "<REPEAT>";
else
printValue(str, seen, *v2);
str << " ";
}
str << "]";
@ -161,15 +164,13 @@ void printValue(std::ostream & str, std::set<const Value *> & active, const Valu
default:
abort();
}
active.erase(&v);
}
std::ostream & operator << (std::ostream & str, const Value & v)
{
std::set<const Value *> active;
printValue(str, active, v);
std::set<const Value *> seen;
printValue(str, seen, v);
return str;
}

View file

@ -114,8 +114,8 @@ struct Value
private:
InternalType internalType;
friend std::string showType(const Value & v);
friend void printValue(std::ostream & str, std::set<const Value *> & active, const Value & v);
friend std::string showType(const Value & v);
friend void printValue(std::ostream & str, std::set<const Value *> & seen, const Value & v);
public:

View file

@ -800,7 +800,7 @@ std::ostream & NixRepl::printValue(std::ostream & str, Value & v, unsigned int m
else
printStringValue(str, i.first.c_str());
str << " = ";
if (seen.find(i.second) != seen.end())
if (seen.count(i.second))
str << "«repeated»";
else
try {