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

Reply via email to