[ctypes-commit] ctypes/source _ctypes.c,1.236,1.237
Brought to you by:
theller
From: Thomas H. <th...@us...> - 2005-03-24 21:23:09
|
Update of /cvsroot/ctypes/ctypes/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv31795 Modified Files: _ctypes.c Log Message: Install StructUnion_getfunc even when _fields_ is not yet defined. Bug fix. Some todo comments. Call itemdict->getfunc instead of CData_get in Pointer_item. There must be still some types without getfunc, but the testsuite doesn't catch them, obviously. Index: _ctypes.c =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/_ctypes.c,v retrieving revision 1.236 retrieving revision 1.237 diff -C2 -d -r1.236 -r1.237 *** _ctypes.c 24 Mar 2005 20:22:52 -0000 1.236 --- _ctypes.c 24 Mar 2005 21:22:58 -0000 1.237 *************** *** 171,174 **** --- 171,177 ---- result->tp_dict = (PyObject *)dict; + /* XXX Allow overriding. __c_to_python__? */ + dict->getfunc = StructUnion_getfunc; + fields = PyDict_GetItemString((PyObject *)dict, "_fields_"); if (!fields) { *************** *** 192,198 **** } - /* XXX Allow overriding. __c_to_python__? */ - dict->getfunc = StructUnion_getfunc; - return (PyObject *)result; } --- 195,198 ---- *************** *** 890,893 **** --- 890,901 ---- return NULL; } + /* XXX This must be special cased to get rid of the Array checks in + cfield.c :: CField_FromDesc, which installs custom getfuncs in + fields. + + For c_char and c_wchar arrays, the c_char and c_wchar getfuncs must + be used. + */ + return CData_FromBaseObj(type, (PyObject *)src, 0, ptr); } *************** *** 1927,1950 **** } - static PyObject * - CData_get(PyObject *type, GETFUNC getfunc, CDataObject *src, - int index, int size, char *adr) - { - if (getfunc) - return getfunc(adr, size, - type, src, index); - if (type) { - StgDictObject *dict; - dict = PyType_stgdict(type); - if (dict && dict->getfunc) - return dict->getfunc(adr, size, - type, src, index); - return CData_FromBaseObj(type, (PyObject *)src, index, adr); - } - // return getfunc(adr, size); - PyErr_SetString(PyExc_RuntimeError, "BUG in ctypes"); - return NULL; - } - /* Helper function for CData_set below. --- 1935,1938 ---- *************** *** 3702,3706 **** proto = stgdict->proto; - /* XXXXXX MAKE SURE PROTO IS NOT NULL! */ itemdict = PyType_stgdict(proto); size = itemdict->size; --- 3690,3693 ---- *************** *** 3712,3717 **** else base = self; ! return CData_get(stgdict->proto, stgdict->getfunc, base, ! index, size, (*(char **)self->b_ptr) + offset); } --- 3699,3705 ---- else base = self; ! ! return itemdict->getfunc((*(char **)self->b_ptr) + offset, size, ! proto, base, index); } |