--- a/mercurial/dirstate.py Tue May 27 14:27:41 2014 -0700
+++ b/mercurial/dirstate.py Tue May 27 21:02:16 2014 -0700
@@ -823,7 +823,18 @@
uadd(fn)
continue
- state, mode, size, time = dmap[fn]
+ # This is equivalent to 'state, mode, size, time = dmap[fn]' but not
+ # written like that for performance reasons. dmap[fn] is not a
+ # Python tuple in compiled builds. The CPython UNPACK_SEQUENCE
+ # opcode has fast paths when the value to be unpacked is a tuple or
+ # a list, but falls back to creating a full-fledged iterator in
+ # general. That is much slower than simply accessing and storing the
+ # tuple members one by one.
+ t = dmap[fn]
+ state = t[0]
+ mode = t[1]
+ size = t[2]
+ time = t[3]
if not st and state in "nma":
dadd(fn)