[pypy-commit] pypy numpy-dtype-refactor: convert to use the new libffi support

alex_gaynor noreply at buildbot.pypy.org
Tue Nov 15 23:13:12 CET 2011


Author: Alex Gaynor <alex.gaynor at gmail.com>
Branch: numpy-dtype-refactor
Changeset: r49449:b1025f8b8ca2
Date: 2011-11-15 17:12 -0500
http://bitbucket.org/pypy/pypy/changeset/b1025f8b8ca2/

Log:	convert to use the new libffi support

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
@@ -8,8 +8,6 @@
 from pypy.rpython.lltypesystem import lltype, rffi
 
 
-STORAGE_TYPE = rffi.CArray(lltype.Char)
-
 UNSIGNEDLTR = "u"
 SIGNEDLTR = "i"
 BOOLLTR = "b"
@@ -27,7 +25,7 @@
 
     def malloc(self, length):
         # XXX find out why test_zjit explodes with tracking of allocations
-        return lltype.malloc(STORAGE_TYPE, self.itemtype.get_element_size() * length,
+        return lltype.malloc(rffi.CArray(lltype.Char), self.itemtype.get_element_size() * length,
             zero=True, flavor="raw",
             track_allocation=False, add_memory_pressure=True
         )
@@ -40,16 +38,13 @@
         return self.itemtype.coerce(space, w_item)
 
     def getitem(self, storage, i):
-        struct_ptr = rffi.ptradd(storage, i * self.itemtype.get_element_size())
-        return self.itemtype.read(struct_ptr, 0)
+        return self.itemtype.read(storage, self.itemtype.get_element_size(), i, 0)
 
     def setitem(self, storage, i, box):
-        struct_ptr = rffi.ptradd(storage, i * self.itemtype.get_element_size())
-        self.itemtype.store(struct_ptr, 0, box)
+        self.itemtype.store(storage, self.itemtype.get_element_size(), i, 0, box)
 
     def fill(self, storage, box, start, stop):
-        start_ptr = rffi.ptradd(storage, start * self.itemtype.get_element_size())
-        self.itemtype.fill(start_ptr, box, stop - start)
+        self.itemtype.fill(storage, self.itemtype.get_element_size(), box, start, stop, 0)
 
     def descr__new__(space, w_subtype, w_dtype):
         cache = get_dtype_cache(space)
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
@@ -2,7 +2,7 @@
 
 from pypy.module.micronumpy import interp_boxes
 from pypy.objspace.std.floatobject import float2string
-from pypy.rlib import rfloat
+from pypy.rlib import rfloat, libffi, clibffi
 from pypy.rlib.objectmodel import specialize
 from pypy.rlib.rarithmetic import LONG_BIT, widen
 from pypy.rpython.lltypesystem import lltype, rffi
@@ -58,22 +58,23 @@
     def _coerce(self, space, w_item):
         raise NotImplementedError
 
-    def read(self, ptr, offset):
-        ptr = rffi.ptradd(ptr, offset)
-        return self.box(
-            rffi.cast(rffi.CArrayPtr(self.T), ptr)[0]
+    def read(self, storage, width, i, offset):
+        return self.box(libffi.array_getitem(clibffi.cast_type_to_ffitype(self.T),
+            width, storage, i, offset
+        ))
+
+    def store(self, storage, width, i, offset, box):
+        value = self.unbox(box)
+        libffi.array_setitem(clibffi.cast_type_to_ffitype(self.T),
+            width, storage, i, offset, value
         )
 
-    def store(self, ptr, offset, box):
+    def fill(self, storage, width, box, start, stop, offset):
         value = self.unbox(box)
-        ptr = rffi.ptradd(ptr, offset)
-        rffi.cast(rffi.CArrayPtr(self.T), ptr)[0] = value
-
-    def fill(self, ptr, box, n):
-        value = self.unbox(box)
-        for i in xrange(n):
-            rffi.cast(rffi.CArrayPtr(self.T), ptr)[0] = value
-            ptr = rffi.ptradd(ptr, self.get_element_size())
+        for i in xrange(start, stop):
+            libffi.array_setitem(clibffi.cast_type_to_ffitype(self.T),
+                width, storage, i, offset, value
+            )
 
     @simple_binary_op
     def add(self, v1, v2):


More information about the pypy-commit mailing list