##// END OF EJS Templates
typing: make the localrepo classes known to pytype...
typing: make the localrepo classes known to pytype 9d4ad05bc91c and 1b17309cdaab both mentioned making `bundlerepository` and `unionrepository` subclass `localrepository` during the type checking phase, but that didn't apply to pytype in practice. See bcaa5d408657 and friends for how the zope interfaces confuse pytype, and end up converting the classes they decorate into `Any`. This commit is slightly more complex though, because `localrepository` has mixin classes applied to it when it is instantiated. Specifically, `RevlogFileStorage` is added, which adds `def file(f)` (which isn't defined on `localrepository`). Therefore a list of `localrepository` superclasses is provided during type checking to account for the mixins. Without this, the `bundlerepository` class gets flagged when it attempts to call its superclass implementation of `file()`. Note that pytype doesn't understand these mixin superclasses (it marks the superclass of `localrepository` as `Any`, because they are zope interfaces it doesn't understand), but that's enough to get it to not flag `bundlerepository`. PyCharm also stops flagging it as a missing function, though it seems like it is able to handle the zope interfaces.

File last commit:

r52756:f4733654 default
r52788:ee7e106b default
Show More
lsprof.py
137 lines | 4.0 KiB | text/x-python | PythonLexer
Matt Harbison
typing: add `from __future__ import annotations` to most files...
r52756 from __future__ import annotations
Gregory Szorc
lsprof: support PyPy (issue4573)...
r27061 import _lsprof
Vadim Gelfer
add --lsprof option. 3x faster than --profile, more useful output....
r2422 import sys
Gregory Szorc
lsprof: support PyPy (issue4573)...
r27061
Profiler = _lsprof.Profiler
# PyPy doesn't expose profiler_entry from the module.
profiler_entry = getattr(_lsprof, 'profiler_entry', None)
Vadim Gelfer
add --lsprof option. 3x faster than --profile, more useful output....
r2422
Manuel Jacob
py3: fix type of some elements of __all__ lists
r52682 __all__ = ['profile', 'Stats']
Vadim Gelfer
add --lsprof option. 3x faster than --profile, more useful output....
r2422
Augie Fackler
formatting: blacken the codebase...
r43346
Vadim Gelfer
add --lsprof option. 3x faster than --profile, more useful output....
r2422 def profile(f, *args, **kwds):
"""XXX docstring"""
p = Profiler()
Dirkjan Ochtman
updating lsprof.py from remote repository
r5992 p.enable(subcalls=True, builtins=True)
Vadim Gelfer
add --lsprof option. 3x faster than --profile, more useful output....
r2422 try:
Dirkjan Ochtman
updating lsprof.py from remote repository
r5992 f(*args, **kwds)
Vadim Gelfer
add --lsprof option. 3x faster than --profile, more useful output....
r2422 finally:
p.disable()
Dirkjan Ochtman
updating lsprof.py from remote repository
r5992 return Stats(p.getstats())
Vadim Gelfer
add --lsprof option. 3x faster than --profile, more useful output....
r2422
Gregory Szorc
py3: use class X: instead of class X(object):...
r49801 class Stats:
Vadim Gelfer
add --lsprof option. 3x faster than --profile, more useful output....
r2422 """XXX docstring"""
def __init__(self, data):
self.data = data
Augie Fackler
cleanup: remove pointless r-prefixes on double-quoted strings...
r43809 def sort(self, crit="inlinetime"):
Vadim Gelfer
add --lsprof option. 3x faster than --profile, more useful output....
r2422 """XXX docstring"""
Gregory Szorc
lsprof: support PyPy (issue4573)...
r27061 # profiler_entries isn't defined when running under PyPy.
if profiler_entry:
if crit not in profiler_entry.__dict__:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 raise ValueError(b"Can't sort by %s" % crit)
Gregory Szorc
lsprof: support PyPy (issue4573)...
r27061 elif self.data and not getattr(self.data[0], crit, None):
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 raise ValueError(b"Can't sort by %s" % crit)
Gregory Szorc
lsprof: support PyPy (issue4573)...
r27061
Alejandro Santos
compat: use 'key' argument instead of 'cmp' when sorting a list
r9032 self.data.sort(key=lambda x: getattr(x, crit), reverse=True)
Vadim Gelfer
add --lsprof option. 3x faster than --profile, more useful output....
r2422 for e in self.data:
if e.calls:
Alejandro Santos
compat: use 'key' argument instead of 'cmp' when sorting a list
r9032 e.calls.sort(key=lambda x: getattr(x, crit), reverse=True)
Vadim Gelfer
add --lsprof option. 3x faster than --profile, more useful output....
r2422
def pprint(self, top=None, file=None, limit=None, climit=None):
"""XXX docstring"""
if file is None:
file = sys.stdout
d = self.data
if top is not None:
d = d[:top]
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 cols = b"% 12d %12d %11.4f %11.4f %s\n"
hcols = b"% 12s %12s %12s %12s %s\n"
Augie Fackler
formatting: blacken the codebase...
r43346 file.write(
hcols
% (
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b"CallCount",
b"Recursive",
b"Total(s)",
b"Inline(s)",
b"module:lineno(function)",
Augie Fackler
formatting: blacken the codebase...
r43346 )
)
Vadim Gelfer
add --lsprof option. 3x faster than --profile, more useful output....
r2422 count = 0
for e in d:
Augie Fackler
formatting: blacken the codebase...
r43346 file.write(
cols
% (
e.callcount,
e.reccallcount,
e.totaltime,
e.inlinetime,
label(e.code),
)
)
Vadim Gelfer
add --lsprof option. 3x faster than --profile, more useful output....
r2422 count += 1
if limit is not None and count == limit:
return
ccount = 0
Matt Mackall
profile: add undocumented config options for profiler output
r16263 if climit and e.calls:
Vadim Gelfer
add --lsprof option. 3x faster than --profile, more useful output....
r2422 for se in e.calls:
Augie Fackler
formatting: blacken the codebase...
r43346 file.write(
cols
% (
se.callcount,
se.reccallcount,
se.totaltime,
se.inlinetime,
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b" %s" % label(se.code),
Augie Fackler
formatting: blacken the codebase...
r43346 )
)
Vadim Gelfer
add --lsprof option. 3x faster than --profile, more useful output....
r2422 count += 1
ccount += 1
if limit is not None and count == limit:
return
if climit is not None and ccount == climit:
break
def freeze(self):
"""Replace all references to code objects with string
descriptions; this makes it possible to pickle the instance."""
# this code is probably rather ickier than it needs to be!
for i in range(len(self.data)):
e = self.data[i]
if not isinstance(e.code, str):
self.data[i] = type(e)((label(e.code),) + e[1:])
Dirkjan Ochtman
updating lsprof.py from remote repository
r5992 if e.calls:
for j in range(len(e.calls)):
se = e.calls[j]
if not isinstance(se.code, str):
e.calls[j] = type(se)((label(se.code),) + se[1:])
Vadim Gelfer
add --lsprof option. 3x faster than --profile, more useful output....
r2422
Augie Fackler
formatting: blacken the codebase...
r43346
Vadim Gelfer
add --lsprof option. 3x faster than --profile, more useful output....
r2422 _fn2mod = {}
Augie Fackler
formatting: blacken the codebase...
r43346
Vadim Gelfer
add --lsprof option. 3x faster than --profile, more useful output....
r2422 def label(code):
if isinstance(code, str):
Gregory Szorc
lsprof: remove some Python 2.7 compatibility code...
r49792 return code.encode('latin-1')
Vadim Gelfer
add --lsprof option. 3x faster than --profile, more useful output....
r2422 try:
mname = _fn2mod[code.co_filename]
except KeyError:
Gregory Szorc
global: bulk replace simple pycompat.iteritems(x) with x.items()...
r49768 for k, v in list(sys.modules.items()):
Vadim Gelfer
add --lsprof option. 3x faster than --profile, more useful output....
r2422 if v is None:
continue
Augie Fackler
lsprof: use getattr instead of hasattr
r14959 if not isinstance(getattr(v, '__file__', None), str):
Vadim Gelfer
add --lsprof option. 3x faster than --profile, more useful output....
r2422 continue
if v.__file__.startswith(code.co_filename):
mname = _fn2mod[code.co_filename] = k
break
else:
Augie Fackler
cleanup: remove pointless r-prefixes on single-quoted strings...
r43906 mname = _fn2mod[code.co_filename] = '<%s>' % code.co_filename
Gregory Szorc
py3: encode str to bytes...
r40238
Augie Fackler
cleanup: remove pointless r-prefixes on single-quoted strings...
r43906 res = '%s:%d(%s)' % (mname, code.co_firstlineno, code.co_name)
Vadim Gelfer
add --lsprof option. 3x faster than --profile, more useful output....
r2422
Gregory Szorc
lsprof: remove some Python 2.7 compatibility code...
r49792 return res.encode('latin-1')