[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