Author: Matti Picus <[email protected]>
Branch: issue2444
Changeset: r89235:a456561d0a22
Date: 2016-12-26 19:20 +0200
http://bitbucket.org/pypy/pypy/changeset/a456561d0a22/
Log: merge heads
diff --git a/pypy/module/cpyext/api.py b/pypy/module/cpyext/api.py
--- a/pypy/module/cpyext/api.py
+++ b/pypy/module/cpyext/api.py
@@ -630,25 +630,27 @@
PyVarObjectStruct = cpython_struct("PyVarObject", PyVarObjectFields)
PyVarObject = lltype.Ptr(PyVarObjectStruct)
-Py_buffer = cpython_struct(
- "Py_buffer", (
+Py_buffer = rffi.CStruct( "Py_buffer",
('buf', rffi.VOIDP),
('obj', PyObject),
('len', Py_ssize_t),
('itemsize', Py_ssize_t),
- ('readonly', lltype.Signed),
- ('ndim', lltype.Signed),
+ ('readonly', rffi.INT_real),
+ ('ndim', rffi.INT_real),
('format', rffi.CCHARP),
('shape', Py_ssize_tP),
('strides', Py_ssize_tP),
+ ('suboffsets', Py_ssize_tP),
('_format', rffi.CFixedArray(rffi.UCHAR, Py_MAX_FMT)),
('_shape', rffi.CFixedArray(Py_ssize_t, Py_MAX_NDIMS)),
('_strides', rffi.CFixedArray(Py_ssize_t, Py_MAX_NDIMS)),
- ('suboffsets', Py_ssize_tP),
#('smalltable', rffi.CFixedArray(Py_ssize_t, 2)),
- ('internal', rffi.VOIDP)
- ))
+ ('internal', rffi.VOIDP),
+ hints={'size': 6 * rffi.sizeof(Py_ssize_tP) + 2 *
rffi.sizeof(Py_ssize_t) +
+ 2 * rffi.sizeof(rffi.INT_real) +
rffi.sizeof(rffi.CCHARP) +
+ Py_MAX_FMT * rffi.sizeof(rffi.UCHAR) +
+ 2 * Py_MAX_NDIMS * rffi.sizeof(Py_ssize_t)})
Py_bufferP = lltype.Ptr(Py_buffer)
@specialize.memo()
diff --git a/pypy/module/cpyext/classobject.py
b/pypy/module/cpyext/classobject.py
--- a/pypy/module/cpyext/classobject.py
+++ b/pypy/module/cpyext/classobject.py
@@ -1,7 +1,7 @@
from rpython.rtyper.lltypesystem import rffi, lltype
from pypy.module.cpyext.api import (
PyObjectFields, CANNOT_FAIL,
- cpython_api, bootstrap_function, cpython_struct, build_type_checkers)
+ cpython_api, bootstrap_function, build_type_checkers)
from pypy.module.cpyext.pyobject import PyObject, make_ref, from_ref,
Py_DecRef, make_typedescr
from pypy.module.cpyext.pyerrors import PyErr_BadInternalCall
from pypy.module.__builtin__.interp_classobj import W_ClassObject,
W_InstanceObject
diff --git a/pypy/module/cpyext/include/memoryobject.h
b/pypy/module/cpyext/include/memoryobject.h
--- a/pypy/module/cpyext/include/memoryobject.h
+++ b/pypy/module/cpyext/include/memoryobject.h
@@ -5,6 +5,14 @@
extern "C" {
#endif
+/* The struct is declared here but it shouldn't
+ be considered public. Don't access those fields directly,
+ use the functions instead! */
+typedef struct {
+ PyObject_HEAD
+ Py_buffer view;
+} PyMemoryViewObject;
+
diff --git a/pypy/module/cpyext/include/object.h
b/pypy/module/cpyext/include/object.h
--- a/pypy/module/cpyext/include/object.h
+++ b/pypy/module/cpyext/include/object.h
@@ -145,7 +145,7 @@
/* Py3k buffer interface, adapted for PyPy */
#define Py_MAX_NDIMS 32
#define Py_MAX_FMT 128
-typedef struct bufferinfo {
+typedef struct Py_buffer {
void *buf;
PyObject *obj; /* owned reference */
Py_ssize_t len;
diff --git a/pypy/module/cpyext/memoryobject.py
b/pypy/module/cpyext/memoryobject.py
--- a/pypy/module/cpyext/memoryobject.py
+++ b/pypy/module/cpyext/memoryobject.py
@@ -1,14 +1,57 @@
from pypy.module.cpyext.api import (cpython_api, Py_buffer, CANNOT_FAIL,
- Py_MAX_FMT, Py_MAX_NDIMS, build_type_checkers,
Py_ssize_tP)
-from pypy.module.cpyext.pyobject import PyObject, make_ref, incref, from_ref
+ Py_MAX_FMT, Py_MAX_NDIMS, build_type_checkers,
+ Py_ssize_tP, PyObjectFields, cpython_struct,
+ bootstrap_function, Py_bufferP)
+from pypy.module.cpyext.pyobject import (PyObject, make_ref, as_pyobj, incref,
+ decref, from_ref, make_typedescr)
from rpython.rtyper.lltypesystem import lltype, rffi
from rpython.rlib.rarithmetic import widen
from pypy.objspace.std.memoryobject import W_MemoryView
+from pypy.module.cpyext.object import _dealloc
from pypy.module.cpyext.import_ import PyImport_Import
-PyMemoryView_Check, PyMemoryView_CheckExact =
build_type_checkers("MemoryView", "w_memoryview")
+PyMemoryView_Check, PyMemoryView_CheckExact = build_type_checkers("MemoryView")
-@cpython_api([PyObject, lltype.Ptr(Py_buffer), rffi.INT_real],
+
+PyMemoryViewObjectStruct = lltype.ForwardReference()
+PyMemoryViewObject = lltype.Ptr(PyMemoryViewObjectStruct)
+PyMemoryViewObjectFields = PyObjectFields + \
+ (("view", Py_buffer),)
+cpython_struct("PyMemoryViewObject", PyMemoryViewObjectFields,
PyMemoryViewObjectStruct)
+
+@bootstrap_function
+def init_memoryobject(space):
+ "Type description of PyDictObject"
+ make_typedescr(W_MemoryView.typedef,
+ basestruct=PyMemoryViewObject.TO,
+ attach=memory_attach,
+ dealloc=memory_dealloc,
+ #realize=memory_realize,
+ )
+
+def memory_attach(space, py_obj, w_obj, w_userdata=None):
+ """
+ Fills a newly allocated PyMemoryViewObject with the given W_MemoryView
object.
+ """
+ py_obj = rffi.cast(PyMemoryViewObject, py_obj)
+ py_obj.c_view.c_obj = rffi.cast(PyObject, 0)
+
+def memory_realize(space, py_obj):
+ """
+ Creates the memory object in the interpreter
+ """
+ raise oefmt(space.w_NotImplementedError, "cannot call this yet")
+
+@cpython_api([PyObject], lltype.Void, header=None)
+def memory_dealloc(space, py_obj):
+ mem_obj = rffi.cast(PyMemoryViewObject, py_obj)
+ if mem_obj.c_view.c_obj:
+ decref(space, mem_obj.c_view.c_obj)
+ mem_obj.c_view.c_obj = rffi.cast(PyObject, 0)
+ _dealloc(space, py_obj)
+
+
+@cpython_api([PyObject, Py_bufferP, rffi.INT_real],
rffi.INT_real, error=-1)
def PyObject_GetBuffer(space, w_obj, view, flags):
"""Export obj into a Py_buffer, view. These arguments must
@@ -38,14 +81,15 @@
view.c_obj = make_ref(space, w_obj)
return ret
-@cpython_api([PyObject], lltype.Ptr(Py_buffer), error=CANNOT_FAIL)
+@cpython_api([PyObject], Py_bufferP, error=CANNOT_FAIL)
def PyMemoryView_GET_BUFFER(space, w_obj):
"""Return a pointer to the buffer-info structure wrapped by the given
object. The object must be a memoryview instance; this macro doesn't
check its type, you must do it yourself or you will risk crashes."""
- view = lltype.malloc(Py_buffer, flavor='raw', zero=True)
if not isinstance(w_obj, W_MemoryView):
- return view
+ return lltype.nullptr(Py_buffer)
+ py_memobj = rffi.cast(PyMemoryViewObject, as_pyobj(space, w_obj)) # no
inc_ref
+ view = py_memobj.c_view
ndim = w_obj.buf.getndim()
if ndim >= Py_MAX_NDIMS:
# XXX warn?
@@ -55,11 +99,13 @@
view.c_buf = rffi.cast(rffi.VOIDP, w_obj.buf.get_raw_address())
view.c_obj = make_ref(space, w_obj)
rffi.setintfield(view, 'c_readonly', w_obj.buf.readonly)
+ isstr = False
except ValueError:
w_s = w_obj.descr_tobytes(space)
view.c_obj = make_ref(space, w_s)
view.c_buf = rffi.cast(rffi.VOIDP, rffi.str2charp(space.str_w(w_s),
track_allocation=False))
rffi.setintfield(view, 'c_readonly', 1)
+ isstr = True
return view
def fill_Py_buffer(space, buf, view):
@@ -135,7 +181,7 @@
sd *= dim
return 1
-@cpython_api([lltype.Ptr(Py_buffer), lltype.Char], rffi.INT_real,
error=CANNOT_FAIL)
+@cpython_api([Py_bufferP, lltype.Char], rffi.INT_real, error=CANNOT_FAIL)
def PyBuffer_IsContiguous(space, view, fort):
"""Return 1 if the memory defined by the view is C-style (fort is
'C') or Fortran-style (fort is 'F') contiguous or either one
@@ -156,7 +202,7 @@
def PyMemoryView_FromObject(space, w_obj):
return space.call_method(space.builtin, "memoryview", w_obj)
-@cpython_api([lltype.Ptr(Py_buffer)], PyObject)
+@cpython_api([Py_bufferP], PyObject)
def PyMemoryView_FromBuffer(space, view):
"""Create a memoryview object wrapping the given buffer-info structure
view.
The memoryview object then owns the buffer, which means you shouldn't
diff --git a/pypy/module/cpyext/slotdefs.py b/pypy/module/cpyext/slotdefs.py
--- a/pypy/module/cpyext/slotdefs.py
+++ b/pypy/module/cpyext/slotdefs.py
@@ -356,7 +356,7 @@
with lltype.scoped_alloc(Py_buffer) as pybuf:
pybuf.c_buf = self.ptr
pybuf.c_len = self.size
- pybuf.c_ndim = rffi.cast(rffi.INT, self.ndim)
+ pybuf.c_ndim = rffi.cast(rffi.INT_real, self.ndim)
for i in range(self.ndim):
pybuf.c_shape[i] = self.shape[i]
pybuf.c_strides[i] = self.strides[i]
diff --git a/pypy/module/cpyext/stubs.py b/pypy/module/cpyext/stubs.py
--- a/pypy/module/cpyext/stubs.py
+++ b/pypy/module/cpyext/stubs.py
@@ -10,11 +10,7 @@
PyMethodDef = rffi.VOIDP
PyGetSetDef = rffi.VOIDP
PyMemberDef = rffi.VOIDP
-Py_buffer = rffi.VOIDP
va_list = rffi.VOIDP
-PyDateTime_Date = rffi.VOIDP
-PyDateTime_DateTime = rffi.VOIDP
-PyDateTime_Time = rffi.VOIDP
wrapperbase = rffi.VOIDP
FILE = rffi.VOIDP
PyFileObject = rffi.VOIDP
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit