[pypy-commit] pypy online-transforms: create annotator-level expression object V_Type

rlamy noreply at buildbot.pypy.org
Thu Nov 6 18:51:06 CET 2014


Author: Ronan Lamy <ronan.lamy at gmail.com>
Branch: online-transforms
Changeset: r74356:4cd0db0438b3
Date: 2014-11-06 17:50 +0000
http://bitbucket.org/pypy/pypy/changeset/4cd0db0438b3/

Log:	create annotator-level expression object V_Type

diff --git a/rpython/annotator/expression.py b/rpython/annotator/expression.py
new file mode 100644
--- /dev/null
+++ b/rpython/annotator/expression.py
@@ -0,0 +1,14 @@
+from rpython.flowspace.model import Variable
+from rpython.flowspace.operation import op
+from rpython.annotator.model import SomeType
+
+class V_Type(Variable):
+    def __init__(self, v_obj):
+        Variable.__init__(self)
+        self.arg = v_obj
+        s = SomeType()
+        s.is_type_of = [v_obj]
+        self.annotation = s
+
+    def as_operation(self):
+        return op.type(self.arg)
diff --git a/rpython/annotator/unaryop.py b/rpython/annotator/unaryop.py
--- a/rpython/annotator/unaryop.py
+++ b/rpython/annotator/unaryop.py
@@ -17,16 +17,19 @@
 from rpython.annotator.binaryop import _clone ## XXX where to put this?
 from rpython.annotator.model import AnnotatorError
 from rpython.annotator.argument import simple_args, complex_args
+from rpython.annotator.expression import V_Type
 
 UNARY_OPERATIONS = set([oper.opname for oper in op.__dict__.values()
                         if oper.dispatch == 1])
 UNARY_OPERATIONS.remove('contains')
 
- at op.type.register(SomeObject)
-def type_SomeObject(annotator, arg):
-    r = SomeType()
-    r.is_type_of = [arg]
-    return r
+ at op.assign.register(SomeObject)
+def assign(annotator, v_obj):
+    return annotator.annotation(v_obj)
+
+ at op.type.register_transform(SomeObject)
+def type_SomeObject(annotator, v_arg):
+    return [op.assign(V_Type(v_arg))]
 
 @op.bool.register(SomeObject)
 def bool_SomeObject(annotator, obj):
diff --git a/rpython/flowspace/model.py b/rpython/flowspace/model.py
--- a/rpython/flowspace/model.py
+++ b/rpython/flowspace/model.py
@@ -578,7 +578,8 @@
                 for v in op.args:
                     assert isinstance(v, (Constant, Variable))
                     if isinstance(v, Variable):
-                        usevar(v)
+                        if type(v) is Variable:
+                            usevar(v)
                     else:
                         assert v.value is not last_exception
                         #assert v.value != last_exc_value
diff --git a/rpython/flowspace/operation.py b/rpython/flowspace/operation.py
--- a/rpython/flowspace/operation.py
+++ b/rpython/flowspace/operation.py
@@ -486,6 +486,7 @@
 add_operator('yield_', 1)
 add_operator('newslice', 3)
 add_operator('hint', None, dispatch=1)
+add_operator('assign', 1, dispatch=1)
 
 class Contains(SingleDispatchMixin, PureOperation):
     opname = 'contains'
diff --git a/rpython/translator/transform.py b/rpython/translator/transform.py
--- a/rpython/translator/transform.py
+++ b/rpython/translator/transform.py
@@ -134,6 +134,16 @@
                     s_dict = self.annotation(op.args[0])
                     s_dict.dictdef.generalize_key(self.binding(op.args[1]))
 
+def remove_assign(ann, block_subset):
+    for block in block_subset:
+        for i in range(len(block.operations)):
+            op = block.operations[i]
+            if op.opname == 'assign':
+                new_op = op.args[0].as_operation()
+                new_op.result = op.result
+                block.operations[i] = new_op
+
+
 
 def transform_dead_op_vars(self, block_subset):
     # we redo the same simplification from simplify.py,
@@ -249,6 +259,7 @@
     transform_extend_with_str_slice,
     transform_extend_with_char_count,
     transform_list_contains,
+    remove_assign,
     ]
 
 def transform_graph(ann, extra_passes=None, block_subset=None):


More information about the pypy-commit mailing list