[pypy-commit] pypy default: merge

fijal noreply at buildbot.pypy.org
Wed May 8 17:35:57 CEST 2013


Author: Maciej Fijalkowski <fijall at 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


More information about the pypy-commit mailing list