[pypy-commit] pypy online-transforms: Start work on performing annotation-dependent graph transformations
rlamy
noreply at buildbot.pypy.org
Wed Oct 15 21:46:43 CEST 2014
Author: Ronan Lamy <ronan.lamy at gmail.com>
Branch: online-transforms
Changeset: r73969:c4383641f74f
Date: 2014-10-15 20:46 +0100
http://bitbucket.org/pypy/pypy/changeset/c4383641f74f/
Log: Start work on performing annotation-dependent graph transformations
during the annotation phase.
diff --git a/rpython/annotator/annrpython.py b/rpython/annotator/annrpython.py
--- a/rpython/annotator/annrpython.py
+++ b/rpython/annotator/annrpython.py
@@ -399,12 +399,22 @@
def flowin(self, graph, block):
try:
- for i, op in enumerate(block.operations):
+ i = 0
+ while i < len(block.operations):
+ op = block.operations[i]
self.bookkeeper.enter((graph, block, i))
try:
+ new_ops = op.transform(self)
+ if new_ops is not None:
+ block.operations[i:i+1] = new_ops
+ if not new_ops:
+ continue
+ new_ops[-1].result = op.result
+ op = new_ops[0]
self.consider_op(op)
finally:
self.bookkeeper.leave()
+ i += 1
except BlockedInference as e:
if (e.op is block.operations[-1] and
diff --git a/rpython/annotator/unaryop.py b/rpython/annotator/unaryop.py
--- a/rpython/annotator/unaryop.py
+++ b/rpython/annotator/unaryop.py
@@ -699,9 +699,6 @@
def next(self):
return self._emulate_call('next')
- def len(self):
- return self._emulate_call('__len__')
-
def getslice(self, s_start, s_stop):
return self._emulate_call('__getslice__', s_start, s_stop)
diff --git a/rpython/flowspace/operation.py b/rpython/flowspace/operation.py
--- a/rpython/flowspace/operation.py
+++ b/rpython/flowspace/operation.py
@@ -104,6 +104,9 @@
def get_can_only_throw(self, annotator):
return None
+ def transform(self, annotator):
+ pass
+
class PureOperation(HLOperation):
pure = True
@@ -603,6 +606,15 @@
return ArgumentsForTranslation.fromshape(args_s[0].const,
list(args_s[1:]))
+def transform_len(hlop, annotator):
+ from rpython.annotator.model import SomeInstance
+ s_arg = annotator.annotation(hlop.args[0])
+ if isinstance(s_arg, SomeInstance):
+ get_len = op.getattr(hlop.args[0], const('__len__'))
+ return [get_len, op.simple_call(get_len.result)]
+
+op.len.transform = transform_len
+
# Other functions that get directly translated to SpaceOperators
func2op[type] = op.type
More information about the pypy-commit
mailing list