treemanifest: add an optimized __nonzero__()
We use bool(manifest) in at least some places:
localrepo.py:1730
hgweb/webcommands.py:524
Since the treemanifest class doesn't define __nonzero__() (before this
patch), bool(manifest) will instead call __len__(), which can be slow
for treemanifests. This patch may make a noticeable difference in the
localrepo case above, but that only happens when committing a merge
and I haven't timed it.
Note that Durham already added a __nonzero__ implementation to
manifestdict in b19291e5d506 (manifest: add __nonzero__ method,
2016-11-03).
Differential Revision: https://phab.mercurial-scm.org/D2232
--- a/mercurial/manifest.py Tue Feb 13 18:49:06 2018 -0500
+++ b/mercurial/manifest.py Tue Feb 13 13:23:18 2018 -0800
@@ -755,6 +755,12 @@
size += m.__len__()
return size
+ def __nonzero__(self):
+ # Faster than "__len() != 0" since it avoids loading sub-manifests
+ return not self._isempty()
+
+ __bool__ = __nonzero__
+
def _isempty(self):
self._load() # for consistency; already loaded by all callers
return (not self._files and (not self._dirs or