[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