[Python-3000-checkins] r56995 - in python/branches/py3k-buffer/Modules: _ctypes/_ctypes.c mmapmodule.c
travis.oliphant
python-3000-checkins at python.org
Tue Aug 14 01:19:12 CEST 2007
Author: travis.oliphant
Date: Tue Aug 14 01:19:10 2007
New Revision: 56995
Modified:
python/branches/py3k-buffer/Modules/_ctypes/_ctypes.c
python/branches/py3k-buffer/Modules/mmapmodule.c
Log:
Converted mmap and ctypes.
Modified: python/branches/py3k-buffer/Modules/_ctypes/_ctypes.c
==============================================================================
--- python/branches/py3k-buffer/Modules/_ctypes/_ctypes.c (original)
+++ python/branches/py3k-buffer/Modules/_ctypes/_ctypes.c Tue Aug 14 01:19:10 2007
@@ -739,22 +739,33 @@
{
char *ptr;
Py_ssize_t size;
+ int rel = 0;
+ PyBuffer view;
+
if (PyBuffer_Check(value)) {
- size = Py_Type(value)->tp_as_buffer->bf_getreadbuffer(value, 0, (void *)&ptr);
- if (size < 0)
- return -1;
+ if (PyObject_GetBuffer(value, &view, PyBUF_SIMPLE) < 0)
+ return -1;
+ size = view.len;
+ ptr = view.buf;
+ rel = 1;
} else if (-1 == PyString_AsStringAndSize(value, &ptr, &size)) {
return -1;
}
if (size > self->b_size) {
PyErr_SetString(PyExc_ValueError,
"string too long");
- return -1;
+ goto fail;
}
memcpy(self->b_ptr, ptr, size);
+ if (rel)
+ PyObject_ReleaseBuffer(value, &view);
return 0;
+ fail:
+ if (rel)
+ PyObject_ReleaseBuffer(value, &view);
+ return -1;
}
static PyObject *
@@ -2072,29 +2083,15 @@
{ NULL },
};
-static Py_ssize_t CData_GetBuffer(PyObject *_self, Py_ssize_t seg, void **pptr)
+static int CData_GetBuffer(PyObject *_self, PyBuffer *view, int flags)
{
CDataObject *self = (CDataObject *)_self;
- if (seg != 0) {
- /* Hm. Must this set an exception? */
- return -1;
- }
- *pptr = self->b_ptr;
- return self->b_size;
-}
-
-static Py_ssize_t CData_GetSegcount(PyObject *_self, Py_ssize_t *lenp)
-{
- if (lenp)
- *lenp = 1;
- return 1;
+ return PyBuffer_FillInfo(view, self->b_ptr, self->b_size, 0, flags);
}
static PyBufferProcs CData_as_buffer = {
CData_GetBuffer,
- CData_GetBuffer,
- CData_GetSegcount,
- NULL,
+ NULL,
};
/*
Modified: python/branches/py3k-buffer/Modules/mmapmodule.c
==============================================================================
--- python/branches/py3k-buffer/Modules/mmapmodule.c (original)
+++ python/branches/py3k-buffer/Modules/mmapmodule.c Tue Aug 14 01:19:10 2007
@@ -75,6 +75,7 @@
char * data;
size_t size;
size_t pos;
+ int exports;
#ifdef MS_WINDOWS
HANDLE map_handle;
@@ -119,6 +120,11 @@
static PyObject *
mmap_close_method(mmap_object *self, PyObject *unused)
{
+ if (self->exports > 0) {
+ PyErr_SetString(PyExc_BufferError, "cannot close "\
+ "exported pointers exist");
+ return NULL;
+ }
#ifdef MS_WINDOWS
/* For each resource we maintain, we need to check
the value is valid, and if so, free the resource
@@ -277,8 +283,13 @@
static int
is_resizeable(mmap_object *self)
{
+ if (self->exports > 0) {
+ PyErr_SetString(PyExc_BufferError,
+ "mmap can't resize with extant buffers exported.");
+ return 0;
+ }
if ((self->access == ACCESS_WRITE) || (self->access == ACCESS_DEFAULT))
- return 1;
+ return 1;
PyErr_Format(PyExc_TypeError,
"mmap can't resize a readonly or copy-on-write memory map.");
return 0;
@@ -589,53 +600,21 @@
/* Functions for treating an mmap'ed file as a buffer */
-static Py_ssize_t
-mmap_buffer_getreadbuf(mmap_object *self, Py_ssize_t index, const void **ptr)
-{
- CHECK_VALID(-1);
- if (index != 0) {
- PyErr_SetString(PyExc_SystemError,
- "Accessing non-existent mmap segment");
- return -1;
- }
- *ptr = self->data;
- return self->size;
-}
-
-static Py_ssize_t
-mmap_buffer_getwritebuf(mmap_object *self, Py_ssize_t index, const void **ptr)
-{
- CHECK_VALID(-1);
- if (index != 0) {
- PyErr_SetString(PyExc_SystemError,
- "Accessing non-existent mmap segment");
- return -1;
- }
- if (!is_writeable(self))
- return -1;
- *ptr = self->data;
- return self->size;
-}
-
-static Py_ssize_t
-mmap_buffer_getsegcount(mmap_object *self, Py_ssize_t *lenp)
+static int
+mmap_buffer_getbuf(mmap_object *self, PyBuffer *view, int flags)
{
CHECK_VALID(-1);
- if (lenp)
- *lenp = self->size;
- return 1;
+ if (PyBuffer_FillInfo(view, self->data, self->size,
+ (self->access == ACCESS_READ), flags) < 0)
+ return -1;
+ self->exports++;
+ return 0;
}
-static Py_ssize_t
-mmap_buffer_getcharbuffer(mmap_object *self, Py_ssize_t index, const void **ptr)
+static void
+mmap_buffer_releasebuf(mmap_object *self, PyBuffer *view)
{
- if (index != 0) {
- PyErr_SetString(PyExc_SystemError,
- "accessing non-existent buffer segment");
- return -1;
- }
- *ptr = (const char *)self->data;
- return self->size;
+ self->exports--;
}
static PyObject *
@@ -775,10 +754,8 @@
};
static PyBufferProcs mmap_as_buffer = {
- (readbufferproc)mmap_buffer_getreadbuf,
- (writebufferproc)mmap_buffer_getwritebuf,
- (segcountproc)mmap_buffer_getsegcount,
- (charbufferproc)mmap_buffer_getcharbuffer,
+ (getbufferproc)mmap_buffer_getbuf,
+ (releasebufferproc)mmap_buffer_releasebuf,
};
static PyTypeObject mmap_object_type = {
More information about the Python-3000-checkins
mailing list