Author: thomas.heller Date: Fri Jan 25 11:53:33 2008 New Revision: 60278 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 ctypes.Structure and ctypes.Union.
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 25 11:53:33 2008 @@ -135,7 +135,7 @@ indicator set. If called with a suffix of NULL the error indicator must already be set. */ -static char * +char * alloc_format_string(const char *prefix, const char *suffix) { size_t len; @@ -169,6 +169,14 @@ return result; } +char * +replace_format_string(const char *prefix, char *suffix) +{ + char *result = alloc_format_string(prefix, suffix); + PyMem_Free(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 @@ -1059,6 +1067,7 @@ return NULL; } + assert(itemdict->format); if (itemdict->format[0] == '(') { sprintf(buf, "(%d,", length); stgdict->format = alloc_format_string(buf, itemdict->format+1); 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 25 11:53:33 2008 @@ -343,6 +343,8 @@ extern void _AddTraceback(char *, char *, int); extern PyObject *CData_FromBaseObj(PyObject *type, PyObject *base, Py_ssize_t index, char *adr); +extern char *alloc_format_string(const char *prefix, const char *suffix); +extern char *replace_format_string(const char *prefix, char *suffix); /* XXX better name needed! */ extern int IsSimpleSubType(PyObject *obj); 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 25 11:53:33 2008 @@ -2,6 +2,7 @@ #include <ffi.h> #ifdef MS_WIN32 #include <windows.h> +#include <malloc.h> #endif #include "ctypes.h" @@ -55,6 +56,10 @@ StgDict_clear(dst); PyMem_Free(dst->ffi_type_pointer.elements); + PyMem_Free(dst->format); + dst->format = NULL; + PyMem_Free(dst->shape); + dst->shape = NULL; dst->ffi_type_pointer.elements = NULL; d = (char *)dst; @@ -69,6 +74,20 @@ Py_XINCREF(dst->restype); Py_XINCREF(dst->checker); + if (src->format) { + dst->format = PyMem_Malloc(strlen(src->format) + 1); + if (dst->format == NULL) + return -1; + strcpy(dst->format, src->format); + } + if (src->shape) { + dst->shape = PyMem_Malloc(sizeof(Py_ssize_t) * src->ndim); + if (dst->shape == NULL) + return -1; + memcpy(dst->shape, src->shape, + sizeof(Py_ssize_t) * src->ndim); + } + if (src->ffi_type_pointer.elements == NULL) return 0; size = sizeof(ffi_type *) * (src->length + 1); @@ -346,6 +365,11 @@ return -1; } + if (stgdict->format) { + PyMem_Free(stgdict->format); + stgdict->format = NULL; + } + if (stgdict->ffi_type_pointer.elements) PyMem_Free(stgdict->ffi_type_pointer.elements); @@ -384,6 +408,10 @@ ffi_ofs = 0; } + stgdict->format = alloc_format_string(NULL, "}"); + if (stgdict->format == NULL) + return -1; + #define realdict ((PyObject *)&stgdict->dict) for (i = 0; i < len; ++i) { PyObject *name = NULL, *desc = NULL; @@ -442,6 +470,19 @@ } } else bitsize = 0; + { + int len = PyUnicode_GetSize(name); + char *buf = alloca(len); + sprintf(buf, ":%s:", PyUnicode_AsString(name)); +/* XXX FIXME */ +/* assert(dict->format); */ + strcat(buf, dict->format ? dict->format : "XXX"); + stgdict->format = replace_format_string(buf, stgdict->format); + if (stgdict->format == NULL) { + Py_DECREF(pair); + return -1; + } + } if (isStruct) { prop = CField_FromDesc(desc, i, &field_size, bitsize, &bitofs, @@ -472,6 +513,16 @@ Py_DECREF(prop); } #undef realdict + + if (isStruct) { + stgdict->format = replace_format_string("T{", stgdict->format); + } else { + /* PEP3118 doesn't support unions. Invent our own character... */ + stgdict->format = replace_format_string("#{", stgdict->format); + } + if (stgdict->format == NULL) + return -1; + if (!isStruct) size = union_size; _______________________________________________ Python-3000-checkins mailing list Python-3000-checkins@python.org http://mail.python.org/mailman/listinfo/python-3000-checkins