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

Reply via email to