[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