[pypy-commit] pypy ffi-backend: make numpy work with raw_load/raw_store

fijal noreply at buildbot.pypy.org
Sun Jul 8 14:29:22 CEST 2012


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: ffi-backend
Changeset: r55987:da66ea0c6743
Date: 2012-07-08 14:29 +0200
http://bitbucket.org/pypy/pypy/changeset/da66ea0c6743/

Log:	make numpy work with raw_load/raw_store

diff --git a/pypy/module/micronumpy/interp_boxes.py b/pypy/module/micronumpy/interp_boxes.py
--- a/pypy/module/micronumpy/interp_boxes.py
+++ b/pypy/module/micronumpy/interp_boxes.py
@@ -229,7 +229,7 @@
         except KeyError:
             raise OperationError(space.w_IndexError,
                                  space.wrap("Field %s does not exist" % item))
-        return dtype.itemtype.read(self.arr, 1, self.ofs, ofs, dtype)
+        return dtype.itemtype.read(self.arr, self.ofs, ofs, dtype)
 
     @unwrap_spec(item=str)
     def descr_setitem(self, space, item, w_value):
@@ -238,7 +238,7 @@
         except KeyError:
             raise OperationError(space.w_IndexError,
                                  space.wrap("Field %s does not exist" % item))
-        dtype.itemtype.store(self.arr, 1, self.ofs, ofs,
+        dtype.itemtype.store(self.arr, self.ofs, ofs,
                              dtype.coerce(space, w_value))
 
 class W_CharacterBox(W_FlexibleBox):
diff --git a/pypy/module/micronumpy/interp_dtype.py b/pypy/module/micronumpy/interp_dtype.py
--- a/pypy/module/micronumpy/interp_dtype.py
+++ b/pypy/module/micronumpy/interp_dtype.py
@@ -44,13 +44,13 @@
         return self.itemtype.coerce(space, self, w_item)
 
     def getitem(self, arr, i):
-        return self.itemtype.read(arr, 1, i, 0)
+        return self.itemtype.read(arr, i, 0)
 
     def getitem_bool(self, arr, i):
-        return self.itemtype.read_bool(arr, 1, i, 0)
+        return self.itemtype.read_bool(arr, i, 0)
 
     def setitem(self, arr, i, box):
-        self.itemtype.store(arr, 1, i, 0, box)
+        self.itemtype.store(arr, i, 0, box)
 
     def fill(self, storage, box, start, stop):
         self.itemtype.fill(storage, self.get_size(), box, start, stop, 0)
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
@@ -13,11 +13,11 @@
     find_shape_and_elems, get_shape_from_iterable, calc_new_strides, to_coords)
 from pypy.rlib import jit
 from pypy.rlib.rstring import StringBuilder
+from pypy.rlib.rawstorage import free_raw_storage
 from pypy.rpython.lltypesystem import lltype, rffi
 from pypy.tool.sourcetools import func_with_new_name
 from pypy.module.micronumpy.interp_support import unwrap_axis_arg
 
