[pypy-commit] pypy refactor-signature: makes tests pass, they're super slow though

fijal noreply at buildbot.pypy.org
Wed Dec 14 13:32:38 CET 2011


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: refactor-signature
Changeset: r50501:a2834b804b57
Date: 2011-12-14 14:32 +0200
http://bitbucket.org/pypy/pypy/changeset/a2834b804b57/

Log:	makes tests pass, they're super slow though

diff --git a/pypy/module/micronumpy/interp_numarray.py b/pypy/module/micronumpy/interp_numarray.py
--- a/pypy/module/micronumpy/interp_numarray.py
+++ b/pypy/module/micronumpy/interp_numarray.py
@@ -7,7 +7,7 @@
 from pypy.rpython.lltypesystem import lltype, rffi
 from pypy.tool.sourcetools import func_with_new_name
 from pypy.rlib.rstring import StringBuilder
-from pypy.module.micronumpy.interp_iter import ArrayIterator
+from pypy.module.micronumpy.interp_iter import ArrayIterator, ViewIterator
 
 numpy_driver = jit.JitDriver(
     greens=['shapelen', 'sig'],
@@ -15,16 +15,19 @@
     reds=['result_size', 'frame', 'ri', 'self', 'result']
 )
 all_driver = jit.JitDriver(
-    greens=['shapelen', 'signature'],
-    reds=['i', 'self', 'dtype']
+    greens=['shapelen', 'sig'],
+    virtualizables=['frame'],
+    reds=['frame', 'self', 'dtype']
 )
 any_driver = jit.JitDriver(
-    greens=['shapelen', 'signature'],
-    reds=['i', 'self', 'dtype']
+    greens=['shapelen', 'sig'],
+    virtualizables=['frame'],
+    reds=['frame', 'self', 'dtype']
 )
 slice_driver = jit.JitDriver(
-    greens=['shapelen', 'signature'],
-    reds=['self', 'source', 'source_iter', 'res_iter']
+    greens=['shapelen', 'sig'],
+    virtualizables=['frame'],
+    reds=['self', 'frame', 'source', 'res_iter']
 )
 
 def _find_shape_and_elems(space, w_iterable):
@@ -340,15 +343,16 @@
 
     def _all(self):
         dtype = self.find_dtype()
-        i = self.start_iter()
+        sig = self.find_sig()
+        frame = sig.create_frame(self)
         shapelen = len(self.shape)
-        while not i.done():
-            all_driver.jit_merge_point(signature=self.signature,
+        while not frame.done():
+            all_driver.jit_merge_point(sig=sig,
                                        shapelen=shapelen, self=self,
-                                       dtype=dtype, i=i)
-            if not dtype.itemtype.bool(self.eval(i)):
+                                       dtype=dtype, frame=frame)
+            if not dtype.itemtype.bool(sig.eval(frame, self)):
                 return False
-            i = i.next(shapelen)
+            frame.next(shapelen)
         return True
 
     def descr_all(self, space):
@@ -356,15 +360,16 @@
 
     def _any(self):
         dtype = self.find_dtype()
-        i = self.start_iter()
+        sig = self.find_sig()
+        frame = sig.create_frame(self)
         shapelen = len(self.shape)
-        while not i.done():
-            any_driver.jit_merge_point(signature=self.signature,
+        while not frame.done():
+            any_driver.jit_merge_point(sig=sig, frame=frame,
                                        shapelen=shapelen, self=self,
-                                       dtype=dtype, i=i)
-            if dtype.itemtype.bool(self.eval(i)):
+                                       dtype=dtype)
+            if dtype.itemtype.bool(sig.eval(frame, self)):
                 return True
-            i = i.next(shapelen)
+            frame.next(shapelen)
         return False
 
     def descr_any(self, space):
@@ -950,6 +955,10 @@
     def __init__(self, parent, start, strides, backstrides, shape):
         if isinstance(parent, W_NDimSlice):
             parent = parent.parent
+        else:
+            # XXX this should not force the array, but it did before the
+            #     refactoring anyway, just in a more obscure way
+            parent = parent.get_concrete()
         ViewArray.__init__(self, parent, strides, backstrides, shape)
         self.start = start
         self.size = 1
@@ -967,18 +976,19 @@
         self._sliceloop(w_value, res_shape)
 
     def _sliceloop(self, source, res_shape):
-        source_iter = source.start_iter(res_shape)
-        res_iter = self.start_iter(res_shape)
+        sig = source.find_sig()
+        frame = sig.create_frame(source)
+        res_iter = ViewIterator(self)
         shapelen = len(res_shape)
         while not res_iter.done():
-            slice_driver.jit_merge_point(signature=source.signature,
+            slice_driver.jit_merge_point(sig=sig,
+                                         frame=frame,
                                          shapelen=shapelen,
                                          self=self, source=source,
-                                         res_iter=res_iter,
-                                         source_iter=source_iter)
-            self.setitem(res_iter.offset, source.eval(source_iter).convert_to(
+                                         res_iter=res_iter)
+            self.setitem(res_iter.offset, sig.eval(frame, source).convert_to(
                 self.find_dtype()))
-            source_iter = source_iter.next(shapelen)
+            frame.next(shapelen)
             res_iter = res_iter.next(shapelen)
 
     def setitem(self, item, value):
@@ -986,8 +996,8 @@
 
     def copy(self):
         array = W_NDimArray(self.size, self.shape[:], self.find_dtype())
-        iter = self.start_iter()
-        a_iter = array.start_iter()
+        iter = ViewIterator(self)
+        a_iter = ArrayIterator(array.size)
         while not iter.done():
             array.setitem(a_iter.offset, self.getitem(iter.offset))
             iter = iter.next(len(self.shape))
diff --git a/pypy/module/micronumpy/signature.py b/pypy/module/micronumpy/signature.py
--- a/pypy/module/micronumpy/signature.py
+++ b/pypy/module/micronumpy/signature.py
@@ -35,7 +35,7 @@
         return sig
 
 class NumpyEvalFrame(object):
-    _virtualizable2_ = ['iterators[*]']
+    _virtualizable2_ = ['iterators[*]', 'final_iter']
 
     def __init__(self, iterators):
         self = hint(self, access_directly=True)
@@ -131,6 +131,10 @@
             iter = ViewIterator(arr)
             iterlist.append(iter)
 
+    def eval(self, frame, arr):
+        iter = frame.iterators[self.iter_no]
+        return arr.find_dtype().getitem(arr.parent.storage, iter.offset)
+
 class FlatiterSignature(ViewSignature):
     def debug_repr(self):
         return 'FlatIter(%s)' % self.child.debug_repr()
@@ -156,7 +160,7 @@
                                   self.child.debug_repr())
 
     def _invent_numbering(self, cache):
-        self.values._invent_numbering(cache)
+        self.child._invent_numbering(cache)
 
     def _create_iter(self, iterlist, arr, res_shape):
         self.child._create_iter(iterlist, arr.values, res_shape)


More information about the pypy-commit mailing list