Author: thomas.heller
Date: Fri Jan 25 19:59:45 2008
New Revision: 60289

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:
Fix format string for structures, and itemsize for arrays.


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 19:59:45 2008
@@ -291,14 +291,6 @@
        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
@@ -2319,6 +2311,7 @@
 {
        CDataObject *self = (CDataObject *)_self;
        StgDictObject *dict = PyObject_stgdict(_self);
+       Py_ssize_t i;
 
        if (view == NULL) return 0;
        if (((flags & PyBUF_LOCK) == PyBUF_LOCK)) {
@@ -2330,7 +2323,6 @@
        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 */
@@ -2340,6 +2332,10 @@
 #endif
        view->ndim = dict->ndim;
        view->shape = dict->shape;
+       view->itemsize = self->b_size;
+       for (i = 0; i < view->ndim; ++i) {
+               view->itemsize /= dict->shape[i];
+       }
        view->strides = NULL;
        view->suboffsets = NULL;
        view->internal = NULL;
@@ -4824,7 +4820,7 @@
        0,                                      /* tp_str */
        0,                                      /* tp_getattro */
        0,                                      /* tp_setattro */
-       &Simple_as_buffer,                      /* tp_as_buffer */
+       &CData_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 
25 19:59:45 2008
@@ -344,7 +344,6 @@
 
 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 19:59:45 2008
@@ -408,9 +408,12 @@
                ffi_ofs = 0;
        }
 
-       stgdict->format = alloc_format_string(NULL, "}");
-       if (stgdict->format == NULL)
-               return -1;
+       if (isStruct) {
+               stgdict->format = alloc_format_string(NULL, "T{");
+       } else {
+               /* PEP3118 doesn't support unions. Invent our own character... 
*/
+               stgdict->format = alloc_format_string(NULL, "#{");
+       }
 
 #define realdict ((PyObject *)&stgdict->dict)
        for (i = 0; i < len; ++i) {
@@ -471,13 +474,17 @@
                } 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);
+                       char *fieldfmt = dict->format ? dict->format : "XXX";
+                       char *fieldname = PyUnicode_AsString(name);
+                       char *ptr;
+                       Py_ssize_t len = strlen(fieldname) + strlen(fieldfmt);
+                       char *buf = alloca(len + 2 + 1);
+                       sprintf(buf, "%s:%s:", fieldfmt, fieldname);
+
+                       ptr = stgdict->format;
+                       stgdict->format = alloc_format_string(stgdict->format, 
buf);
+                       PyMem_Free(ptr);
+
                        if (stgdict->format == NULL) {
                                Py_DECREF(pair);
                                return -1;
@@ -514,12 +521,7 @@
        }
 #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);
-       }
+       stgdict->format = alloc_format_string(stgdict->format, "}");
        if (stgdict->format == NULL)
                return -1;
 
_______________________________________________
Python-3000-checkins mailing list
Python-3000-checkins@python.org
http://mail.python.org/mailman/listinfo/python-3000-checkins

Reply via email to