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