-
 count_driver = jit.JitDriver(
     greens=['shapelen'],
     virtualizables=['frame'],
@@ -1204,7 +1204,7 @@
         return signature.ArraySignature(self.dtype)
 
     def __del__(self):
-        lltype.free(self.storage, flavor='raw', track_allocation=False)
+        free_raw_storage(self.storage, track_allocation=False)
 
 def _find_shape(space, w_size):
     if space.isinstance_w(w_size, space.w_int):
diff --git a/pypy/module/micronumpy/types.py b/pypy/module/micronumpy/types.py
--- a/pypy/module/micronumpy/types.py
+++ b/pypy/module/micronumpy/types.py
@@ -5,7 +5,9 @@
 from pypy.interpreter.error import OperationError
 from pypy.module.micronumpy import interp_boxes
 from pypy.objspace.std.floatobject import float2string
-from pypy.rlib import rfloat, libffi, clibffi
+from pypy.rlib import rfloat, clibffi
+from pypy.rlib.rawstorage import (alloc_raw_storage, raw_storage_setitem,
+                                  raw_storage_getitem)
 from pypy.rlib.objectmodel import specialize, we_are_translated
 from pypy.rlib.rarithmetic import widen, byteswap
 from pypy.rpython.lltypesystem import lltype, rffi
@@ -14,8 +16,6 @@
 from pypy.rlib import jit
 
 
-VOID_STORAGE = lltype.Array(lltype.Char, hints={'nolength': True,
-                                                'render_as_void': True})
 degToRad = math.pi / 180.0
 log2 = math.log(2)
 log2e = 1. / log2
@@ -73,10 +73,7 @@
         raise NotImplementedError
 
     def malloc(self, size):
-        # XXX find out why test_zjit explodes with tracking of allocations
-        return lltype.malloc(VOID_STORAGE, size,
-                             zero=True, flavor="raw",
-                             track_allocation=False, add_memory_pressure=True)
+        return alloc_raw_storage(size, track_allocation=False, zero=True)
 
     def __repr__(self):
         return self.__class__.__name__
@@ -116,34 +113,25 @@
     def default_fromstring(self, space):
         raise NotImplementedError
 
-    def _read(self, storage, width, i, offset):
-        if we_are_translated():
-            return libffi.array_getitem(clibffi.cast_type_to_ffitype(self.T),
-                                        width, storage, i, offset)
-        else:
-            return libffi.array_getitem_T(self.T, width, storage, i, offset)
+    def _read(self, storage, i, offset):
+        return raw_storage_getitem(self.T, storage, i + offset)
 
-    def read(self, arr, width, i, offset, dtype=None):
-        return self.box(self._read(arr.storage, width, i, offset))
+    def read(self, arr, i, offset, dtype=None):
+        return self.box(self._read(arr.storage, i, offset))
 
-    def read_bool(self, arr, width, i, offset):
-        return bool(self.for_computation(self._read(arr.storage, width, i, offset)))
+    def read_bool(self, arr, i, offset):
+        return bool(self.for_computation(self._read(arr.storage, i, offset)))
 
-    def _write(self, storage, width, i, offset, value):
-        if we_are_translated():
-            libffi.array_setitem(clibffi.cast_type_to_ffitype(self.T),
-                                 width, storage, i, offset, value)
-        else:
-            libffi.array_setitem_T(self.T, width, storage, i, offset, value)
+    def _write(self, storage, i, offset, value):
+        raw_storage_setitem(storage, i + offset, value)
 
-
-    def store(self, arr, width, i, offset, box):
-        self._write(arr.storage, width, i, offset, self.unbox(box))
+    def store(self, arr, i, offset, box):
+        self._write(arr.storage, i, offset, self.unbox(box))
 
     def fill(self, storage, width, box, start, stop, offset):
         value = self.unbox(box)
         for i in xrange(start, stop, width):
-            self._write(storage, 1, i, offset, value)
+            self._write(storage, i, offset, value)
 
     def runpack_str(self, s):
         return self.box(runpack(self.format_code, s))
@@ -245,21 +233,13 @@
 class NonNativePrimitive(Primitive):
     _mixin_ = True
 
-    def _read(self, storage, width, i, offset):
-        if we_are_translated():
-            res = libffi.array_getitem(clibffi.cast_type_to_ffitype(self.T),
-                                        width, storage, i, offset)
-        else:
-            res = libffi.array_getitem_T(self.T, width, storage, i, offset)
+    def _read(self, storage, i, offset):
+        res = raw_storage_getitem(self.T, storage, i + offset)
         return byteswap(res)
 
-    def _write(self, storage, width, i, offset, value):
+    def _write(self, storage, i, offset, value):
         value = byteswap(value)
-        if we_are_translated():
-            libffi.array_setitem(clibffi.cast_type_to_ffitype(self.T),
-                                 width, storage, i, offset, value)
-        else:
-            libffi.array_setitem_T(self.T, width, storage, i, offset, value)
+        raw_storage_setitem(storage, i + offset, value)
 
     def pack_str(self, box):
         return struct.pack(self.format_code, byteswap(self.unbox(box)))
@@ -868,22 +848,14 @@
 class NonNativeFloat(NonNativePrimitive, Float):
     _mixin_ = True
 
-    def _read(self, storage, width, i, offset):
-        if we_are_translated():
-            res = libffi.array_getitem(clibffi.cast_type_to_ffitype(self.T),
-                                        width, storage, i, offset)
-        else:
-            res = libffi.array_getitem_T(self.T, width, storage, i, offset)
-        #return byteswap(res)
+    def _read(self, storage, i, offset):
+        res = raw_storage_getitem(self.T, storage, i + offset)
+        #return byteswap(res) XXX
         return res
 
-    def _write(self, storage, width, i, offset, value):
+    def _write(self, storage, i, offset, value):
         #value = byteswap(value) XXX
-        if we_are_translated():
-            libffi.array_setitem(clibffi.cast_type_to_ffitype(self.T),
-                                 width, storage, i, offset, value)
-        else:
-            libffi.array_setitem_T(self.T, width, storage, i, offset, value)
+        raw_storage_setitem(storage, i + offset, value)
 
     def pack_str(self, box):
         # XXX byteswap
@@ -952,7 +924,7 @@
     def get_element_size(self):
         return self.size
 
-    def read(self, arr, width, i, offset, dtype=None):
+    def read(self, arr, i, offset, dtype=None):
         if dtype is None:
             dtype = arr.dtype
         return interp_boxes.W_VoidBox(arr, i + offset, dtype)
@@ -980,11 +952,11 @@
             ofs, itemtype = self.offsets_and_fields[i]
             w_item = items_w[i]
             w_box = itemtype.coerce(space, subdtype, w_item)
-            itemtype.store(arr, 1, 0, ofs, w_box)
+            itemtype.store(arr, 0, ofs, w_box)
         return interp_boxes.W_VoidBox(arr, 0, arr.dtype)
 
     @jit.unroll_safe
-    def store(self, arr, _, i, ofs, box):
+    def store(self, arr, i, ofs, box):
         assert isinstance(box, interp_boxes.W_VoidBox)
         for k in range(self.get_element_size()):
             arr.storage[k + i] = box.arr.storage[k + box.ofs]
@@ -999,7 +971,7 @@
                 first = False
             else:
                 pieces.append(", ")
-            pieces.append(tp.str_format(tp.read(box.arr, 1, box.ofs, ofs)))
+            pieces.append(tp.str_format(tp.read(box.arr, box.ofs, ofs)))
         pieces.append(")")
         return "".join(pieces)
 
diff --git a/pypy/rlib/rawstorage.py b/pypy/rlib/rawstorage.py
--- a/pypy/rlib/rawstorage.py
+++ b/pypy/rlib/rawstorage.py
@@ -7,8 +7,11 @@
 RAW_STORAGE = rffi.CCHARP.TO
 RAW_STORAGE_PTR = rffi.CCHARP
 
-def alloc_raw_storage(size):
-    return lltype.malloc(RAW_STORAGE, size, flavor='raw')
+def alloc_raw_storage(size, track_allocation=True, zero=False):
+    return lltype.malloc(RAW_STORAGE, size, flavor='raw',
+                         add_memory_pressure=True,
+                         track_allocation=track_allocation,
+                         zero=zero)
 
 def raw_storage_getitem(TP, storage, index):
     "NOT_RPYTHON"
@@ -19,8 +22,8 @@
     TP = rffi.CArrayPtr(lltype.typeOf(item))
     rffi.cast(TP, rffi.ptradd(storage, index))[0] = item
 
-def free_raw_storage(storage):
-    lltype.free(storage, flavor='raw')
+def free_raw_storage(storage, track_allocation=True):
+    lltype.free(storage, flavor='raw', track_allocation=track_allocation)
 
 class RawStorageGetitemEntry(ExtRegistryEntry):
     _about_ = raw_storage_getitem


More information about the pypy-commit mailing list