revset: duplicate spanset.__contains__ to fullreposet for modification
authorYuya Nishihara <yuya@tcha.org>
Sat, 10 Jan 2015 18:09:25 +0900
changeset 24203 33c7a94d4dd0
parent 24202 2de9ee016425
child 24204 d2de20e1451f
revset: duplicate spanset.__contains__ to fullreposet for modification 1d7a2771aa36 says we should avoid function calls in __contains__, so super(fullreposet, self).__contains__(rev) is not an option. Actually the super call doubled the benchmark result of trivial query: revisions: 0) 678f53865c68 (tip when I wrote this patch) 1) rev == node.nullrev or super(fullreposet, self).__contains__(rev) revset #0: tip:0 0) wall 0.008441 comb 0.010000 user 0.010000 sys 0.000000 (best of 282) 1) wall 0.016152 comb 0.010000 user 0.010000 sys 0.000000 (best of 146)
mercurial/revset.py
--- a/mercurial/revset.py	Sat Jan 10 14:49:50 2015 +0900
+++ b/mercurial/revset.py	Sat Jan 10 18:09:25 2015 +0900
@@ -3318,6 +3318,11 @@
     def __init__(self, repo):
         super(fullreposet, self).__init__(repo)
 
+    def __contains__(self, rev):
+        hidden = self._hiddenrevs
+        return ((self._start <= rev < self._end)
+                and not (hidden and rev in hidden))
+
     def __and__(self, other):
         """As self contains the whole repo, all of the other set should also be
         in self. Therefore `self & other = other`.