ctypes-commit Mailing List for ctypes (Page 65)
Brought to you by:
theller
You can subscribe to this list here.
2004 |
Jan
|
Feb
|
Mar
|
Apr
(8) |
May
(90) |
Jun
(143) |
Jul
(106) |
Aug
(94) |
Sep
(84) |
Oct
(163) |
Nov
(60) |
Dec
(58) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2005 |
Jan
(128) |
Feb
(79) |
Mar
(227) |
Apr
(192) |
May
(179) |
Jun
(41) |
Jul
(53) |
Aug
(103) |
Sep
(28) |
Oct
(38) |
Nov
(81) |
Dec
(17) |
2006 |
Jan
(184) |
Feb
(111) |
Mar
(188) |
Apr
(67) |
May
(58) |
Jun
(123) |
Jul
(73) |
Aug
|
Sep
|
Oct
(1) |
Nov
|
Dec
|
From: Thomas H. <th...@us...> - 2005-03-24 18:39:46
|
Update of /cvsroot/ctypes/ctypes In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv26437 Modified Files: cover Log Message: todo comment. Index: cover =================================================================== RCS file: /cvsroot/ctypes/ctypes/cover,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** cover 24 Mar 2005 17:23:49 -0000 1.2 --- cover 24 Mar 2005 18:39:36 -0000 1.3 *************** *** 10,13 **** --- 10,15 ---- # Does anyone know how I can use grep to atch lines that include '#####' but NOT include '/*COV*/' ? # + # I should probably better write a Python script... + # grep -c "#####.*[^C][^O][^V][^*][^/]$" *.c.gcov echo "TOTAL:" |
From: Thomas H. <th...@us...> - 2005-03-24 17:43:51
|
Update of /cvsroot/ctypes/ctypes/unittests In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv25548/unittests Modified Files: test_complete_cover.py Log Message: cfield.c coverage is now 100 %. Index: test_complete_cover.py =================================================================== RCS file: /cvsroot/ctypes/ctypes/unittests/test_complete_cover.py,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** test_complete_cover.py 24 Mar 2005 16:52:23 -0000 1.1 --- test_complete_cover.py 24 Mar 2005 17:43:43 -0000 1.2 *************** *** 48,51 **** --- 48,57 ---- lambda: setattr(x, "P", "abc")) + pythonapi.PyDict_GetItemString.restype = py_object + pythonapi.PyDict_GetItemString.argtypes = py_object, c_char_p + + self.failUnlessRaises(ValueError, + lambda: pythonapi.PyDict_GetItemString(x.__dict__, "spam")) + if __name__ == "__main__": unittest.main() |
From: Thomas H. <th...@us...> - 2005-03-24 17:43:23
|
Update of /cvsroot/ctypes/ctypes/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv25310/source Modified Files: cfield.c Log Message: cfield.c coverage is now 100 %. Index: cfield.c =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/cfield.c,v retrieving revision 1.87 retrieving revision 1.88 diff -C2 -d -r1.87 -r1.88 *** cfield.c 24 Mar 2005 15:28:43 -0000 1.87 --- cfield.c 24 Mar 2005 17:43:13 -0000 1.88 *************** *** 1,2 **** --- 1,5 ---- + /*COV*/ + /* Lines which END with the above text are excluded from the coverage report */ + #include "Python.h" #include "structmember.h" *************** *** 166,176 **** NULL); if (self == NULL) ! return NULL; dict = PyType_stgdict(desc); if (!dict) { ! PyErr_SetString(PyExc_TypeError, "has no _stginfo_"); ! Py_DECREF(self); ! return NULL; } #ifdef MS_WIN32 --- 169,179 ---- NULL); if (self == NULL) ! return NULL; /*COV*/ dict = PyType_stgdict(desc); if (!dict) { ! PyErr_SetString(PyExc_TypeError, /*COV*/ "has no _stginfo_"); ! Py_DECREF(self); /*COV*/ ! return NULL; /*COV*/ } #ifdef MS_WIN32 *************** *** 653,656 **** --- 656,663 ---- } + #if SIZEOF_INT == SIZEOF_LONG + #define i_set l_set + #define i_get l_get + #else static PyObject * i_set(void *ptr, PyObject *value, unsigned size, ...) *************** *** 663,667 **** } - static PyObject * i_get(void *ptr, unsigned size, ...) --- 670,673 ---- *************** *** 671,674 **** --- 677,681 ---- return PyInt_FromLong(val); } + #endif #ifdef MS_WIN32 *************** *** 696,699 **** --- 703,710 ---- #endif + #if SIZEOF_INT == SIZEOF_LONG + #define I_set L_set + #define I_get L_get + #else static PyObject * I_set(void *ptr, PyObject *value, unsigned size, ...) *************** *** 714,717 **** --- 725,729 ---- return PyLong_FromUnsignedLong(val); } + #endif static PyObject * *************** *** 937,941 **** result = PyUnicode_FromWideChar((wchar_t *)ptr, size); if (!result) ! return NULL; /* We need 'result' to be able to count the characters with wcslen, since ptr may not be NUL terminated. If the length is smaller (if --- 949,953 ---- result = PyUnicode_FromWideChar((wchar_t *)ptr, size); if (!result) ! return NULL; /*COV*/ /* We need 'result' to be able to count the characters with wcslen, since ptr may not be NUL terminated. If the length is smaller (if *************** *** 1001,1005 **** result = PyString_FromString((char *)ptr); if (!result) ! return NULL; /* chop off at the first NUL character, if any. * On error, result will be deallocated and set to NULL. --- 1013,1017 ---- result = PyString_FromString((char *)ptr); if (!result) ! return NULL; /*COV*/ /* chop off at the first NUL character, if any. * On error, result will be deallocated and set to NULL. *************** *** 1012,1016 **** } else /* cannot shorten the result */ ! return PyString_FromStringAndSize(ptr, size); } --- 1024,1028 ---- } else /* cannot shorten the result */ ! return PyString_FromStringAndSize(ptr, size); /*COV*/ } *************** *** 1129,1144 **** buffer = (wchar_t *)PyMem_Malloc(size); if (!buffer) ! return NULL; memset(buffer, 0, size); keep = PyCObject_FromVoidPtr(buffer, PyMem_Free); if (!keep) { ! PyMem_Free(buffer); ! return NULL; } *(wchar_t **)ptr = (wchar_t *)buffer; if (-1 == PyUnicode_AsWideChar((PyUnicodeObject *)value, buffer, PyUnicode_GET_SIZE(value))) { ! Py_DECREF(value); ! return NULL; } Py_DECREF(value); --- 1141,1156 ---- buffer = (wchar_t *)PyMem_Malloc(size); if (!buffer) ! return NULL; /*COV*/ memset(buffer, 0, size); keep = PyCObject_FromVoidPtr(buffer, PyMem_Free); if (!keep) { ! PyMem_Free(buffer); /*COV*/ ! return NULL; /*COV*/ } *(wchar_t **)ptr = (wchar_t *)buffer; if (-1 == PyUnicode_AsWideChar((PyUnicodeObject *)value, buffer, PyUnicode_GET_SIZE(value))) { ! Py_DECREF(value); /*COV*/ ! return NULL; /*COV*/ } Py_DECREF(value); *************** *** 1323,1327 **** return table; } ! return NULL; } --- 1335,1339 ---- return table; } ! return NULL; /*COV*/ } |
From: Thomas H. <th...@us...> - 2005-03-24 17:24:01
|
Update of /cvsroot/ctypes/ctypes In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv13054 Modified Files: cover Log Message: Dumb scheme to mark source lines for exclusion from our coverage report. Index: cover =================================================================== RCS file: /cvsroot/ctypes/ctypes/cover,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** cover 24 Mar 2005 16:52:23 -0000 1.1 --- cover 24 Mar 2005 17:23:49 -0000 1.2 *************** *** 6,10 **** python setup.py testlocal gcov source/*.c -o ./build/temp.linux-i686-2.4/source/ ! grep -c "#####" *.c.gcov echo "TOTAL:" ! cat *.c.gcov | grep -c "#####" \ No newline at end of file --- 6,14 ---- python setup.py testlocal gcov source/*.c -o ./build/temp.linux-i686-2.4/source/ ! # look for lines with the gcov marker #####, but exclude those where the line ends with /*COV*/ ! # ! # Does anyone know how I can use grep to atch lines that include '#####' but NOT include '/*COV*/' ? ! # ! grep -c "#####.*[^C][^O][^V][^*][^/]$" *.c.gcov echo "TOTAL:" ! cat *.c.gcov | grep -c "#####.*[^C][^O][^V][^*][^/]$" \ No newline at end of file |
From: Thomas H. <th...@us...> - 2005-03-24 11:13:30
|
Update of /cvsroot/ctypes/ctypes/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv26846 Modified Files: ctypes.h cfield.c Log Message: It turns out the last parameter to setfunc is unneeded. Which is a good thing - since we have to be able to call setfunc also for arbitrary memory locations, not just for buffers in ctypes instances. Index: ctypes.h =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/ctypes.h,v retrieving revision 1.81 retrieving revision 1.82 diff -C2 -d -r1.81 -r1.82 *** ctypes.h 24 Mar 2005 10:35:21 -0000 1.81 --- ctypes.h 24 Mar 2005 11:13:18 -0000 1.82 *************** *** 130,137 **** */ - // full arglist: (void*, unsigned, PyObject *type, CDataObject *src, int index) typedef PyObject *(* GETFUNC)(void *, unsigned size, ...); - // full arglist: (void*, PyObject*, unsigned, PyObject *type, CDataObject *dst) typedef PyObject *(* SETFUNC)(void *, PyObject *value, unsigned size, ...); /* a table entry describing a predefined ctypes type */ --- 130,137 ---- */ typedef PyObject *(* GETFUNC)(void *, unsigned size, ...); typedef PyObject *(* SETFUNC)(void *, PyObject *value, unsigned size, ...); + //typedef PyObject *(* GETFUNC)(void*, unsigned, PyObject *type, CDataObject *src, int index); + //typedef PyObject *(* SETFUNC)(void*, PyObject*, unsigned, PyObject *type); /* a table entry describing a predefined ctypes type */ Index: cfield.c =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/cfield.c,v retrieving revision 1.85 retrieving revision 1.86 diff -C2 -d -r1.85 -r1.86 *** cfield.c 24 Mar 2005 10:35:21 -0000 1.85 --- cfield.c 24 Mar 2005 11:13:18 -0000 1.86 *************** *** 26,30 **** static PyObject * _overloaded_field_setfunc(void *ptr, PyObject *value, unsigned size, ! PyObject *fieldtype, CDataObject *dst) { PyObject *result; --- 26,30 ---- static PyObject * _overloaded_field_setfunc(void *ptr, PyObject *value, unsigned size, ! PyObject *fieldtype) { PyObject *result; *************** *** 43,50 **** /* Default setfunc to be used as CFieldObject.setfunc when the field type doesn't supply its own getfunc. */ static PyObject * _generic_field_setfunc(char *ptr, PyObject *value, unsigned size, ! PyObject *type, CDataObject *dst) { /* inlined code from _CData_set() */ --- 43,52 ---- /* Default setfunc to be used as CFieldObject.setfunc when the field type doesn't supply its own getfunc. + + Can eventually be removed when ALL ctypes types supply their own setfunc. */ static PyObject * _generic_field_setfunc(char *ptr, PyObject *value, unsigned size, ! PyObject *type) { /* inlined code from _CData_set() */ *************** *** 86,90 **** return NULL; } ! result = _generic_field_setfunc(ptr, ob, size, type, dst); Py_DECREF(ob); return result; --- 88,92 ---- return NULL; } ! result = _generic_field_setfunc(ptr, ob, size, type); Py_DECREF(ob); return result; |
From: Thomas H. <th...@us...> - 2005-03-24 10:35:33
|
Update of /cvsroot/ctypes/ctypes/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv2972 Modified Files: ctypes.h cfield.c Log Message: The setfunc member is CFieldObject is now always used to set the field. Experimental changes to allow overriding the default behaviour with a __to_field__ classmethod in the field type. Index: ctypes.h =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/ctypes.h,v retrieving revision 1.80 retrieving revision 1.81 diff -C2 -d -r1.80 -r1.81 *** ctypes.h 24 Mar 2005 10:09:29 -0000 1.80 --- ctypes.h 24 Mar 2005 10:35:21 -0000 1.81 *************** *** 125,134 **** extern PyMethodDef module_methods[]; ! /* XXX The code in cfield.c calls GETFUNC with more parameters. Once this is ! also true for code in other files, the full signature should be used here. ! Or we should have FIELDGETFUNC... */ typedef PyObject *(* GETFUNC)(void *, unsigned size, ...); ! typedef PyObject *(* SETFUNC)(void *, PyObject *value, unsigned size); /* a table entry describing a predefined ctypes type */ --- 125,137 ---- extern PyMethodDef module_methods[]; ! /* XXX The code in cfield.c calls GETFUNC and SETFUNC with more parameters. ! Once this is also true for code in other files, the full signature should ! be used here. Or we should have FIELDGETFUNC... */ + + // full arglist: (void*, unsigned, PyObject *type, CDataObject *src, int index) typedef PyObject *(* GETFUNC)(void *, unsigned size, ...); ! // full arglist: (void*, PyObject*, unsigned, PyObject *type, CDataObject *dst) ! typedef PyObject *(* SETFUNC)(void *, PyObject *value, unsigned size, ...); /* a table entry describing a predefined ctypes type */ Index: cfield.c =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/cfield.c,v retrieving revision 1.84 retrieving revision 1.85 diff -C2 -d -r1.84 -r1.85 *** cfield.c 24 Mar 2005 10:04:57 -0000 1.84 --- cfield.c 24 Mar 2005 10:35:21 -0000 1.85 *************** *** 22,27 **** } /* Default getfunc to be used in CFieldObject when the field type doesn't ! supply a custom getfunc. */ static PyObject * --- 22,109 ---- } + #ifdef EXPERIMENTAL + /* setfunc overloaded by a __to_field__ callable on the fieldtype */ + static PyObject * + _overloaded_field_setfunc(void *ptr, PyObject *value, unsigned size, + PyObject *fieldtype, CDataObject *dst) + { + PyObject *result; + PyObject *func = PyObject_GetAttrString(fieldtype, "__to_field__"); + if (func == NULL) + return NULL; + result = PyObject_CallFunctionObjArgs(func, + PyLong_FromVoidPtr(ptr), + value, + NULL); + Py_DECREF(func); + return result; + } + #endif + + /* Default setfunc to be used as CFieldObject.setfunc when the field type + doesn't supply its own getfunc. + */ + static PyObject * + _generic_field_setfunc(char *ptr, PyObject *value, unsigned size, + PyObject *type, CDataObject *dst) + { + /* inlined code from _CData_set() */ + if (CDataObject_Check(value)) { + CDataObject *src = (CDataObject *)value; + + /* same type */ + if (PyObject_IsInstance(value, type)) { + memmove(ptr, + src->b_ptr, + size); + value = GetKeepedObjects(src); + Py_INCREF(value); + return value; + } + + /* field type: X* + value type: X[] + */ + if (PointerTypeObject_Check(type) + && ArrayObject_Check(value) + && PyObject_stgdict(value)->proto == PyType_stgdict(type)->proto) { + *(void **)ptr = src->b_ptr; + /* We need to keep the array alive, not just the arrays b_objects. */ + Py_INCREF(value); + return value; + } + } else { + /* Not a CDataObject instance */ + if (PyTuple_Check(value)) { + /* If value is a tuple, we call the type with the tuple + and use the result */ + PyObject *ob; + PyObject *result; + ob = PyObject_CallObject(type, value); + if (ob == NULL) { + Extend_Error_Info(PyExc_RuntimeError, "(%s) ", + ((PyTypeObject *)type)->tp_name); + return NULL; + } + result = _generic_field_setfunc(ptr, ob, size, type, dst); + Py_DECREF(ob); + return result; + } + + if (value == Py_None && PointerTypeObject_Check(type)) { + *(void **)ptr = NULL; + Py_INCREF(Py_None); + return Py_None; + } + } + PyErr_Format(PyExc_TypeError, + "Incompatible types %s instance instead of %s instance", + value->ob_type->tp_name, + ((PyTypeObject *)type)->tp_name); + return NULL; + } + /* Default getfunc to be used in CFieldObject when the field type doesn't ! supply its own getfunc. */ static PyObject * *************** *** 137,141 **** #endif ! setfunc = dict->setfunc; /* Currently, dict->getfunc is only != NULL for SimpleCData types. --- 219,230 ---- #endif ! #ifdef EXPERIMENTAL ! if (PyObject_HasAttrString(desc, "__to_field__")) ! setfunc = _overloaded_field_setfunc; ! else ! setfunc = dict->setfunc ? dict->setfunc : _generic_field_setfunc; ! #else ! setfunc = dict->setfunc ? dict->setfunc : _generic_field_setfunc; ! #endif /* Currently, dict->getfunc is only != NULL for SimpleCData types. *************** *** 232,306 **** } - static PyObject * - _CField_set(char *ptr, int size, - PyObject *type, CDataObject *dst, PyObject *value) - { - /* inlined code from _CData_set() */ - if (CDataObject_Check(value)) { - CDataObject *src = (CDataObject *)value; - - /* same type */ - if (PyObject_IsInstance(value, type)) { - memmove(ptr, - src->b_ptr, - size); - value = GetKeepedObjects(src); - Py_INCREF(value); - return value; - } - - /* field type: X* - value type: X[] - */ - if (PointerTypeObject_Check(type) - && ArrayObject_Check(value) - && PyObject_stgdict(value)->proto == PyType_stgdict(type)->proto) { - *(void **)ptr = src->b_ptr; - /* We need to keep the array alive, not just the arrays b_objects. */ - Py_INCREF(value); - return value; - } - } else { - /* Not a CDataObject instance */ - if (PyTuple_Check(value)) { - /* If value is a tuple, we call the type with the tuple - and use the result */ - PyObject *ob; - PyObject *result; - ob = PyObject_CallObject(type, value); - if (ob == NULL) { - Extend_Error_Info(PyExc_RuntimeError, "(%s) ", - ((PyTypeObject *)type)->tp_name); - return NULL; - } - result = _CField_set(ptr, size, type, dst, ob); - Py_DECREF(ob); - return result; - } - - if (value == Py_None && PointerTypeObject_Check(type)) { - *(void **)ptr = NULL; - Py_INCREF(Py_None); - return Py_None; - } - } - PyErr_Format(PyExc_TypeError, - "Incompatible types %s instance instead of %s instance", - value->ob_type->tp_name, - ((PyTypeObject *)type)->tp_name); - return NULL; - } - static int CField_set(CFieldObject *self, CDataObject *dst, PyObject *value) { ! char *ptr = dst->b_ptr + self->offset; ! PyObject *result; ! ! if (self->setfunc) ! result = self->setfunc(ptr, value, self->size); ! else ! result = _CField_set(ptr, self->size, ! self->fieldtype, dst, value); if (result == NULL) return -1; --- 321,330 ---- } static int CField_set(CFieldObject *self, CDataObject *dst, PyObject *value) { ! PyObject *result = self->setfunc(dst->b_ptr + self->offset, ! value, self->size, ! self->fieldtype, dst); if (result == NULL) return -1; |
From: Thomas H. <th...@us...> - 2005-03-24 10:09:39
|
Update of /cvsroot/ctypes/ctypes/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv19543 Modified Files: ctypes.h Log Message: Fix typo. Index: ctypes.h =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/ctypes.h,v retrieving revision 1.79 retrieving revision 1.80 diff -C2 -d -r1.79 -r1.80 *** ctypes.h 24 Mar 2005 09:50:39 -0000 1.79 --- ctypes.h 24 Mar 2005 10:09:29 -0000 1.80 *************** *** 243,247 **** int index, char *adr); ! extern intKeepRef(CDataObject *target, int index, PyObject *keep); extern PyObject *GetKeepedObjects(CDataObject *target); --- 243,247 ---- int index, char *adr); ! extern int KeepRef(CDataObject *target, int index, PyObject *keep); extern PyObject *GetKeepedObjects(CDataObject *target); |
From: Thomas H. <th...@us...> - 2005-03-24 10:05:09
|
Update of /cvsroot/ctypes/ctypes/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv17398 Modified Files: cfield.c Log Message: Changed signature of _CField_set to be compatible with SETFUNC. Index: cfield.c =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/cfield.c,v retrieving revision 1.83 retrieving revision 1.84 diff -C2 -d -r1.83 -r1.84 *** cfield.c 24 Mar 2005 09:59:03 -0000 1.83 --- cfield.c 24 Mar 2005 10:04:57 -0000 1.84 *************** *** 233,238 **** static PyObject * ! _CField_set(CDataObject *dst, PyObject *type, PyObject *value, ! int size, char *ptr) { /* inlined code from _CData_set() */ --- 233,238 ---- static PyObject * ! _CField_set(char *ptr, int size, ! PyObject *type, CDataObject *dst, PyObject *value) { /* inlined code from _CData_set() */ *************** *** 274,278 **** return NULL; } ! result = _CField_set(dst, type, ob, size, ptr); Py_DECREF(ob); return result; --- 274,278 ---- return NULL; } ! result = _CField_set(ptr, size, type, dst, ob); Py_DECREF(ob); return result; *************** *** 301,306 **** result = self->setfunc(ptr, value, self->size); else ! result = _CField_set(dst, self->fieldtype, value, ! self->size, ptr); if (result == NULL) return -1; --- 301,306 ---- result = self->setfunc(ptr, value, self->size); else ! result = _CField_set(ptr, self->size, ! self->fieldtype, dst, value); if (result == NULL) return -1; |
From: Thomas H. <th...@us...> - 2005-03-24 09:59:12
|
Update of /cvsroot/ctypes/ctypes/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv14415 Modified Files: cfield.c Log Message: Small simplification in _CField_set by copying setfunc in CField_FromDesc. Index: cfield.c =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/cfield.c,v retrieving revision 1.82 retrieving revision 1.83 diff -C2 -d -r1.82 -r1.83 *** cfield.c 24 Mar 2005 09:52:46 -0000 1.82 --- cfield.c 24 Mar 2005 09:59:03 -0000 1.83 *************** *** 137,140 **** --- 137,142 ---- #endif + setfunc = dict->setfunc; + /* Currently, dict->getfunc is only != NULL for SimpleCData types. If we would set it for array types, we could get rid of the *************** *** 261,272 **** } else { /* Not a CDataObject instance */ - StgDictObject *dict = PyType_stgdict(type); - - /* This could be avoided if setfucn were set in the - CFieldObject constructor. - */ - if (dict && dict->setfunc) - return dict->setfunc(ptr, value, size); - if (PyTuple_Check(value)) { /* If value is a tuple, we call the type with the tuple --- 263,266 ---- |
From: Thomas H. <th...@us...> - 2005-03-24 09:52:56
|
Update of /cvsroot/ctypes/ctypes/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv10285 Modified Files: cfield.c Log Message: Refactoring: inline the _CData_set code into CField_set. Index: cfield.c =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/cfield.c,v retrieving revision 1.81 retrieving revision 1.82 diff -C2 -d -r1.81 -r1.82 *** cfield.c 23 Mar 2005 20:25:50 -0000 1.81 --- cfield.c 24 Mar 2005 09:52:46 -0000 1.82 *************** *** 8,11 **** --- 8,13 ---- #endif + #define EXPERIMENTAL + /******************************************************************/ /* *************** *** 40,44 **** { PyObject *result; - PyObject *arg; PyObject *func = PyObject_GetAttrString(fieldtype, "__from_field__"); if (func == NULL) --- 42,45 ---- *************** *** 229,242 **** } static int ! CField_set(CFieldObject *self, PyObject *inst, PyObject *value) { ! CDataObject *dst; ! char *ptr; ! assert(CDataObject_Check(inst)); ! dst = (CDataObject *)inst; ! ptr = dst->b_ptr + self->offset; ! return CData_set(inst, self->fieldtype, self->setfunc, value, ! self->index, self->size, ptr); } --- 230,315 ---- } + static PyObject * + _CField_set(CDataObject *dst, PyObject *type, PyObject *value, + int size, char *ptr) + { + /* inlined code from _CData_set() */ + if (CDataObject_Check(value)) { + CDataObject *src = (CDataObject *)value; + + /* same type */ + if (PyObject_IsInstance(value, type)) { + memmove(ptr, + src->b_ptr, + size); + value = GetKeepedObjects(src); + Py_INCREF(value); + return value; + } + + /* field type: X* + value type: X[] + */ + if (PointerTypeObject_Check(type) + && ArrayObject_Check(value) + && PyObject_stgdict(value)->proto == PyType_stgdict(type)->proto) { + *(void **)ptr = src->b_ptr; + /* We need to keep the array alive, not just the arrays b_objects. */ + Py_INCREF(value); + return value; + } + } else { + /* Not a CDataObject instance */ + StgDictObject *dict = PyType_stgdict(type); + + /* This could be avoided if setfucn were set in the + CFieldObject constructor. + */ + if (dict && dict->setfunc) + return dict->setfunc(ptr, value, size); + + if (PyTuple_Check(value)) { + /* If value is a tuple, we call the type with the tuple + and use the result */ + PyObject *ob; + PyObject *result; + ob = PyObject_CallObject(type, value); + if (ob == NULL) { + Extend_Error_Info(PyExc_RuntimeError, "(%s) ", + ((PyTypeObject *)type)->tp_name); + return NULL; + } + result = _CField_set(dst, type, ob, size, ptr); + Py_DECREF(ob); + return result; + } + + if (value == Py_None && PointerTypeObject_Check(type)) { + *(void **)ptr = NULL; + Py_INCREF(Py_None); + return Py_None; + } + } + PyErr_Format(PyExc_TypeError, + "Incompatible types %s instance instead of %s instance", + value->ob_type->tp_name, + ((PyTypeObject *)type)->tp_name); + return NULL; + } + static int ! CField_set(CFieldObject *self, CDataObject *dst, PyObject *value) { ! char *ptr = dst->b_ptr + self->offset; ! PyObject *result; ! ! if (self->setfunc) ! result = self->setfunc(ptr, value, self->size); ! else ! result = _CField_set(dst, self->fieldtype, value, ! self->size, ptr); ! if (result == NULL) ! return -1; ! return KeepRef(dst, self->index, result); } *************** *** 248,252 **** return (PyObject *)self; } - return self->getfunc(src->b_ptr + self->offset, self->size, self->fieldtype, src, --- 321,324 ---- |
From: Thomas H. <th...@us...> - 2005-03-24 09:50:52
|
Update of /cvsroot/ctypes/ctypes/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv9048 Modified Files: ctypes.h _ctypes.c Log Message: Make GetKeepedRefs and KeepRefs functions global. Index: ctypes.h =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/ctypes.h,v retrieving revision 1.78 retrieving revision 1.79 diff -C2 -d -r1.78 -r1.79 *** ctypes.h 23 Mar 2005 18:38:14 -0000 1.78 --- ctypes.h 24 Mar 2005 09:50:39 -0000 1.79 *************** *** 181,184 **** --- 181,186 ---- /**************************************************************** + XXX No longer correct - update this when finished. + StgDictObject fields *************** *** 238,243 **** PyObject *checker); ! extern PyObject * ! CData_FromBaseObj(PyObject *type, PyObject *base, int index, char *adr); #define FUNCFLAG_STDCALL 0x0 --- 240,250 ---- PyObject *checker); ! extern PyObject *CData_FromBaseObj(PyObject *type, PyObject *base, ! int index, char *adr); ! ! extern intKeepRef(CDataObject *target, int index, PyObject *keep); ! ! extern PyObject *GetKeepedObjects(CDataObject *target); ! #define FUNCFLAG_STDCALL 0x0 Index: _ctypes.c =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/_ctypes.c,v retrieving revision 1.231 retrieving revision 1.232 diff -C2 -d -r1.231 -r1.232 *** _ctypes.c 24 Mar 2005 09:04:21 -0000 1.231 --- _ctypes.c 24 Mar 2005 09:50:39 -0000 1.232 *************** *** 1628,1632 **** } ! static PyObject * GetKeepedObjects(CDataObject *target) { --- 1628,1632 ---- } ! PyObject * GetKeepedObjects(CDataObject *target) { *************** *** 1655,1659 **** * key int the root object's _objects dict. */ ! static int KeepRef(CDataObject *target, int index, PyObject *keep) { --- 1655,1659 ---- * key int the root object's _objects dict. */ ! int KeepRef(CDataObject *target, int index, PyObject *keep) { |
From: Thomas H. <th...@us...> - 2005-03-24 09:04:30
|
Update of /cvsroot/ctypes/ctypes/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv14367 Modified Files: _ctypes.c Log Message: Plug a refcount leak. Index: _ctypes.c =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/_ctypes.c,v retrieving revision 1.230 retrieving revision 1.231 diff -C2 -d -r1.230 -r1.231 *** _ctypes.c 24 Mar 2005 08:27:55 -0000 1.230 --- _ctypes.c 24 Mar 2005 09:04:21 -0000 1.231 *************** *** 1935,1938 **** --- 1935,1939 ---- if (PyTuple_Check(value)) { PyObject *ob; + PyObject *result; ob = PyObject_CallObject(type, value); if (ob == NULL) { *************** *** 1941,1947 **** return NULL; } ! /* Doesn't this leak a ref to 'ob'? */ ! return _CData_set(dst, type, setfunc, ob, ! size, ptr); } else if (value == Py_None && PointerTypeObject_Check(type)) { *(void **)dst->b_ptr = NULL; --- 1942,1949 ---- return NULL; } ! result = _CData_set(dst, type, setfunc, ob, ! size, ptr); ! Py_DECREF(ob); ! return result; } else if (value == Py_None && PointerTypeObject_Check(type)) { *(void **)dst->b_ptr = NULL; |
From: Thomas H. <th...@us...> - 2005-03-24 08:28:03
|
Update of /cvsroot/ctypes/ctypes/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv25184 Modified Files: _ctypes.c Log Message: Todo. Index: _ctypes.c =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/_ctypes.c,v retrieving revision 1.229 retrieving revision 1.230 diff -C2 -d -r1.229 -r1.230 *** _ctypes.c 24 Mar 2005 08:10:28 -0000 1.229 --- _ctypes.c 24 Mar 2005 08:27:55 -0000 1.230 *************** *** 1941,1944 **** --- 1941,1945 ---- return NULL; } + /* Doesn't this leak a ref to 'ob'? */ return _CData_set(dst, type, setfunc, ob, size, ptr); |
From: Thomas H. <th...@us...> - 2005-03-24 08:10:38
|
Update of /cvsroot/ctypes/ctypes/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv14636 Modified Files: _ctypes.c Log Message: Add todo-style comment. Index: _ctypes.c =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/_ctypes.c,v retrieving revision 1.228 retrieving revision 1.229 diff -C2 -d -r1.228 -r1.229 *** _ctypes.c 23 Mar 2005 17:33:07 -0000 1.228 --- _ctypes.c 24 Mar 2005 08:10:28 -0000 1.229 *************** *** 1995,1998 **** --- 1995,2004 ---- b_objects list PLUS the array itself, and return that! */ + + /* + I don't think the above really makes sense. Since the + array object already contains it's own b_objects if should + be sufficient to return src here. + */ return Py_BuildValue("(OO)", keep, value); } |
From: Thomas H. <th...@us...> - 2005-03-23 20:26:05
|
Update of /cvsroot/ctypes/ctypes/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv23557 Modified Files: cfield.c Log Message: It is now (in principle) possible to customize getting structure fields by implementing a __from_field__ classmethod on the structure field type. CField_FromDesc() checks if a __from_field__ attribute exists on the type, and if so installs _overloaded_field_getfunc() in the CFieldObject's getfunc slot. The __from__field__ method receives an int/long representing the field address. The source changes are #ifdef'd out currently. Index: cfield.c =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/cfield.c,v retrieving revision 1.80 retrieving revision 1.81 diff -C2 -d -r1.80 -r1.81 *** cfield.c 23 Mar 2005 18:38:14 -0000 1.80 --- cfield.c 23 Mar 2005 20:25:50 -0000 1.81 *************** *** 32,35 **** --- 32,55 ---- } + #ifdef EXPERIMENTAL + /* getfunc overloaded by a __from_field__ callable on the fieldtype */ + static PyObject * + _overloaded_field_getfunc(void *ptr, unsigned size, + PyObject *fieldtype, CDataObject *src, + int index) + { + PyObject *result; + PyObject *arg; + PyObject *func = PyObject_GetAttrString(fieldtype, "__from_field__"); + if (func == NULL) + return NULL; + result = PyObject_CallFunctionObjArgs(func, + PyLong_FromVoidPtr(ptr), NULL); + Py_DECREF(func); + return result; + } + #endif + + /* * Expects the size, index and offset for the current field in *psize and *************** *** 107,111 **** --- 127,138 ---- length = dict->length; + #ifdef EXPERIMENTAL + if (PyObject_HasAttrString(desc, "__from_field__")) + getfunc = _overloaded_field_getfunc; + else + getfunc = dict->getfunc ? dict->getfunc : _generic_field_getfunc; + #else getfunc = dict->getfunc ? dict->getfunc : _generic_field_getfunc; + #endif /* Currently, dict->getfunc is only != NULL for SimpleCData types. |
From: Thomas H. <th...@us...> - 2005-03-23 18:38:30
|
Update of /cvsroot/ctypes/ctypes/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv4136 Modified Files: ctypes.h cfield.c Log Message: A getfunc is now always set in the CFieldObject constructor. This makes the CField_get() implementation trivial. Index: ctypes.h =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/ctypes.h,v retrieving revision 1.77 retrieving revision 1.78 diff -C2 -d -r1.77 -r1.78 *** ctypes.h 23 Mar 2005 17:33:07 -0000 1.77 --- ctypes.h 23 Mar 2005 18:38:14 -0000 1.78 *************** *** 125,128 **** --- 125,132 ---- extern PyMethodDef module_methods[]; + /* XXX The code in cfield.c calls GETFUNC with more parameters. Once this is + also true for code in other files, the full signature should be used here. + Or we should have FIELDGETFUNC... + */ typedef PyObject *(* GETFUNC)(void *, unsigned size, ...); typedef PyObject *(* SETFUNC)(void *, PyObject *value, unsigned size); Index: cfield.c =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/cfield.c,v retrieving revision 1.79 retrieving revision 1.80 diff -C2 -d -r1.79 -r1.80 *** cfield.c 23 Mar 2005 17:17:29 -0000 1.79 --- cfield.c 23 Mar 2005 18:38:14 -0000 1.80 *************** *** 20,23 **** --- 20,35 ---- } + /* Default getfunc to be used in CFieldObject when the field type doesn't + supply a custom getfunc. + */ + static PyObject * + _generic_field_getfunc(void *ptr, unsigned size, + PyObject *fieldtype, CDataObject *src, + int index) + { + return CData_FromBaseObj(fieldtype, (PyObject *)src, + index, ptr); + } + /* * Expects the size, index and offset for the current field in *psize and *************** *** 95,99 **** length = dict->length; ! getfunc = dict->getfunc; /* Currently, dict->getfunc is only != NULL for SimpleCData types. --- 107,111 ---- length = dict->length; ! getfunc = dict->getfunc ? dict->getfunc : _generic_field_getfunc; /* Currently, dict->getfunc is only != NULL for SimpleCData types. *************** *** 210,218 **** } ! if (self->getfunc) ! return self->getfunc(src->b_ptr + self->offset, self->size); ! ! return CData_FromBaseObj(self->fieldtype, (PyObject *)src, ! self->index, src->b_ptr + self->offset); } --- 222,228 ---- } ! return self->getfunc(src->b_ptr + self->offset, self->size, ! self->fieldtype, src, ! self->index); } |
From: Thomas H. <th...@us...> - 2005-03-23 17:33:17
|
Update of /cvsroot/ctypes/ctypes/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv5323 Modified Files: ctypes.h _ctypes.c Log Message: CData_get can now be static instead of global. Index: ctypes.h =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/ctypes.h,v retrieving revision 1.76 retrieving revision 1.77 diff -C2 -d -r1.76 -r1.77 *** ctypes.h 23 Mar 2005 17:06:52 -0000 1.76 --- ctypes.h 23 Mar 2005 17:33:07 -0000 1.77 *************** *** 125,129 **** extern PyMethodDef module_methods[]; ! typedef PyObject *(* GETFUNC)(void *, unsigned size); typedef PyObject *(* SETFUNC)(void *, PyObject *value, unsigned size); --- 125,129 ---- extern PyMethodDef module_methods[]; ! typedef PyObject *(* GETFUNC)(void *, unsigned size, ...); typedef PyObject *(* SETFUNC)(void *, PyObject *value, unsigned size); *************** *** 270,277 **** extern PyCArgObject *new_CArgObject(void); - extern PyObject * - CData_get(PyObject *type, GETFUNC getfunc, PyObject *src, - int index, int size, char *ptr); - extern int CData_set(PyObject *dst, PyObject *type, SETFUNC setfunc, PyObject *value, --- 270,273 ---- Index: _ctypes.c =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/_ctypes.c,v retrieving revision 1.227 retrieving revision 1.228 diff -C2 -d -r1.227 -r1.228 *** _ctypes.c 23 Mar 2005 16:58:47 -0000 1.227 --- _ctypes.c 23 Mar 2005 17:33:07 -0000 1.228 *************** *** 1896,1900 **** } ! PyObject * CData_get(PyObject *type, GETFUNC getfunc, PyObject *src, int index, int size, char *adr) --- 1896,1900 ---- } ! static PyObject * CData_get(PyObject *type, GETFUNC getfunc, PyObject *src, int index, int size, char *adr) |
From: Thomas H. <th...@us...> - 2005-03-23 17:17:38
|
Update of /cvsroot/ctypes/ctypes/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv30025 Modified Files: cfield.c Log Message: Remove unused local variable. Index: cfield.c =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/cfield.c,v retrieving revision 1.78 retrieving revision 1.79 diff -C2 -d -r1.78 -r1.79 *** cfield.c 23 Mar 2005 17:16:44 -0000 1.78 --- cfield.c 23 Mar 2005 17:17:29 -0000 1.79 *************** *** 205,210 **** CField_get(CFieldObject *self, CDataObject *src, PyTypeObject *type) { - StgDictObject *dict; - if (src == NULL) { Py_INCREF(self); --- 205,208 ---- |
From: Thomas H. <th...@us...> - 2005-03-23 17:16:54
|
Update of /cvsroot/ctypes/ctypes/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv29617 Modified Files: cfield.c Log Message: Further simplify CField_get by filling the getfunc of CFieldObjects at construction time. Index: cfield.c =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/cfield.c,v retrieving revision 1.77 retrieving revision 1.78 diff -C2 -d -r1.77 -r1.78 *** cfield.c 23 Mar 2005 17:08:47 -0000 1.77 --- cfield.c 23 Mar 2005 17:16:44 -0000 1.78 *************** *** 95,99 **** length = dict->length; ! /* Field descriptors for 'c_char * n' are be scpecial cased to return a Python string instead of an Array object instance... */ --- 95,105 ---- length = dict->length; ! getfunc = dict->getfunc; ! ! /* Currently, dict->getfunc is only != NULL for SimpleCData types. ! If we would set it for array types, we could get rid of the ! following code block. ! */ ! /* Field descriptors for 'c_char * n' are be special cased to return a Python string instead of an Array object instance... */ *************** *** 209,219 **** return self->getfunc(src->b_ptr + self->offset, self->size); - /* If we would set self->getfunc in the CFieldObject constructor, - we could delete the following 3 lines of code - */ - dict = PyType_stgdict(self->fieldtype); - if (dict && dict->getfunc) - return dict->getfunc(src->b_ptr + self->offset, self->size); - return CData_FromBaseObj(self->fieldtype, (PyObject *)src, self->index, src->b_ptr + self->offset); --- 215,218 ---- |
From: Thomas H. <th...@us...> - 2005-03-23 17:09:01
|
Update of /cvsroot/ctypes/ctypes/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv26083 Modified Files: cfield.c Log Message: Get rid of unneeded local variable. Index: cfield.c =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/cfield.c,v retrieving revision 1.76 retrieving revision 1.77 diff -C2 -d -r1.76 -r1.77 *** cfield.c 23 Mar 2005 17:06:52 -0000 1.76 --- cfield.c 23 Mar 2005 17:08:47 -0000 1.77 *************** *** 38,42 **** { CFieldObject *self; - PyObject *proto; int size, align, length; SETFUNC setfunc = NULL; --- 38,41 ---- *************** *** 95,105 **** size = dict->size; length = dict->length; - proto = desc; /* Field descriptors for 'c_char * n' are be scpecial cased to return a Python string instead of an Array object instance... */ ! if (ArrayTypeObject_Check(proto)) { ! StgDictObject *adict = PyType_stgdict(proto); StgDictObject *idict; if (adict && adict->proto) { --- 94,103 ---- size = dict->size; length = dict->length; /* Field descriptors for 'c_char * n' are be scpecial cased to return a Python string instead of an Array object instance... */ ! if (ArrayTypeObject_Check(desc)) { ! StgDictObject *adict = PyType_stgdict(desc); StgDictObject *idict; if (adict && adict->proto) { *************** *** 124,129 **** self->index = index; ! Py_XINCREF(proto); ! self->fieldtype = proto; switch (fieldtype) { --- 122,127 ---- self->index = index; ! Py_XINCREF(desc); ! self->fieldtype = desc; switch (fieldtype) { |
From: Thomas H. <th...@us...> - 2005-03-23 17:07:05
|
Update of /cvsroot/ctypes/ctypes/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv25182 Modified Files: ctypes.h cfield.c Log Message: Rename the 'proto' member in CFieldObject to 'fieldtype'. Index: ctypes.h =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/ctypes.h,v retrieving revision 1.75 retrieving revision 1.76 diff -C2 -d -r1.75 -r1.76 *** ctypes.h 23 Mar 2005 16:58:47 -0000 1.75 --- ctypes.h 23 Mar 2005 17:06:52 -0000 1.76 *************** *** 143,147 **** int index; /* Index into CDataObject's object array */ ! PyObject *proto; /* a type or NULL */ GETFUNC getfunc; /* getter function if proto is NULL */ SETFUNC setfunc; /* setter function if proto is NULL */ --- 143,147 ---- int index; /* Index into CDataObject's object array */ ! PyObject *fieldtype; /* ctypes type of field */ GETFUNC getfunc; /* getter function if proto is NULL */ SETFUNC setfunc; /* setter function if proto is NULL */ Index: cfield.c =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/cfield.c,v retrieving revision 1.75 retrieving revision 1.76 diff -C2 -d -r1.75 -r1.76 *** cfield.c 23 Mar 2005 17:01:36 -0000 1.75 --- cfield.c 23 Mar 2005 17:06:52 -0000 1.76 *************** *** 125,129 **** Py_XINCREF(proto); ! self->proto = proto; switch (fieldtype) { --- 125,129 ---- Py_XINCREF(proto); ! self->fieldtype = proto; switch (fieldtype) { *************** *** 194,198 **** dst = (CDataObject *)inst; ptr = dst->b_ptr + self->offset; ! return CData_set(inst, self->proto, self->setfunc, value, self->index, self->size, ptr); } --- 194,198 ---- dst = (CDataObject *)inst; ptr = dst->b_ptr + self->offset; ! return CData_set(inst, self->fieldtype, self->setfunc, value, self->index, self->size, ptr); } *************** *** 214,222 **** we could delete the following 3 lines of code */ ! dict = PyType_stgdict(self->proto); if (dict && dict->getfunc) return dict->getfunc(src->b_ptr + self->offset, self->size); ! return CData_FromBaseObj(self->proto, (PyObject *)src, self->index, src->b_ptr + self->offset); } --- 214,222 ---- we could delete the following 3 lines of code */ ! dict = PyType_stgdict(self->fieldtype); if (dict && dict->getfunc) return dict->getfunc(src->b_ptr + self->offset, self->size); ! return CData_FromBaseObj(self->fieldtype, (PyObject *)src, self->index, src->b_ptr + self->offset); } *************** *** 235,239 **** CField_traverse(CFieldObject *self, visitproc visit, void *arg) { ! Py_VISIT(self->proto); return 0; } --- 235,239 ---- CField_traverse(CFieldObject *self, visitproc visit, void *arg) { ! Py_VISIT(self->fieldtype); return 0; } *************** *** 242,246 **** CField_clear(CFieldObject *self) { ! Py_CLEAR(self->proto); return 0; } --- 242,246 ---- CField_clear(CFieldObject *self) { ! Py_CLEAR(self->fieldtype); return 0; } *************** *** 261,265 **** char *name; ! name = ((PyTypeObject *)self->proto)->tp_name; if (bits) --- 261,265 ---- char *name; ! name = ((PyTypeObject *)self->fieldtype)->tp_name; if (bits) |
From: Thomas H. <th...@us...> - 2005-03-23 17:01:47
|
Update of /cvsroot/ctypes/ctypes/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv22699 Modified Files: cfield.c Log Message: Make it clearer what the code does by NOT calling CData_get in CField_get. Todo comment for the next improvement. Index: cfield.c =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/cfield.c,v retrieving revision 1.74 retrieving revision 1.75 diff -C2 -d -r1.74 -r1.75 *** cfield.c 9 Mar 2005 15:45:05 -0000 1.74 --- cfield.c 23 Mar 2005 17:01:36 -0000 1.75 *************** *** 199,213 **** static PyObject * ! CField_get(CFieldObject *self, PyObject *inst, PyTypeObject *type) { ! CDataObject *src; ! if (inst == NULL) { Py_INCREF(self); return (PyObject *)self; } ! assert(CDataObject_Check(inst)); ! src = (CDataObject *)inst; ! return CData_get(self->proto, self->getfunc, inst, ! self->index, self->size, src->b_ptr + self->offset); } --- 199,223 ---- static PyObject * ! CField_get(CFieldObject *self, CDataObject *src, PyTypeObject *type) { ! StgDictObject *dict; ! ! if (src == NULL) { Py_INCREF(self); return (PyObject *)self; } ! ! if (self->getfunc) ! return self->getfunc(src->b_ptr + self->offset, self->size); ! ! /* If we would set self->getfunc in the CFieldObject constructor, ! we could delete the following 3 lines of code ! */ ! dict = PyType_stgdict(self->proto); ! if (dict && dict->getfunc) ! return dict->getfunc(src->b_ptr + self->offset, self->size); ! ! return CData_FromBaseObj(self->proto, (PyObject *)src, ! self->index, src->b_ptr + self->offset); } |
From: Thomas H. <th...@us...> - 2005-03-23 16:58:57
|
Update of /cvsroot/ctypes/ctypes/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv21181 Modified Files: ctypes.h _ctypes.c Log Message: Make CData_FromBaseObj() global. Index: ctypes.h =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/ctypes.h,v retrieving revision 1.74 retrieving revision 1.75 diff -C2 -d -r1.74 -r1.75 *** ctypes.h 16 Mar 2005 17:50:25 -0000 1.74 --- ctypes.h 23 Mar 2005 16:58:47 -0000 1.75 *************** *** 139,143 **** PyObject_HEAD int offset; ! int size; int index; /* Index into CDataObject's object array */ --- 139,144 ---- PyObject_HEAD int offset; ! int size; /* for bitfields, contains bitoffset and bitcount */ ! int index; /* Index into CDataObject's object array */ *************** *** 225,236 **** typedef int(* PPROC)(void); ! PyObject *_CallProc(PPROC pProc, ! PyObject *arguments, ! void *pIUnk, ! int flags, ! PyObject *argtypes, ! PyObject *restype, ! PyObject *checker); #define FUNCFLAG_STDCALL 0x0 --- 226,239 ---- typedef int(* PPROC)(void); ! extern PyObject *_CallProc(PPROC pProc, ! PyObject *arguments, ! void *pIUnk, ! int flags, ! PyObject *argtypes, ! PyObject *restype, ! PyObject *checker); + extern PyObject * + CData_FromBaseObj(PyObject *type, PyObject *base, int index, char *adr); #define FUNCFLAG_STDCALL 0x0 Index: _ctypes.c =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/_ctypes.c,v retrieving revision 1.226 retrieving revision 1.227 diff -C2 -d -r1.226 -r1.227 *** _ctypes.c 16 Mar 2005 19:58:45 -0000 1.226 --- _ctypes.c 23 Mar 2005 16:58:47 -0000 1.227 *************** *** 1853,1857 **** Fix later. */ ! static PyObject * CData_FromBaseObj(PyObject *type, PyObject *base, int index, char *adr) { --- 1853,1857 ---- Fix later. */ ! PyObject * CData_FromBaseObj(PyObject *type, PyObject *base, int index, char *adr) { |
From: Thomas H. <th...@us...> - 2005-03-22 15:22:44
|
Update of /cvsroot/ctypes/ctypes/comtypes In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv14585 Modified Files: __init__.py Log Message: A better way to create properties. Index: __init__.py =================================================================== RCS file: /cvsroot/ctypes/ctypes/comtypes/__init__.py,v retrieving revision 1.26 retrieving revision 1.27 diff -C2 -d -r1.26 -r1.27 *** __init__.py 21 Mar 2005 12:49:23 -0000 1.26 --- __init__.py 22 Mar 2005 15:22:30 -0000 1.27 *************** *** 124,129 **** vtbl_offset = self.__get_baseinterface_methodcount() ! getters = {} ! setters = {} # create private low level, and public high level methods --- 124,128 ---- vtbl_offset = self.__get_baseinterface_methodcount() ! props = {} # create private low level, and public high level methods *************** *** 154,177 **** # Seems we loose then, at least for properties... - # The following code assumes that the docstrings for - # propget and propput are identical. if "propget" in idlflags: assert name.startswith("_get_") nargs = len([flags for flags in paramflags if flags[0] & 1]) ! propname = name[len("_get_"):] ! getters[propname, doc, nargs] = func ! is_prop = True elif "propput" in idlflags: assert name.startswith("_set_") - nargs = len([flags for flags in paramflags - if flags[0] & 1]) - 1 propname = name[len("_set_"):] - setters[propname, doc, nargs] = func is_prop = True # We install the method in the class, except when it's a ! # property accessor. And we make sure we don't overwrite ! # a property that's already present in the class. if not is_prop: if hasattr(self, name): --- 153,179 ---- # Seems we loose then, at least for properties... if "propget" in idlflags: assert name.startswith("_get_") + is_prop = True nargs = len([flags for flags in paramflags if flags[0] & 1]) ! props.setdefault((name[len("_get_"):], nargs), ! # fget, fset, doc ! [None, None, doc])[0] = func elif "propput" in idlflags: assert name.startswith("_set_") propname = name[len("_set_"):] is_prop = True + nargs = len([flags for flags in paramflags + if flags[0] & 1]) + # One arg is the standard value putted, we don't count that. + props.setdefault((name[len("_set_"):], nargs-1), + # fget, fset, doc + [None, None, doc])[1] = func # We install the method in the class, except when it's a ! # property. And we make sure we don't overwrite something ! # that's already present in the class. Except when it ! # starts with an underscore. Hm. if not is_prop: if hasattr(self, name): *************** *** 180,195 **** setattr(self, name, mth) ! # create public properties / attribute accessors ! for item in set(getters.keys()) | set(getters.keys()): ! name, doc, nargs = item if nargs == 0: ! prop = property(getters.get(item), setters.get(item), doc=doc) else: ! # Hm, must be a descriptor where the __get__ method ! # returns a bound object having __getitem__ and ! # __setitem__ methods. ! prop = named_property(getters.get(item), setters.get(item), doc=doc) ! # Again, we should not overwrite class attributes that are ! # already present. if hasattr(self, name): setattr(self, "_" + name, prop) --- 182,194 ---- setattr(self, name, mth) ! # create and attach the properties ! for ((name, nargs), (fget, fset, doc)) in props.items(): if nargs == 0: ! prop = property(fget, fset, doc=doc) else: ! # Hm, we must create a descriptor where the __get__ ! # method returns a bound object having __getitem__ ! # and/or __setitem__ methods. ! prop = named_property(fget, fset, doc=doc) if hasattr(self, name): setattr(self, "_" + name, prop) *************** *** 198,220 **** class bound_named_property(object): ! def __init__(self, getter, setter, im_inst): self.im_inst = im_inst ! self.getter = getter ! self.setter = setter def __getitem__(self, index): ! if self.getter is None: raise TypeError("unsubscriptable object") ! return self.getter(self.im_inst, index) def __setitem__(self, index, value): ! if self.setter is None: raise TypeError("object does not support item assignment") ! self.setter(self.im_inst, index, value) class named_property(object): ! def __init__(self, getter, setter, doc): ! self.getter = getter ! self.setter = setter self.doc = doc --- 197,219 ---- class bound_named_property(object): ! def __init__(self, fget, fset, im_inst): self.im_inst = im_inst ! self.fget = fget ! self.fset = fset def __getitem__(self, index): ! if self.fget is None: raise TypeError("unsubscriptable object") ! return self.fget(self.im_inst, index) def __setitem__(self, index, value): ! if self.fset is None: raise TypeError("object does not support item assignment") ! self.fset(self.im_inst, index, value) class named_property(object): ! def __init__(self, fget, fset, doc): ! self.fget = fget ! self.fset = fset self.doc = doc *************** *** 222,226 **** if im_inst is None: return self ! return bound_named_property(self.getter, self.setter, im_inst) # metaclass for COM interface pointer classes --- 221,225 ---- if im_inst is None: return self ! return bound_named_property(self.fget, self.fset, im_inst) # metaclass for COM interface pointer classes |
From: Thomas H. <th...@us...> - 2005-03-22 15:22:14
|
Update of /cvsroot/ctypes/ctypes/comtypes/tools In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv14095 Modified Files: tlbparser.py Log Message: Correct the idlflags parsing both for coclass and interface/dispinterface. Index: tlbparser.py =================================================================== RCS file: /cvsroot/ctypes/ctypes/comtypes/tools/tlbparser.py,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** tlbparser.py 22 Mar 2005 12:30:14 -0000 1.5 --- tlbparser.py 22 Mar 2005 15:21:21 -0000 1.6 *************** *** 219,223 **** base=base, iid=str(ta.guid), ! idlflags=self.idl_flags(ta.wTypeFlags)) self.items[itf_name] = itf --- 219,223 ---- base=base, iid=str(ta.guid), ! idlflags=self.idl_flags_interface(ta.wTypeFlags)) self.items[itf_name] = itf *************** *** 226,230 **** for i in range(ta.cFuncs): fd = tinfo.GetFuncDesc(i) ! func_name = tinfo.GetDocumentation(fd.memid)[0] returns = self.make_type(fd.elemdescFunc.tdesc, tinfo) names = tinfo.GetNames(fd.memid, fd.cParams+1) --- 226,230 ---- for i in range(ta.cFuncs): fd = tinfo.GetFuncDesc(i) ! func_name, func_doc = tinfo.GetDocumentation(fd.memid)[0:2] returns = self.make_type(fd.elemdescFunc.tdesc, tinfo) names = tinfo.GetNames(fd.memid, fd.cParams+1) *************** *** 235,238 **** --- 235,239 ---- flags += self.inv_kind(fd.invkind) mth = typedesc.ComMethod(fd.invkind, func_name, returns, flags) + mth.doc = func_doc for p in range(fd.cParams): typ = self.make_type(fd.lprgelemdescParam[p].tdesc, tinfo) *************** *** 263,267 **** base=base, iid=str(ta.guid), ! idlflags=self.idl_flags(ta.wTypeFlags)) itf.doc = str(doc) self.items[itf_name] = itf --- 264,268 ---- base=base, iid=str(ta.guid), ! idlflags=self.idl_flags_interface(ta.wTypeFlags)) itf.doc = str(doc) self.items[itf_name] = itf *************** *** 350,354 **** return [NAMES[bit] for bit in NAMES if bit & flags] - def idl_flags(self, flags): # map TYPEFLAGS values to idl attributes NAMES = {typeinfo.TYPEFLAG_FAPPOBJECT: "appobject", --- 351,354 ---- *************** *** 367,375 **** typeinfo.TYPEFLAG_FPROXY: "proxy", } - NEGATIVE_NAMES = {typeinfo.TYPEFLAG_FCANCREATE: "noncreatable"} ! return [NAMES[bit] for bit in NAMES if bit & flags] + \ ! [NEGATIVE_NAMES[bit] for bit in NEGATIVE_NAMES if (bit & flags == 0)] def var_flags(self, flags): NAMES = {typeinfo.VARFLAG_FREADONLY: "readonly", --- 367,396 ---- typeinfo.TYPEFLAG_FPROXY: "proxy", } ! TYPEFLAG_NAMES = {typeinfo.TYPEFLAG_FAPPOBJECT: "appobject", ! typeinfo.TYPEFLAG_FLICENSED: "licensed", ! # typeinfo.TYPEFLAG_FPREDECLID: ! typeinfo.TYPEFLAG_FHIDDEN: "hidden", ! typeinfo.TYPEFLAG_FCONTROL: "control", ! typeinfo.TYPEFLAG_FDUAL: "dual", ! typeinfo.TYPEFLAG_FNONEXTENSIBLE: "nonextensible", ! typeinfo.TYPEFLAG_FOLEAUTOMATION: "oleautomation", ! typeinfo.TYPEFLAG_FRESTRICTED: "restricted", ! typeinfo.TYPEFLAG_FAGGREGATABLE: "aggregatable", ! # typeinfo.TYPEFLAG_FREPLACEABLE: ! # typeinfo.TYPEFLAG_FDISPATCHABLE # computed, no flag for this ! typeinfo.TYPEFLAG_FREVERSEBIND: "reversebind", ! typeinfo.TYPEFLAG_FPROXY: "proxy", ! } ! NEGATIVE_TYPEFLAG_NAMES = {typeinfo.TYPEFLAG_FCANCREATE: "noncreatable"} ! ! def idl_flags_interface(self, flags): ! return [self.TYPEFLAG_NAMES[bit] for bit in self.TYPEFLAG_NAMES if bit & flags] + def idl_flags_coclass(self, flags): + return [self.TYPEFLAG_NAMES[bit] for bit in self.TYPEFLAG_NAMES if bit & flags] + \ + [self.NEGATIVE_TYPEFLAG_NAMES[bit] for bit in self.NEGATIVE_TYPEFLAG_NAMES + if (bit & flags == 0)] + def var_flags(self, flags): NAMES = {typeinfo.VARFLAG_FREADONLY: "readonly", *************** *** 395,399 **** # version, control, hidden, and appobject coclass_name, doc = tinfo.GetDocumentation(-1)[0:2] ! coclass = typedesc.CoClass(coclass_name, str(ta.guid), self.idl_flags(ta.wTypeFlags)) if doc is not None: coclass.doc = str(doc) --- 416,421 ---- # version, control, hidden, and appobject coclass_name, doc = tinfo.GetDocumentation(-1)[0:2] ! coclass = typedesc.CoClass(coclass_name, str(ta.guid), ! self.idl_flags_coclass(ta.wTypeFlags)) if doc is not None: coclass.doc = str(doc) |