aboutsummaryrefslogtreecommitdiff
path: root/src/libexpr
diff options
context:
space:
mode:
authorEelco Dolstra <edolstra@gmail.com>2022-03-03 13:29:14 +0100
committerEelco Dolstra <edolstra@gmail.com>2022-03-03 13:33:34 +0100
commite9c04c3351b4b3acae2d154b9aba808c3600054f (patch)
treebc084ed79faf15a58d926318dfe1df58db7d5ae7 /src/libexpr
parentecff9d969acef5a08d3963d16eac83a5210de86e (diff)
Be more aggressive in hiding repeated values
We now memoize on Bindings / list element vectors rather than Values, so that e.g. two Values that point to the same Bindings will be printed only once.
Diffstat (limited to 'src/libexpr')
-rw-r--r--src/libexpr/eval.cc38
-rw-r--r--src/libexpr/value.hh2
2 files changed, 20 insertions, 20 deletions
diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc
index d9d36fab2..2d7309738 100644
--- a/src/libexpr/eval.cc
+++ b/src/libexpr/eval.cc
@@ -86,7 +86,7 @@ RootValue allocRootValue(Value * v)
}
-void printValue(std::ostream & str, std::set<const Value *> & seen, const Value & v)
+void printValue(std::ostream & str, std::set<const void *> & seen, const Value & v)
{
checkInterrupt();
@@ -115,32 +115,32 @@ void printValue(std::ostream & str, std::set<const Value *> & seen, const Value
str << "null";
break;
case tAttrs: {
- seen.insert(&v);
- str << "{ ";
- for (auto & i : v.attrs->lexicographicOrder()) {
- str << i->name << " = ";
- if (seen.count(i->value))
- str << "<REPEAT>";
- else
+ if (!v.attrs->empty() && !seen.insert(v.attrs).second)
+ str << "<REPEAT>";
+ else {
+ str << "{ ";
+ for (auto & i : v.attrs->lexicographicOrder()) {
+ str << i->name << " = ";
printValue(str, seen, *i->value);
- str << "; ";
+ str << "; ";
+ }
+ str << "}";
}
- str << "}";
break;
}
case tList1:
case tList2:
case tListN:
- seen.insert(&v);
- str << "[ ";
- for (auto v2 : v.listItems()) {
- if (seen.count(v2))
- str << "<REPEAT>";
- else
+ if (v.listSize() && !seen.insert(v.listElems()).second)
+ str << "<REPEAT>";
+ else {
+ str << "[ ";
+ for (auto v2 : v.listItems()) {
printValue(str, seen, *v2);
- str << " ";
+ str << " ";
+ }
+ str << "]";
}
- str << "]";
break;
case tThunk:
case tApp:
@@ -169,7 +169,7 @@ void printValue(std::ostream & str, std::set<const Value *> & seen, const Value
std::ostream & operator << (std::ostream & str, const Value & v)
{
- std::set<const Value *> seen;
+ std::set<const void *> seen;
printValue(str, seen, v);
return str;
}
diff --git a/src/libexpr/value.hh b/src/libexpr/value.hh
index 84c4d09f8..d0fa93e92 100644
--- a/src/libexpr/value.hh
+++ b/src/libexpr/value.hh
@@ -115,7 +115,7 @@ private:
InternalType internalType;
friend std::string showType(const Value & v);
- friend void printValue(std::ostream & str, std::set<const Value *> & seen, const Value & v);
+ friend void printValue(std::ostream & str, std::set<const void *> & seen, const Value & v);
public: