Author: Ronan Lamy <ronan.l...@gmail.com> Branch: py3.6 Changeset: r97128:5dc520fcc4f9 Date: 2019-08-09 17:31 +0100 http://bitbucket.org/pypy/pypy/changeset/5dc520fcc4f9/
Log: hg merge default diff --git a/pypy/module/_lsprof/test/test_cprofile.py b/pypy/module/_lsprof/test/test_cprofile.py --- a/pypy/module/_lsprof/test/test_cprofile.py +++ b/pypy/module/_lsprof/test/test_cprofile.py @@ -4,7 +4,6 @@ } def setup_class(cls): - cls.w_expected_output = cls.space.wrap(expected_output) cls.w_file = cls.space.wrap(__file__) def test_repr(self): @@ -167,152 +166,3 @@ prof.disable() stats = prof.getstats() assert len(stats) == 2 - - def test_use_cprofile(self): - import sys, os - # XXX this is evil trickery to walk around the fact that we don't - # have __file__ at app-level here - sys.path.insert(0, os.path.dirname(self.file)) - try: - import re - from cProfile import Profile - from profilee import testfunc, timer - - methodnames = ['print_stats', 'print_callers', 'print_callees'] - - def do_profiling(cls): - results = [] - prof = cls(timer, 0.001) - start_timer = timer() - prof.runctx("testfunc()", {'testfunc':testfunc}, locals()) - results.append(timer() - start_timer) - for methodname in methodnames: - import pstats - from io import StringIO - s = StringIO() - stats = pstats.Stats(prof, stream=s) - stats.strip_dirs().sort_stats("stdname") - getattr(stats, methodname)() - results.append(s.getvalue()) - return results, prof - - res, prof = do_profiling(Profile) - assert res[0] == 1000 - for i, method in enumerate(methodnames): - got = res[i + 1] - expected = self.expected_output[method] - patterns = expected.splitlines() - lines = set(got.splitlines()) - lines.remove('') # ignore blank lines - for pattern in patterns: - if not pattern: - continue # ignore blank lines - pattern = pattern.replace('(', '\\(') - pattern = pattern.replace(')', '\\)') - pattern = pattern.replace('?', '\\?') - pattern = pattern.replace(r'\\?', '?') - pattern = pattern.replace(r'\\(', '(') - pattern = pattern.replace(r'\\)', ')') - repattern = re.compile('^' + pattern + '$') - for line in lines: - if repattern.match(line): - lines.remove(line) - break - else: - print('NOT FOUND: %s' % pattern.rstrip('\n')) - print('--- GOT ---') - print(got) - print('') - print('--- EXPECTED ---') - print(expected) - assert False - assert not lines - finally: - sys.path.pop(0) - - -expected_output = {} -expected_output['print_stats'] = """\ - 119 function calls (99 primitive calls) in 1.000 seconds - - Ordered by: standard name - - ncalls tottime percall cumtime percall filename:lineno(function) - 1 0.000 0.000 1.000 1.000 <string>:1(<module>) - 28 0.028 0.001 0.028 0.001 profilee.py:110(__getattr__) - 1 0.270 0.270 1.000 1.000 profilee.py:25(testfunc) - 23/3 0.150 0.007 0.170 0.057 profilee.py:35(factorial) - 20 0.020 0.001 0.020 0.001 profilee.py:48(mul) - 2 0.040 0.020 0.600 0.300 profilee.py:55(helper) - 4 0.116 0.029 0.120 0.030 profilee.py:73(helper1) - 2 0.000 0.000 0.140 0.070 profilee.py:84(helper2_indirect) - 8 0.312 0.039 0.400 0.050 profilee.py:88(helper2) - 8 0.064 0.008 0.080 0.010 profilee.py:98(subhelper) - 1 0.000 0.000 1.000 1.000 {built-in function exec} - 12 0.000 0.000 0.012 0.001 {built-in function hasattr} - 4 0.000 0.000 0.000 0.000 {built-in function sys.exc_info} - 4 0.000 0.000 0.000 0.000 {method 'append' of 'list' objects} - 1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects} - - -""" - -expected_output['print_callers'] = """\ - Ordered by: standard name - -Function was called by... - ncalls tottime cumtime -<string>:1(<module>) <- 1 0.000 1.000 {built-in function exec} -profilee.py:110(__getattr__) <- 16 0.016 0.016 profilee.py:98(subhelper) - 12 0.012 0.012 {built-in function hasattr} -profilee.py:25(testfunc) <- 1 0.270 1.000 <string>:1(<module>) -profilee.py:35(factorial) <- 1 0.014 0.130 profilee.py:25(testfunc) - 20/3 0.130 0.147 profilee.py:35(factorial) - 2 0.006 0.040 profilee.py:84(helper2_indirect) -profilee.py:48(mul) <- 20 0.020 0.020 profilee.py:35(factorial) -profilee.py:55(helper) <- 2 0.040 0.600 profilee.py:25(testfunc) -profilee.py:73(helper1) <- 4 0.116 0.120 profilee.py:55(helper) -profilee.py:84(helper2_indirect) <- 2 0.000 0.140 profilee.py:55(helper) -profilee.py:88(helper2) <- 6 0.234 0.300 profilee.py:55(helper) - 2 0.078 0.100 profilee.py:84(helper2_indirect) -profilee.py:98(subhelper) <- 8 0.064 0.080 profilee.py:88(helper2) -{built-in function exec} <- -{built-in function hasattr} <- 4 0.000 0.004 profilee.py:73(helper1) - 8 0.000 0.008 profilee.py:88(helper2) -{method 'append' of 'list' objects} <- 4 0.000 0.000 profilee.py:73(helper1) -{method 'disable' of '_lsprof.Profiler' objects} <- -{built-in function sys.exc_info} <- 4 0.000 0.000 profilee.py:73(helper1) - - -""" -expected_output['print_callees'] = """\ - Ordered by: standard name - -Function called... - ncalls tottime cumtime -<string>:1(<module>) -> 1 0.270 1.000 profilee.py:25(testfunc) -profilee.py:110(__getattr__) -> -profilee.py:25(testfunc) -> 1 0.014 0.130 profilee.py:35(factorial) - 2 0.040 0.600 profilee.py:55(helper) -profilee.py:35(factorial) -> 20/3 0.130 0.147 profilee.py:35(factorial) - 20 0.020 0.020 profilee.py:48(mul) -profilee.py:48(mul) -> -profilee.py:55(helper) -> 4 0.116 0.120 profilee.py:73(helper1) - 2 0.000 0.140 profilee.py:84(helper2_indirect) - 6 0.234 0.300 profilee.py:88(helper2) -profilee.py:73(helper1) -> 4 0.000 0.004 {built-in function hasattr} - 4 0.000 0.000 {method 'append' of 'list' objects} - 4 0.000 0.000 {built-in function sys.exc_info} -profilee.py:84(helper2_indirect) -> 2 0.006 0.040 profilee.py:35(factorial) - 2 0.078 0.100 profilee.py:88(helper2) -profilee.py:88(helper2) -> 8 0.064 0.080 profilee.py:98(subhelper) - 8 0.000 0.008 {built-in function hasattr} -profilee.py:98(subhelper) -> 16 0.016 0.016 profilee.py:110(__getattr__) -{built-in function exec} -> 1 0.000 1.000 <string>:1(<module>) -{built-in function hasattr} -> 12 0.012 0.012 profilee.py:110(__getattr__) -{method 'append' of 'list' objects} -> -{method 'disable' of '_lsprof.Profiler' objects} -> -{built-in function sys.exc_info} -> - - -""" diff --git a/pypy/objspace/std/test/test_methodcache.py b/pypy/objspace/std/test/test_methodcache.py --- a/pypy/objspace/std/test/test_methodcache.py +++ b/pypy/objspace/std/test/test_methodcache.py @@ -47,52 +47,6 @@ assert cache_counter[1] >= 3 # should be (27, 3) assert sum(cache_counter) == 30 - def test_change_methods(self): - # this test fails because of the following line in typeobject.py:427 - # if cached_name is name: - - # in py3k, identifiers are stored in W_UnicodeObject and unwrapped by - # calling space.text_w, which .encode('ascii') the string, thus - # creating new strings all the time. The problem should be solved when - # we implement proper unicode identifiers in py3k - @self.retry - def run(): - import __pypy__ - class A(object): - def f(self): - return 42 - l = [A()] * 10 - __pypy__.reset_method_cache_counter() - for i, a in enumerate(l): - assert a.f() == 42 + i - A.f = eval("lambda self: %s" % (42 + i + 1, )) - cache_counter = __pypy__.method_cache_counter("f") - # - # a bit of explanation about what's going on. (1) is the line "a.f()" - # and (2) is "A.f = ...". - # - # at line (1) we do the lookup on type(a).f - # - # at line (2) we do a setattr on A. However, descr_setattr does also a - # lookup of type(A).f i.e. type.f, to check if by chance 'f' is a data - # descriptor. - # - # At the first iteration: - # (1) is a miss because it's the first lookup of A.f. The result is cached - # - # (2) is a miss because it is the first lookup of type.f. The - # (non-existant) result is cached. The version of A changes, and 'f' - # is changed to be a cell object, so that subsequest assignments won't - # change the version of A - # - # At the second iteration: - # (1) is a miss because the version of A changed just before - # (2) is a hit, because type.f is cached. The version of A no longer changes - # - # At the third and subsequent iterations: - # (1) is a hit, because the version of A did not change - # (2) is a hit, see above - assert cache_counter == (17, 3) def test_subclasses(self): @self.retry _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit