[pypy-svn] r75745 - in pypy/branch/fast-forward/pypy: annotation translator translator/test

benjamin at codespeak.net benjamin at codespeak.net
Thu Jul 1 23:44:53 CEST 2010


Author: benjamin
Date: Thu Jul  1 23:44:51 2010
New Revision: 75745

Modified:
   pypy/branch/fast-forward/pypy/annotation/builtin.py
   pypy/branch/fast-forward/pypy/annotation/unaryop.py
   pypy/branch/fast-forward/pypy/translator/simplify.py
   pypy/branch/fast-forward/pypy/translator/test/test_simplify.py
Log:
simply rewrite the isinstance operation into a builtin call

Modified: pypy/branch/fast-forward/pypy/annotation/builtin.py
==============================================================================
--- pypy/branch/fast-forward/pypy/annotation/builtin.py	(original)
+++ pypy/branch/fast-forward/pypy/annotation/builtin.py	Thu Jul  1 23:44:51 2010
@@ -175,7 +175,17 @@
                                                    # from bool to int, notice that isinstance( , bool|int)
                                                    # is quite border case for RPython
                 r.const = False
+        # XXX HACK HACK HACK
+        # XXX HACK HACK HACK
+        # XXX HACK HACK HACK
         bk = getbookkeeper()
+        if variables is None:
+            fn, block, i = bk.position_key
+            op = block.operations[i]
+            assert op.opname == "simple_call" 
+            assert len(op.args) == 3
+            assert op.args[0] == Constant(isinstance)
+            variables = [op.args[1]]
         for variable in variables:
             assert bk.annotator.binding(variable) == s_obj
         r.knowntypedata = {}

Modified: pypy/branch/fast-forward/pypy/annotation/unaryop.py
==============================================================================
--- pypy/branch/fast-forward/pypy/annotation/unaryop.py	(original)
+++ pypy/branch/fast-forward/pypy/annotation/unaryop.py	Thu Jul  1 23:44:51 2010
@@ -23,7 +23,6 @@
 UNARY_OPERATIONS = set(['len', 'is_true', 'getattr', 'setattr', 'delattr',
                         'simple_call', 'call_args', 'str', 'repr',
                         'iter', 'next', 'invert', 'type', 'issubtype',
-                        'isinstance',
                         'pos', 'neg', 'nonzero', 'abs', 'hex', 'oct',
                         'ord', 'int', 'float', 'long',
                         'hash', 'id',    # <== not supported any more
@@ -67,13 +66,6 @@
             return immutablevalue(issubclass(obj.const, s_cls.const))
         return s_Bool
 
-    def isinstance(obj, s_cls):
-        bk = getbookkeeper()
-        fn, block, i = bk.position_key
-        op = block.operations[i]
-        v = op.args[0]
-        return builtin.builtin_isinstance(obj, s_cls, [v])
-
     def len(obj):
         return SomeInteger(nonneg=True)
 

Modified: pypy/branch/fast-forward/pypy/translator/simplify.py
==============================================================================
--- pypy/branch/fast-forward/pypy/translator/simplify.py	(original)
+++ pypy/branch/fast-forward/pypy/translator/simplify.py	Thu Jul  1 23:44:51 2010
@@ -73,6 +73,21 @@
 
 # ____________________________________________________________
 
+def desugar_isinstance(graph):
+    """Replace isinstance operation with a call to isinstance."""
+    constant_isinstance = Constant(isinstance)
+    def visit(block):
+        if not isinstance(block, Block):
+            return
+        for i in range(len(block.operations) - 1, -1, -1):
+            op = block.operations[i]
+            insert = []
+            if op.opname == "isinstance":
+                args = [constant_isinstance, op.args[0], op.args[1]]
+                new_op = SpaceOperation("simple_call", args, op.result)
+                block.operations[i] = new_op
+    traverse(visit, graph)
+
 def eliminate_empty_blocks(graph):
     """Eliminate basic blocks that do not contain any operations.
     When this happens, we need to replace the preceeding link with the
@@ -985,6 +1000,7 @@
 # ____ all passes & simplify_graph
 
 all_passes = [
+    desugar_isinstance,
     eliminate_empty_blocks,
     remove_assertion_errors,
     join_blocks,

Modified: pypy/branch/fast-forward/pypy/translator/test/test_simplify.py
==============================================================================
--- pypy/branch/fast-forward/pypy/translator/test/test_simplify.py	(original)
+++ pypy/branch/fast-forward/pypy/translator/test/test_simplify.py	Thu Jul  1 23:44:51 2010
@@ -1,8 +1,9 @@
 import py
 from pypy.translator.translator import TranslationContext, graphof
 from pypy.translator.backendopt.all import backend_optimizations
-from pypy.translator.simplify import get_graph, transform_dead_op_vars
-from pypy.objspace.flow.model import traverse, Block, summary
+from pypy.translator.simplify import (get_graph, transform_dead_op_vars,
+                                      desugar_isinstance)
+from pypy.objspace.flow.model import traverse, Block, Constant, summary
 from pypy import conftest
 
 def translate(func, argtypes, backend_optimize=True):
@@ -280,6 +281,20 @@
     e = py.test.raises(LLException, 'interp.eval_graph(graph, [])')
     assert 'ValueError' in str(e.value)
 
+def test_desugar_isinstance():
+    class X(object):
+        pass
+    def f():
+        x = X()
+        return isinstance(x, X())
+    graph = TranslationContext().buildflowgraph(f)
+    desugar_isinstance(graph)
+    assert len(graph.startblock.operations) == 3
+    block = graph.startblock
+    assert block.operations[2].opname == "simple_call"
+    assert isinstance(block.operations[2].args[0], Constant)
+    assert block.operations[2].args[0].value is isinstance
+
 class TestDetectListComprehension:
     def check(self, f1, expected):
         t = TranslationContext(list_comprehension_operations=True)



More information about the Pypy-commit mailing list