Author: Richard Plangger <[email protected]>
Branch: memoryview-attributes
Changeset: r86282:c6decd039ce0
Date: 2016-08-18 17:33 +0200
http://bitbucket.org/pypy/pypy/changeset/c6decd039ce0/

Log:    test_buffer_protocol passes now, allocating a new Py_buffer that
        should be managed by the CPyBuffer object (needs some discussion)

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
@@ -649,6 +649,7 @@
         #('smalltable', rffi.CFixedArray(Py_ssize_t, 2)),
         ('internal', rffi.VOIDP)
         ))
+Py_bufferP = lltype.Ptr(Py_buffer)
 
 @specialize.memo()
 def is_PyObject(TYPE):
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
@@ -5,13 +5,13 @@
 from rpython.rtyper.lltypesystem import rffi, lltype
 from pypy.module.cpyext.api import (
     cpython_api, generic_cpy_call, PyObject, Py_ssize_t, Py_TPFLAGS_CHECKTYPES,
-    mangle_name, pypy_decl)
+    mangle_name, pypy_decl, Py_buffer)
 from pypy.module.cpyext.typeobjectdefs import (
     unaryfunc, wrapperfunc, ternaryfunc, PyTypeObjectPtr, binaryfunc, 
ternaryfunc,
     getattrfunc, getattrofunc, setattrofunc, lenfunc, ssizeargfunc, inquiry,
     ssizessizeargfunc, ssizeobjargproc, iternextfunc, initproc, richcmpfunc,
     cmpfunc, hashfunc, descrgetfunc, descrsetfunc, objobjproc, objobjargproc,
-    readbufferproc, ssizessizeobjargproc)
+    readbufferproc, getbufferproc, ssizessizeobjargproc)
 from pypy.module.cpyext.pyobject import from_ref, make_ref, Py_DecRef
 from pypy.module.cpyext.pyerrors import PyErr_Occurred
 from pypy.module.cpyext.state import State
@@ -302,6 +302,7 @@
     _immutable_ = True
 
     def __init__(self, ptr, size, w_obj):
+        # XXX leak of ptr
         self.ptr = ptr
         self.size = size
         self.w_obj = w_obj # kept alive
@@ -317,8 +318,7 @@
         return rffi.cast(rffi.CCHARP, self.ptr)
 
     def getformat(self):
-        import pdb; pdb.set_trace()
-        return 'i'
+        return rffi.charp2str(self.ptr.c_format)
 
 def wrap_getreadbuffer(space, w_self, w_args, func):
     func_target = rffi.cast(readbufferproc, func)
@@ -330,8 +330,15 @@
         return space.newbuffer(CPyBuffer(ptr[0], size, w_self))
 
 def wrap_getbuffer(space, w_self, w_args, func):
-    import pdb; pdb.set_trace()
-    return space.newbuffer(CPyBuffer(ptr[0], size, w_self))
+    func_target = rffi.cast(getbufferproc, func)
+    # XXX leak
+    pybuf = lltype.malloc(Py_buffer, flavor='raw', track_allocation=False)
+    # XXX flags are not in w_args?
+    flags = rffi.cast(rffi.INT_real,0)
+    size = generic_cpy_call(space, func_target, w_self, pybuf, flags)
+    if size < 0:
+        space.fromcache(State).check_and_raise_exception(always=True)
+    return space.newbuffer(CPyBuffer(pybuf, size, w_self))
 
 def get_richcmp_func(OP_CONST):
     def inner(space, w_self, w_args, func):
diff --git a/pypy/module/cpyext/typeobjectdefs.py 
b/pypy/module/cpyext/typeobjectdefs.py
--- a/pypy/module/cpyext/typeobjectdefs.py
+++ b/pypy/module/cpyext/typeobjectdefs.py
@@ -5,6 +5,7 @@
     Py_TPFLAGS_READYING, Py_TPFLAGS_READY, Py_TPFLAGS_HEAPTYPE)
 from pypy.module.cpyext.pyobject import PyObject, make_ref, from_ref
 from pypy.module.cpyext.modsupport import PyMethodDef
+from pypy.module.cpyext.api import Py_bufferP
 
 
 P, FT, PyO = Ptr, FuncType, PyObject
@@ -58,8 +59,7 @@
 writebufferproc = P(FT([PyO, Py_ssize_t, rffi.VOIDPP], Py_ssize_t))
 segcountproc = P(FT([PyO, Py_ssize_tP], Py_ssize_t))
 charbufferproc = P(FT([PyO, Py_ssize_t, rffi.CCHARPP], Py_ssize_t))
-## We don't support new buffer interface for now
-getbufferproc = rffi.VOIDP
+getbufferproc = P(FT([PyO, Py_bufferP, rffi.INT_real], rffi.INT_real))
 releasebufferproc = rffi.VOIDP
 
 
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to