treemanifest: add an optimized __nonzero__()
authorMartin von Zweigbergk <martinvonz@google.com>
Tue, 13 Feb 2018 13:23:18 -0800
changeset 36212 b42c47b8c9d4
parent 36211 8173eeb69fb3
child 36213 59affe7e01d4
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
mercurial/manifest.py
--- 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