Author: Ronan Lamy <ronan.l...@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') -@op.type.register(SomeObject) -def type_SomeObject(annotator, arg): - r = SomeType() - r.is_type_of = [arg] - return r +@op.assign.register(SomeObject) +def assign(annotator, v_obj): + return annotator.annotation(v_obj) + +@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): _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit