Author: thomas.heller Date: Fri Jan 18 22:17:05 2008 New Revision: 60059 Modified: python/branches/py3k-ctypes-pep3118/Modules/_ctypes/_ctypes.c python/branches/py3k-ctypes-pep3118/Modules/_ctypes/ctypes.h python/branches/py3k-ctypes-pep3118/Modules/_ctypes/stgdict.c Log: Implement pep3118 format strings for SimpleCData types.
Modified: python/branches/py3k-ctypes-pep3118/Modules/_ctypes/_ctypes.c ============================================================================== --- python/branches/py3k-ctypes-pep3118/Modules/_ctypes/_ctypes.c (original) +++ python/branches/py3k-ctypes-pep3118/Modules/_ctypes/_ctypes.c Fri Jan 18 22:17:05 2008 @@ -130,6 +130,46 @@ /******************************************************************/ /* + Allocate a memory block for a pep3118 format string, copy prefix (if + non-null) and suffix into it. Returns NULL on failure, with the error + indicator set. If called with a suffix of NULL the error indicator must + already be set. + */ +static char * +alloc_format_string(const char *prefix, const char *suffix) +{ + size_t len; + char *result; + +#if 1 +/* XXX fix later */ + if (suffix == NULL) { + if (PyErr_Occurred()) + return NULL; + /* use default format character if not set */ + suffix = "B"; + } +#else + if (suffix == NULL) { + assert(PyErr_Occurred()); + return NULL; + } +#endif + len = strlen(suffix); + if (prefix) + len += strlen(prefix); + result = PyMem_Malloc(len + 1); + if (result == NULL) + return NULL; + if (prefix) + strcpy(result, prefix); + else + result[0] = '\0'; + strcat(result, suffix); + return result; +} + +/* StructType_Type - a meta type/class. Creating a new class using this one as __metaclass__ will call the contructor StructUnionType_new. It replaces the tp_dict member with a new instance of StgDict, and initializes the C @@ -1556,6 +1596,12 @@ stgdict->size = fmt->pffi_type->size; stgdict->setfunc = fmt->setfunc; stgdict->getfunc = fmt->getfunc; + stgdict->format = alloc_format_string(NULL, proto_str); + if (stgdict->format == NULL) { + Py_DECREF(result); + Py_DECREF((PyObject *)stgdict); + return NULL; + } stgdict->paramfunc = SimpleType_paramfunc; /* @@ -1616,11 +1662,14 @@ if (type == &SimpleType_Type && fmt->setfunc_swapped && fmt->getfunc_swapped) { PyObject *swapped = CreateSwappedType(type, args, kwds, proto, fmt); + StgDictObject *sw_dict; if (swapped == NULL) { Py_DECREF(result); return NULL; } + sw_dict = PyType_stgdict(swapped); #ifdef WORDS_BIGENDIAN + sw_dict->format = alloc_format_string("<", stgdict->format); PyObject_SetAttrString((PyObject *)result, "__ctype_le__", swapped); PyObject_SetAttrString((PyObject *)result, "__ctype_be__", (PyObject *)result); PyObject_SetAttrString(swapped, "__ctype_be__", (PyObject *)result); @@ -1631,7 +1680,12 @@ PyObject_SetAttrString(swapped, "__ctype_le__", (PyObject *)result); PyObject_SetAttrString(swapped, "__ctype_be__", swapped); #endif + sw_dict->format = alloc_format_string("<", stgdict->format); Py_DECREF(swapped); + if (PyErr_Occurred()) { + Py_DECREF(result); + return NULL; + } }; return (PyObject *)result; @@ -4167,6 +4221,42 @@ return result; } +static int Simple_GetBuffer(PyObject *_self, Py_buffer *view, int flags) +{ + CDataObject *self = (CDataObject *)_self; + StgDictObject *dict = PyObject_stgdict(_self); + + if (view == NULL) return 0; + if (((flags & PyBUF_LOCK) == PyBUF_LOCK)) { + PyErr_SetString(PyExc_BufferError, + "Cannot lock this object."); + return -1; + } + + view->buf = self->b_ptr; + view->len = self->b_size; + view->readonly = 0; + view->itemsize = self->b_size; +#if 1 + /* XXX fix later */ + /* use default format character if not set */ + view->format = dict->format ? dict->format : "B"; +#else + view->format = dict->format; +#endif + view->ndim = 0; + view->shape = NULL; + view->strides = NULL; + view->suboffsets = NULL; + view->internal = NULL; + return 0; +} + +static PyBufferProcs Simple_as_buffer = { + Simple_GetBuffer, + NULL, +}; + static PyTypeObject Simple_Type = { PyVarObject_HEAD_INIT(NULL, 0) "_ctypes._SimpleCData", @@ -4186,7 +4276,7 @@ 0, /* tp_str */ 0, /* tp_getattro */ 0, /* tp_setattro */ - &CData_as_buffer, /* tp_as_buffer */ + &Simple_as_buffer, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ "XXX to be provided", /* tp_doc */ (traverseproc)CData_traverse, /* tp_traverse */ Modified: python/branches/py3k-ctypes-pep3118/Modules/_ctypes/ctypes.h ============================================================================== --- python/branches/py3k-ctypes-pep3118/Modules/_ctypes/ctypes.h (original) +++ python/branches/py3k-ctypes-pep3118/Modules/_ctypes/ctypes.h Fri Jan 18 22:17:05 2008 @@ -200,6 +200,7 @@ PyObject *restype; /* CDataObject or NULL */ PyObject *checker; int flags; /* calling convention and such */ + char *format; /* pep3118 format string, needs PyMem_Free */ } StgDictObject; /**************************************************************** Modified: python/branches/py3k-ctypes-pep3118/Modules/_ctypes/stgdict.c ============================================================================== --- python/branches/py3k-ctypes-pep3118/Modules/_ctypes/stgdict.c (original) +++ python/branches/py3k-ctypes-pep3118/Modules/_ctypes/stgdict.c Fri Jan 18 22:17:05 2008 @@ -20,6 +20,7 @@ { if (PyDict_Type.tp_init((PyObject *)self, args, kwds) < 0) return -1; + self->format = NULL; return 0; } @@ -38,6 +39,7 @@ StgDict_dealloc(StgDictObject *self) { StgDict_clear(self); + PyMem_Free(self->format); PyMem_Free(self->ffi_type_pointer.elements); PyDict_Type.tp_dealloc((PyObject *)self); } _______________________________________________ Python-3000-checkins mailing list Python-3000-checkins@python.org http://mail.python.org/mailman/listinfo/python-3000-checkins