[pypy-commit] pypy online-transforms: handle __iter__, next, __getslice__, __setslice__ with online transforms

rlamy noreply at buildbot.pypy.org
Thu Oct 16 00:29:16 CEST 2014


Author: Ronan Lamy <ronan.lamy at gmail.com>
Branch: online-transforms
Changeset: r73972:50553de4b946
Date: 2014-10-15 22:42 +0100
http://bitbucket.org/pypy/pypy/changeset/50553de4b946/

Log:	handle __iter__, next, __getslice__, __setslice__ with online
	transforms

diff --git a/rpython/annotator/unaryop.py b/rpython/annotator/unaryop.py
--- a/rpython/annotator/unaryop.py
+++ b/rpython/annotator/unaryop.py
@@ -694,23 +694,33 @@
         bk.emulate_pbc_call(bk.position_key, s_attr, args_s)
         return s_attr.call(simple_args(args_s))
 
-    def iter(self):
-        return self._emulate_call('__iter__')
-
-    def next(self):
-        return self._emulate_call('next')
-
-    def getslice(self, s_start, s_stop):
-        return self._emulate_call('__getslice__', s_start, s_stop)
-
-    def setslice(self, s_start, s_stop, s_iterable):
-        return self._emulate_call('__setslice__', s_start, s_stop, s_iterable)
-
 @op.len.register_transform(SomeInstance)
 def len_SomeInstance(annotator, v_arg):
     get_len = op.getattr(v_arg, const('__len__'))
     return [get_len, op.simple_call(get_len.result)]
 
+ at op.iter.register_transform(SomeInstance)
+def iter_SomeInstance(annotator, v_arg):
+    get_iter = op.getattr(v_arg, const('__iter__'))
+    return [get_iter, op.simple_call(get_iter.result)]
+
+ at op.next.register_transform(SomeInstance)
+def next_SomeInstance(annotator, v_arg):
+    get_next = op.getattr(v_arg, const('next'))
+    return [get_next, op.simple_call(get_next.result)]
+
+ at op.getslice.register_transform(SomeInstance)
+def getslice_SomeInstance(annotator, v_obj, v_start, v_stop):
+    get_getslice = op.getattr(v_obj, const('__getslice__'))
+    return [get_getslice, op.simple_call(get_getslice.result, v_start, v_stop)]
+
+
+ at op.setslice.register_transform(SomeInstance)
+def setslice_SomeInstance(annotator, v_obj, v_start, v_stop, v_iterable):
+    get_setslice = op.getattr(v_obj, const('__setslice__'))
+    return [get_setslice,
+            op.simple_call(get_setslice.result, v_start, v_stop, v_iterable)]
+
 
 class __extend__(SomeBuiltin):
     def call(self, args, implicit_init=False):
diff --git a/rpython/rtyper/rclass.py b/rpython/rtyper/rclass.py
--- a/rpython/rtyper/rclass.py
+++ b/rpython/rtyper/rclass.py
@@ -832,18 +832,6 @@
         hop2.args_s[0] = s_attr
         return hop2.dispatch()
 
-    def rtype_iter(self, hop):
-        return self._emulate_call(hop, '__iter__')
-
-    def rtype_next(self, hop):
-        return self._emulate_call(hop, 'next')
-
-    def rtype_getslice(self, hop):
-        return self._emulate_call(hop, "__getslice__")
-
-    def rtype_setslice(self, hop):
-        return self._emulate_call(hop, "__setslice__")
-
     def ll_str(self, i):  # doesn't work for non-gc classes!
         from rpython.rtyper.lltypesystem.ll_str import ll_int2hex
         from rpython.rlib.rarithmetic import r_uint


More information about the pypy-commit mailing list