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

Reply via email to