Author: Remi Meier <[email protected]>
Branch: stmgc-c4
Changeset: r66397:a47c7b9b052e
Date: 2013-08-28 16:31 +0200
http://bitbucket.org/pypy/pypy/changeset/a47c7b9b052e/
Log: add support for instantiate_call to rgc.no_release_gil
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
@@ -59,8 +59,9 @@
if getattr(func, '_transaction_break_', False):
return True
- return graphanalyze.BoolGraphAnalyzer.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, 'transactionsafe', False):
@@ -68,6 +69,9 @@
else:
return False
+ def analyze_instantiate_call(self, seen=None):
+ return False
+
def analyze_simple_operation(self, op, graphinfo):
return False
diff --git a/rpython/memory/gctransform/test/test_framework.py
b/rpython/memory/gctransform/test/test_framework.py
--- a/rpython/memory/gctransform/test/test_framework.py
+++ b/rpython/memory/gctransform/test/test_framework.py
@@ -112,7 +112,22 @@
releases = (ths == 'auto' and not sbxs) or ths is True
assert releases == GilAnalyzer(t).analyze_direct_call(gg)
- return
+
+def test_canrelease_instantiate():
+ class O:
+ pass
+ class A(O):
+ pass
+ class B(O):
+ pass
+
+ classes = [A, B]
+ def g(i):
+ classes[i]()
+
+ t = rtype(g, [int])
+ gg = graphof(t, g)
+ assert not GilAnalyzer(t).analyze_direct_call(gg)
def test_no_collect(gc="minimark"):
diff --git a/rpython/translator/backendopt/graphanalyze.py
b/rpython/translator/backendopt/graphanalyze.py
--- a/rpython/translator/backendopt/graphanalyze.py
+++ b/rpython/translator/backendopt/graphanalyze.py
@@ -1,6 +1,6 @@
from rpython.translator.simplify import get_graph, get_funcobj
from rpython.tool.algo.unionfind import UnionFind
-from rpython.rtyper.lltypesystem import lltype
+from rpython.rtyper.lltypesystem import lltype, rclass
class GraphAnalyzer(object):
@@ -64,6 +64,9 @@
result, self.analyze_direct_call(graph, seen))
return result
+ def analyze_instantiate_call(self, seen=None):
+ return self.top_result()
+
def analyze_external_method(self, op, TYPE, meth):
return self.top_result()
@@ -75,7 +78,7 @@
def compute_graph_info(self, graph):
return None
- def analyze(self, op, seen=None, graphinfo=None):
+ def analyze(self, op, seen=None, graphinfo=None, block=None):
if op.opname == "direct_call":
try:
graph = get_graph(op.args[0], self.translator)
@@ -96,6 +99,18 @@
elif op.opname == "indirect_call":
graphs = op.args[-1].value
if graphs is None:
+ if block is not None:
+ v_func = op.args[0]
+ for op1 in block.operations:
+ if (v_func is op1.result and
+ op1.opname == 'getfield' and
+ op1.args[0].concretetype == rclass.CLASSTYPE and
+ op1.args[1].value == 'instantiate'):
+ x = self.analyze_instantiate_call(seen)
+ if self.verbose and x:
+ self.dump_info('analyze_instantiate(%s): %r' %
(
+ graphs, x))
+ return x
if self.verbose:
self.dump_info('%s to unknown' % (op,))
return self.top_result()
@@ -141,7 +156,7 @@
for op in block.operations:
result = self.add_to_result(
result,
- self.analyze(op, seen, graphinfo)
+ self.analyze(op, seen, graphinfo, block=block)
)
if self.is_top_result(result):
break
@@ -179,7 +194,7 @@
graphs = self.translator.graphs
for graph in graphs:
for block, op in graph.iterblockops():
- self.analyze(op)
+ self.analyze(op, block=block)
class Dependency(object):
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit