[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