Author: Maciej Fijalkowski <fij...@gmail.com> Branch: Changeset: r63914:01814fcfecd2 Date: 2013-05-08 17:34 +0200 http://bitbucket.org/pypy/pypy/changeset/01814fcfecd2/
Log: merge diff --git a/rpython/memory/gctransform/framework.py b/rpython/memory/gctransform/framework.py --- a/rpython/memory/gctransform/framework.py +++ b/rpython/memory/gctransform/framework.py @@ -30,14 +30,14 @@ return False if getattr(func, '_gctransformer_hint_close_stack_', False): return True - return graphanalyze.GraphAnalyzer.analyze_direct_call(self, graph, - seen) + return graphanalyze.BoolGraphAnalyzer.analyze_direct_call(self, graph, + seen) def analyze_external_call(self, op, seen=None): funcobj = op.args[0].value._obj if getattr(funcobj, 'random_effects_on_gcobjs', False): return True - return graphanalyze.GraphAnalyzer.analyze_external_call(self, op, - seen) + return graphanalyze.BoolGraphAnalyzer.analyze_external_call(self, op, + seen) def analyze_simple_operation(self, op, graphinfo): if op.opname in ('malloc', 'malloc_varsize'): flags = op.args[1].value diff --git a/rpython/translator/backendopt/test/test_graphanalyze.py b/rpython/translator/backendopt/test/test_graphanalyze.py new file mode 100644 --- /dev/null +++ b/rpython/translator/backendopt/test/test_graphanalyze.py @@ -0,0 +1,51 @@ +import random +from rpython.tool.algo.unionfind import UnionFind +from rpython.translator.backendopt.graphanalyze import Dependency +from rpython.translator.backendopt.graphanalyze import DependencyTracker + + +class FakeGraphAnalyzer: + def __init__(self): + self._analyzed_calls = UnionFind(lambda graph: Dependency(self)) + + @staticmethod + def bottom_result(): + return 0 + + @staticmethod + def join_two_results(result1, result2): + return result1 | result2 + + +def test_random_graphs(): + for _ in range(100): + N = 10 + edges = [(random.randrange(N), random.randrange(N)) + for i in range(N*N//3)] + + def expected(node1): + prev = set() + seen = set([node1]) + while len(seen) > len(prev): + prev = set(seen) + for a, b in edges: + if a in seen: + seen.add(b) + return sum([1 << n for n in seen]) + + def rectrack(n, tracker): + if not tracker.enter(n): + return tracker.get_cached_result(n) + result = 1 << n + for a, b in edges: + if a == n: + result |= rectrack(b, tracker) + tracker.leave_with(result) + return result + + analyzer = FakeGraphAnalyzer() + for n in range(N): + tracker = DependencyTracker(analyzer) + method1 = rectrack(n, tracker) + method2 = expected(n) + assert method1 == method2 _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit