ctypes-commit Mailing List for ctypes (Page 64)
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-31 08:32:17
|
Update of /cvsroot/ctypes/ctypes/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv9560 Modified Files: ctypes.h cfield.c callbacks.c _ctypes.c Log Message: Install the full prototype for setfunc with 4 arguments. Index: ctypes.h =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/ctypes.h,v retrieving revision 1.85 retrieving revision 1.86 diff -C2 -d -r1.85 -r1.86 *** ctypes.h 30 Mar 2005 20:15:47 -0000 1.85 --- ctypes.h 31 Mar 2005 08:32:04 -0000 1.86 *************** *** 128,134 **** //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 */ --- 128,134 ---- //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: callbacks.c =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/callbacks.c,v retrieving revision 1.74 retrieving revision 1.75 diff -C2 -d -r1.74 -r1.75 *** callbacks.c 30 Mar 2005 20:07:27 -0000 1.74 --- callbacks.c 31 Mar 2005 08:32:05 -0000 1.75 *************** *** 235,249 **** switch (restype->size) { case 1: ! keep = setfunc(&r, result, 0); CHECK("'converting callback result'", keep); *(ffi_arg *)mem = r.c; break; case SIZEOF_SHORT: ! keep = setfunc(&r, result, 0); CHECK("'converting callback result'", keep); *(ffi_arg *)mem = r.s; break; case SIZEOF_INT: ! keep = setfunc(&r, result, 0); CHECK("'converting callback result'", keep); *(ffi_arg *)mem = r.i; --- 235,249 ---- switch (restype->size) { case 1: ! keep = setfunc(&r, result, 0, NULL); /* XXX need type */ CHECK("'converting callback result'", keep); *(ffi_arg *)mem = r.c; break; case SIZEOF_SHORT: ! keep = setfunc(&r, result, 0, NULL); /* XXX need type */ CHECK("'converting callback result'", keep); *(ffi_arg *)mem = r.s; break; case SIZEOF_INT: ! keep = setfunc(&r, result, 0, NULL); /* XXX need type */ CHECK("'converting callback result'", keep); *(ffi_arg *)mem = r.i; *************** *** 251,255 **** #if (SIZEOF_LONG != SIZEOF_INT) case SIZEOF_LONG: ! keep = setfunc(&r, result, 0); CHECK("'converting callback result'", keep); *(ffi_arg *)mem = r.l; --- 251,255 ---- #if (SIZEOF_LONG != SIZEOF_INT) case SIZEOF_LONG: ! keep = setfunc(&r, result, 0, NULL); /* XXX need type */ CHECK("'converting callback result'", keep); *(ffi_arg *)mem = r.l; *************** *** 257,261 **** #endif default: ! keep = setfunc(mem, result, 0); CHECK("'converting callback result'", keep); break; --- 257,261 ---- #endif default: ! keep = setfunc(mem, result, 0, NULL); /* XXX need type */ CHECK("'converting callback result'", keep); break; Index: cfield.c =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/cfield.c,v retrieving revision 1.93 retrieving revision 1.94 diff -C2 -d -r1.93 -r1.94 *** cfield.c 30 Mar 2005 20:15:49 -0000 1.93 --- cfield.c 31 Mar 2005 08:32:04 -0000 1.94 *************** *** 74,78 **** return result; } - if (value == Py_None && PointerTypeObject_Check(type)) { *(void **)ptr = NULL; /*GCOV*/ --- 74,77 ---- *************** *** 258,262 **** PyObject *result = self->setfunc(dst->b_ptr + self->offset, value, self->size, ! self->fieldtype, dst); if (result == NULL) return -1; --- 257,261 ---- PyObject *result = self->setfunc(dst->b_ptr + self->offset, value, self->size, ! self->fieldtype); if (result == NULL) return -1; Index: _ctypes.c =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/_ctypes.c,v retrieving revision 1.242 retrieving revision 1.243 diff -C2 -d -r1.242 -r1.243 *** _ctypes.c 30 Mar 2005 16:50:07 -0000 1.242 --- _ctypes.c 31 Mar 2005 08:32:05 -0000 1.243 *************** *** 142,145 **** --- 142,188 ---- static PyObject * + basic_setfunc(void *ptr, PyObject *value, unsigned size, PyObject *type) + { + /* This should be common to ALL types... */ + if (PyObject_IsInstance(value, type)) { + CDataObject *src = (CDataObject *)value; + memmove(ptr, + src->b_ptr, + size); + value = GetKeepedObjects(src); + Py_INCREF(value); + return value; + } + PyErr_Format(PyExc_TypeError, + "Incompatible types %s instance instead of %s instance", + value->ob_type->tp_name, + ((PyTypeObject *)type)->tp_name); + return NULL; + } + + /* derived from cfield.c::_generic_field_setfunc */ + static PyObject * + StructUnion_setfunc(void *ptr, PyObject *value, unsigned size, PyObject *type) + { + /* This only for structures and arrays...*/ + 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 = StructUnion_setfunc(ptr, ob, size, type); + Py_DECREF(ob); + return result; + } + return basic_setfunc(ptr, value, size, type); + } + + static PyObject * StructUnionType_new(PyTypeObject *type, PyObject *args, PyObject *kwds, int isStruct) { *************** *** 173,177 **** result->tp_dict = (PyObject *)dict; ! /* XXX Allow overriding. __c_to_python__? */ dict->getfunc = generic_getfunc; --- 216,220 ---- result->tp_dict = (PyObject *)dict; ! // dict->setfunc = StructUnion_setfunc; dict->getfunc = generic_getfunc; *************** *** 1075,1079 **** parg->pffi_type = &ffi_type_pointer; parg->tag = 'Z'; ! parg->obj = fd->setfunc(&parg->value, value, 0); if (parg->obj == NULL) { Py_DECREF(parg); --- 1118,1122 ---- parg->pffi_type = &ffi_type_pointer; parg->tag = 'Z'; ! parg->obj = fd->setfunc(&parg->value, value, 0, NULL); if (parg->obj == NULL) { Py_DECREF(parg); *************** *** 1128,1132 **** parg->pffi_type = &ffi_type_pointer; parg->tag = 'z'; ! parg->obj = fd->setfunc(&parg->value, value, 0); if (parg->obj == NULL) { Py_DECREF(parg); --- 1171,1175 ---- parg->pffi_type = &ffi_type_pointer; parg->tag = 'z'; ! parg->obj = fd->setfunc(&parg->value, value, 0, NULL); if (parg->obj == NULL) { Py_DECREF(parg); *************** *** 1183,1187 **** parg->pffi_type = &ffi_type_pointer; parg->tag = 'z'; ! parg->obj = fd->setfunc(&parg->value, value, 0); if (parg->obj == NULL) { Py_DECREF(parg); --- 1226,1230 ---- parg->pffi_type = &ffi_type_pointer; parg->tag = 'z'; ! parg->obj = fd->setfunc(&parg->value, value, 0, type); if (parg->obj == NULL) { Py_DECREF(parg); *************** *** 1197,1201 **** parg->pffi_type = &ffi_type_pointer; parg->tag = 'Z'; ! parg->obj = fd->setfunc(&parg->value, value, 0); if (parg->obj == NULL) { Py_DECREF(parg); --- 1240,1244 ---- parg->pffi_type = &ffi_type_pointer; parg->tag = 'Z'; ! parg->obj = fd->setfunc(&parg->value, value, 0, type); if (parg->obj == NULL) { Py_DECREF(parg); *************** *** 1419,1423 **** parg->tag = fmt[0]; parg->pffi_type = fd->pffi_type; ! parg->obj = fd->setfunc(&parg->value, value, 0); if (parg->obj == NULL) { Py_DECREF(parg); --- 1462,1466 ---- parg->tag = fmt[0]; parg->pffi_type = fd->pffi_type; ! parg->obj = fd->setfunc(&parg->value, value, 0, type); if (parg->obj == NULL) { Py_DECREF(parg); *************** *** 1970,1979 **** if (setfunc) ! return setfunc(ptr, value, size); if (!CDataObject_Check(value)) { StgDictObject *dict = PyType_stgdict(type); if (dict && dict->setfunc) ! return dict->setfunc(ptr, value, size); /* If value is a tuple, we try to call the type with the tuple --- 2013,2022 ---- if (setfunc) ! return setfunc(ptr, value, size, type); if (!CDataObject_Check(value)) { StgDictObject *dict = PyType_stgdict(type); if (dict && dict->setfunc) ! return dict->setfunc(ptr, value, size, type); /* If value is a tuple, we try to call the type with the tuple *************** *** 3589,3593 **** StgDictObject *dict = PyObject_stgdict((PyObject *)self); ! result = dict->setfunc(self->b_ptr, value, dict->size); if (!result) return -1; --- 3632,3636 ---- StgDictObject *dict = PyObject_stgdict((PyObject *)self); ! result = dict->setfunc(self->b_ptr, value, dict->size, (PyObject *)self->ob_type); if (!result) return -1; |
From: Thomas H. <th...@us...> - 2005-03-30 20:16:17
|
Update of /cvsroot/ctypes/ctypes/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv16534 Modified Files: ctypes.h cfield.c Log Message: CFieldObject no longer has a getfunc. The getfunc from fieldtype's stgdict is used. Index: ctypes.h =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/ctypes.h,v retrieving revision 1.84 retrieving revision 1.85 diff -C2 -d -r1.84 -r1.85 *** ctypes.h 30 Mar 2005 15:54:47 -0000 1.84 --- ctypes.h 30 Mar 2005 20:15:47 -0000 1.85 *************** *** 148,152 **** object array */ PyObject *fieldtype; /* ctypes type of field */ - GETFUNC getfunc; /* getter function if proto is NULL */ SETFUNC setfunc; /* setter function if proto is NULL */ } CFieldObject; --- 148,151 ---- *************** *** 169,174 **** ffi_type ffi_type; PyObject *proto; /* Only for Pointer/ArrayObject */ ! SETFUNC setfunc; /* Only for simple objects */ ! GETFUNC getfunc; /* Only for simple objects */ /* Following fields only used by CFuncPtrType_Type instances */ --- 168,173 ---- ffi_type ffi_type; PyObject *proto; /* Only for Pointer/ArrayObject */ ! SETFUNC setfunc; ! GETFUNC getfunc; /* Following fields only used by CFuncPtrType_Type instances */ Index: cfield.c =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/cfield.c,v retrieving revision 1.92 retrieving revision 1.93 diff -C2 -d -r1.92 -r1.93 *** cfield.c 30 Mar 2005 19:59:28 -0000 1.92 --- cfield.c 30 Mar 2005 20:15:49 -0000 1.93 *************** *** 108,112 **** int size, align, length; SETFUNC setfunc = NULL; - GETFUNC getfunc = NULL; StgDictObject *dict; int fieldtype; --- 108,111 ---- *************** *** 163,169 **** length = dict->length; - assert(dict->getfunc); - getfunc = dict->getfunc; - setfunc = dict->setfunc ? dict->setfunc : _generic_field_setfunc; --- 162,165 ---- *************** *** 193,197 **** self->setfunc = setfunc; - self->getfunc = getfunc; self->index = index; --- 189,192 ---- *************** *** 272,280 **** CField_get(CFieldObject *self, CDataObject *src, PyTypeObject *type) { if (src == NULL) { Py_INCREF(self); return (PyObject *)self; } ! return self->getfunc(src->b_ptr + self->offset, self->size, self->fieldtype, src, self->index); --- 267,277 ---- CField_get(CFieldObject *self, CDataObject *src, PyTypeObject *type) { + StgDictObject *dict; if (src == NULL) { Py_INCREF(self); return (PyObject *)self; } ! dict = PyType_stgdict(self->fieldtype); ! return dict->getfunc(src->b_ptr + self->offset, self->size, self->fieldtype, src, self->index); |
From: Thomas H. <th...@us...> - 2005-03-30 20:07:59
|
Update of /cvsroot/ctypes/ctypes/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv10617 Modified Files: callbacks.c Log Message: Todo comment. Index: callbacks.c =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/callbacks.c,v retrieving revision 1.73 retrieving revision 1.74 diff -C2 -d -r1.73 -r1.74 *** callbacks.c 30 Mar 2005 16:36:00 -0000 1.73 --- callbacks.c 30 Mar 2005 20:07:27 -0000 1.74 *************** *** 200,203 **** --- 200,204 ---- } #ifdef MS_WIN32 + /* HA! That should be done by the getfunc, of course. */ TryAddRef(dict, v); #endif |
From: Thomas H. <th...@us...> - 2005-03-30 19:59:43
|
Update of /cvsroot/ctypes/ctypes/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv5503 Modified Files: cfield.c Log Message: Remove the ÊXPERIMENTAL stuff. Index: cfield.c =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/cfield.c,v retrieving revision 1.91 retrieving revision 1.92 diff -C2 -d -r1.91 -r1.92 *** cfield.c 30 Mar 2005 17:31:35 -0000 1.91 --- cfield.c 30 Mar 2005 19:59:28 -0000 1.92 *************** *** 23,45 **** } - #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) - { - 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 setfunc. --- 23,26 ---- *************** *** 107,129 **** } - #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 *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 --- 88,91 ---- *************** *** 204,220 **** getfunc = dict->getfunc; - #ifdef EXPERIMENTAL - if (PyObject_HasAttrString(desc, "__from_field__")) - getfunc = _overloaded_field_getfunc; - #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 /* Field descriptors for 'c_char * n' are be special cased to --- 166,170 ---- |
From: Thomas H. <th...@us...> - 2005-03-30 17:31:47
|
Update of /cvsroot/ctypes/ctypes/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv24292 Modified Files: cfield.c Log Message: Remove _generic_field_getfunc, now that (I hope) all types have a getfunc. It would even be possible to remove the GETFUNC member from CFieldObject, unless there's a need to specialize exactly that operation (marked EXPERIMENTAL in the code, but unused). Index: cfield.c =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/cfield.c,v retrieving revision 1.90 retrieving revision 1.91 diff -C2 -d -r1.90 -r1.91 *** cfield.c 30 Mar 2005 13:20:03 -0000 1.90 --- cfield.c 30 Mar 2005 17:31:35 -0000 1.91 *************** *** 43,47 **** /* 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. --- 43,47 ---- /* Default setfunc to be used as CFieldObject.setfunc when the field type ! doesn't supply its own setfunc. Can eventually be removed when ALL ctypes types supply their own setfunc. *************** *** 107,122 **** } - /* Default getfunc to be used in CFieldObject when the field type doesn't - supply its own getfunc. - */ - static PyObject * - _generic_field_getfunc(void *ptr, unsigned size, - PyObject *fieldtype, CDataObject *src, - int index) - { - return CData_FromBaseObj(fieldtype, (PyObject *)src, - index, ptr); - } - #ifdef EXPERIMENTAL /* getfunc overloaded by a __from_field__ callable on the fieldtype */ --- 107,110 ---- *************** *** 213,223 **** 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 --- 201,210 ---- length = dict->length; + assert(dict->getfunc); + getfunc = dict->getfunc; + #ifdef EXPERIMENTAL if (PyObject_HasAttrString(desc, "__from_field__")) getfunc = _overloaded_field_getfunc; #endif *************** *** 242,251 **** if (adict && adict->proto) { idict = PyType_stgdict(adict->proto); ! if (idict->getfunc == getentry("c")->getfunc) { struct fielddesc *fd = getentry("s"); setfunc = fd->setfunc; } #ifdef CTYPES_UNICODE ! if (idict->getfunc == getentry("u")->getfunc) { struct fielddesc *fd = getentry("U"); setfunc = fd->setfunc; --- 229,238 ---- if (adict && adict->proto) { idict = PyType_stgdict(adict->proto); ! if (idict->setfunc == getentry("c")->setfunc) { struct fielddesc *fd = getentry("s"); setfunc = fd->setfunc; } #ifdef CTYPES_UNICODE ! if (idict->setfunc == getentry("u")->setfunc) { struct fielddesc *fd = getentry("U"); setfunc = fd->setfunc; |
From: Thomas H. <th...@us...> - 2005-03-30 16:50:51
|
Update of /cvsroot/ctypes/ctypes/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv1270 Modified Files: _ctypes.c Log Message: Basic getfuncs are the same - generic_getfunc. Index: _ctypes.c =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/_ctypes.c,v retrieving revision 1.241 retrieving revision 1.242 diff -C2 -d -r1.241 -r1.242 *** _ctypes.c 30 Mar 2005 16:37:51 -0000 1.241 --- _ctypes.c 30 Mar 2005 16:50:07 -0000 1.242 *************** *** 120,139 **** static PyObject *CData_AtAddress(PyObject *type, void *buf); - - /******************************************************************/ - /* - 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 - accessible fields somehow. - */ - static PyObject * ! StructUnion_getfunc(void *ptr, unsigned size, ! PyObject *type, CDataObject *src, ...) { if (type == NULL) { PyErr_SetString(PyExc_SystemError, ! "ctypes bug: StructUnion_getfunc called with NULL type"); return NULL; } --- 120,130 ---- static PyObject *CData_AtAddress(PyObject *type, void *buf); static PyObject * ! generic_getfunc(void *ptr, unsigned size, ! PyObject *type, CDataObject *src, ...) { if (type == NULL) { PyErr_SetString(PyExc_SystemError, ! "ctypes bug: generic_getfunc called with NULL type"); return NULL; } *************** *** 141,144 **** --- 132,144 ---- } + + /******************************************************************/ + /* + 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 + accessible fields somehow. + */ + static PyObject * StructUnionType_new(PyTypeObject *type, PyObject *args, PyObject *kwds, int isStruct) *************** *** 174,178 **** /* XXX Allow overriding. __c_to_python__? */ ! dict->getfunc = StructUnion_getfunc; fields = PyDict_GetItemString((PyObject *)dict, "_fields_"); --- 174,178 ---- /* XXX Allow overriding. __c_to_python__? */ ! dict->getfunc = generic_getfunc; fields = PyDict_GetItemString((PyObject *)dict, "_fields_"); *************** *** 530,545 **** static PyObject * - Pointer_getfunc(void *ptr, unsigned size, - PyObject *type, CDataObject *src, ...) - { - if (type == NULL) { - PyErr_SetString(PyExc_SystemError, - "ctypes bug: Pointer_getfunc called with NULL type"); - return NULL; - } - return CData_FromBaseObj(type, (PyObject *)src, 0, ptr); - } - - static PyObject * PointerType_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { --- 530,533 ---- *************** *** 586,590 **** result->tp_dict = (PyObject *)stgdict; ! stgdict->getfunc = Pointer_getfunc; return (PyObject *)result; --- 574,578 ---- result->tp_dict = (PyObject *)stgdict; ! stgdict->getfunc = generic_getfunc; return (PyObject *)result; *************** *** 897,912 **** static PyObject * - Array_getfunc(void *ptr, unsigned size, - PyObject *type, CDataObject *src, ...) - { - if (type == NULL) { - PyErr_SetString(PyExc_SystemError, - "ctypes bug: Array_getfunc called with NULL type"); - return NULL; - } - return CData_FromBaseObj(type, (PyObject *)src, 0, ptr); - } - - static PyObject * CharArray_getfunc(char *ptr, unsigned size, PyObject *type, CDataObject *src, ...) --- 885,888 ---- *************** *** 1002,1006 **** result->tp_dict = (PyObject *)stgdict; ! stgdict->getfunc = Array_getfunc; /* Special casing character arrays. A permanent annoyance: char arrays are also strings! --- 978,982 ---- result->tp_dict = (PyObject *)stgdict; ! stgdict->getfunc = generic_getfunc; /* Special casing character arrays. A permanent annoyance: char arrays are also strings! *************** *** 1559,1563 **** stgdict->size = sizeof(void *); stgdict->setfunc = NULL; ! stgdict->getfunc = NULL; stgdict->ffi_type = ffi_type_pointer; --- 1535,1539 ---- stgdict->size = sizeof(void *); stgdict->setfunc = NULL; ! stgdict->getfunc = generic_getfunc; stgdict->ffi_type = ffi_type_pointer; *************** *** 3381,3384 **** --- 3357,3361 ---- proto = stgdict->proto; itemdict = PyType_stgdict(proto); + /* XXX can we use our own getfunc? */ if (itemdict->getfunc == getentry("c")->getfunc) { char *ptr = (char *)self->b_ptr; *************** *** 3914,3917 **** --- 3891,3895 ---- proto = stgdict->proto; itemdict = PyType_stgdict(proto); + /* XXX can we use out own getfunc? */ if (itemdict->getfunc == getentry("c")->getfunc) { char *ptr = *(char **)self->b_ptr; |
From: Thomas H. <th...@us...> - 2005-03-30 16:40:02
|
Update of /cvsroot/ctypes/ctypes/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv28233 Modified Files: callproc.c Log Message: Get rid of another type check, since Pointer types now have a getfunc. Index: callproc.c =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/callproc.c,v retrieving revision 1.133 retrieving revision 1.134 diff -C2 -d -r1.133 -r1.134 *** callproc.c 30 Mar 2005 15:42:35 -0000 1.133 --- callproc.c 30 Mar 2005 16:39:25 -0000 1.134 *************** *** 717,720 **** --- 717,723 ---- dict = PyType_stgdict(restype); + + /* THIS code should probably move into CallProc, where GetResult is + called. But doesn't matter too much. */ if (dict && dict->size < sizeof(ffi_arg)) { int n = 1; *************** *** 734,756 **** } - if (PointerTypeObject_Check(restype)) { - CDataObject *pd; - /* There is no Python api to set the pointer value, so we - create an empty (NULL) pointer, and modify it afterwards. - */ - pd = (CDataObject *)PyObject_CallFunctionObjArgs(restype, NULL); - if (!pd) - return NULL; - if (!CDataObject_Check(pd)) { - Py_DECREF(pd); - PyErr_SetString(PyExc_TypeError, - "BUG: restype call did not return a CDataObject"); - return NULL; - } - /* Even better would be to use the buffer interface */ - memcpy(pd->b_ptr, result, pd->b_size); - return (PyObject *)pd; - } - if (dict && dict->getfunc) { PyObject *retval = dict->getfunc(result, dict->size, --- 737,740 ---- *************** *** 769,772 **** --- 753,757 ---- } } + if (PyCallable_Check(restype)) return PyObject_CallFunction(restype, "i", *************** *** 774,778 **** PyErr_SetString(PyExc_TypeError, "Bug: cannot convert result"); ! return NULL; /* to silence the compiler */ } --- 759,763 ---- PyErr_SetString(PyExc_TypeError, "Bug: cannot convert result"); ! return NULL; } |
From: Thomas H. <th...@us...> - 2005-03-30 16:38:32
|
Update of /cvsroot/ctypes/ctypes/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv27212 Modified Files: _ctypes.c Log Message: Install a getfunc in Pointer types. Index: _ctypes.c =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/_ctypes.c,v retrieving revision 1.240 retrieving revision 1.241 diff -C2 -d -r1.240 -r1.241 *** _ctypes.c 30 Mar 2005 15:54:52 -0000 1.240 --- _ctypes.c 30 Mar 2005 16:37:51 -0000 1.241 *************** *** 530,533 **** --- 530,545 ---- static PyObject * + Pointer_getfunc(void *ptr, unsigned size, + PyObject *type, CDataObject *src, ...) + { + if (type == NULL) { + PyErr_SetString(PyExc_SystemError, + "ctypes bug: Pointer_getfunc called with NULL type"); + return NULL; + } + return CData_FromBaseObj(type, (PyObject *)src, 0, ptr); + } + + static PyObject * PointerType_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { *************** *** 574,577 **** --- 586,591 ---- result->tp_dict = (PyObject *)stgdict; + stgdict->getfunc = Pointer_getfunc; + return (PyObject *)result; } |
From: Thomas H. <th...@us...> - 2005-03-30 16:36:28
|
Update of /cvsroot/ctypes/ctypes/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv26321 Modified Files: callbacks.c Log Message: Use getfunc in CallPythonObject - which creates the argument values for python callback functions. Index: callbacks.c =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/callbacks.c,v retrieving revision 1.72 retrieving revision 1.73 diff -C2 -d -r1.72 -r1.73 *** callbacks.c 24 Mar 2005 19:16:41 -0000 1.72 --- callbacks.c 30 Mar 2005 16:36:00 -0000 1.73 *************** *** 128,139 **** */ static void ! TryAddRef(StgDictObject *dict, CDataObject *obj) { IUnknown *punk; ! if (NULL == PyDict_GetItemString((PyObject *)dict, "_needs_com_addref_")) return; ! punk = *(IUnknown **)obj->b_ptr; if (punk) punk->lpVtbl->AddRef(punk); --- 128,141 ---- */ static void ! TryAddRef(StgDictObject *dict, PyObject *obj) { IUnknown *punk; ! if (!CDataObject_Check(obj)) return; ! if (NULL == PyDict_GetItemString((PyObject *)dict, "_needs_com_addref_")) ! return; ! punk = *(IUnknown **)((CDataObject *)obj)->b_ptr; if (punk) punk->lpVtbl->AddRef(punk); *************** *** 197,200 **** --- 199,205 ---- goto Done; } + #ifdef MS_WIN32 + TryAddRef(dict, v); + #endif PyTuple_SET_ITEM(arglist, i, v); /* XXX XXX XX *************** *** 203,223 **** BTW, the same problem occurrs when they are pushed as parameters */ - } else if (dict) { - /* Hm, shouldn't we use CData_AtAddress() or something like that instead? */ - CDataObject *obj = (CDataObject *)PyObject_CallFunctionObjArgs(cnv, NULL); - if (!obj) { - PrintError("create argument %d:\n", i); - goto Done; - } - if (!CDataObject_Check(obj)) { - Py_DECREF(obj); - PrintError("unexpected result of create argument %d:\n", i); - goto Done; - } - memcpy(obj->b_ptr, *pArgs, dict->size); - PyTuple_SET_ITEM(arglist, i, (PyObject *)obj); - #ifdef MS_WIN32 - TryAddRef(dict, obj); - #endif } else { PyErr_SetString(PyExc_TypeError, --- 208,211 ---- |
From: Thomas H. <th...@us...> - 2005-03-30 15:55:26
|
Update of /cvsroot/ctypes/ctypes/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv1512 Modified Files: ctypes.h _ctypes.c Log Message: Fix definition of some functions. Index: ctypes.h =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/ctypes.h,v retrieving revision 1.83 retrieving revision 1.84 diff -C2 -d -r1.83 -r1.84 *** ctypes.h 24 Mar 2005 19:16:40 -0000 1.83 --- ctypes.h 30 Mar 2005 15:54:47 -0000 1.84 *************** *** 93,99 **** int *psize, int *poffset, int *palign, int pack); - extern PyObject *CData_AtAddress(PyObject *type, void *buf); - extern PyObject *CData_FromBytes(PyObject *type, char *data, int length); - extern PyTypeObject ArrayType_Type; extern PyTypeObject Array_Type; --- 93,96 ---- Index: _ctypes.c =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/_ctypes.c,v retrieving revision 1.239 retrieving revision 1.240 diff -C2 -d -r1.239 -r1.240 *** _ctypes.c 30 Mar 2005 15:40:52 -0000 1.239 --- _ctypes.c 30 Mar 2005 15:54:52 -0000 1.240 *************** *** 118,121 **** --- 118,123 ---- char *conversion_mode_errors = NULL; + static PyObject *CData_AtAddress(PyObject *type, void *buf); + /******************************************************************/ |
From: Thomas H. <th...@us...> - 2005-03-30 15:43:15
|
Update of /cvsroot/ctypes/ctypes/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv25883 Modified Files: callproc.c Log Message: For catching bugs, overwrite the result buffer after using it. Index: callproc.c =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/callproc.c,v retrieving revision 1.132 retrieving revision 1.133 diff -C2 -d -r1.132 -r1.133 *** callproc.c 30 Mar 2005 12:09:46 -0000 1.132 --- callproc.c 30 Mar 2005 15:42:35 -0000 1.133 *************** *** 922,925 **** --- 922,927 ---- #endif retval = GetResult(restype, resbuf, checker); + /* Overwrite result memory, to catch bugs. */ + memset(resbuf, 0x55, max(rtype->size, sizeof(ffi_arg))); cleanup: for (i = 0; i < argcount; ++i) |
From: Thomas H. <th...@us...> - 2005-03-30 15:41:37
|
Update of /cvsroot/ctypes/ctypes/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv24817 Modified Files: _ctypes.c Log Message: Clean up CData_FromBaseObj a little. The semantics of CData_FromBaseObj has changed. If called with base == NULL, it copies the contents from the supplied memory pointer into it's own pointer. Make CData_AtAddress static, and reimplement it without CData_FromBaseObj. Index: _ctypes.c =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/_ctypes.c,v retrieving revision 1.238 retrieving revision 1.239 diff -C2 -d -r1.238 -r1.239 *** _ctypes.c 30 Mar 2005 08:54:50 -0000 1.238 --- _ctypes.c 30 Mar 2005 15:40:52 -0000 1.239 *************** *** 1918,1922 **** PyObject *mem; PyObject *args, *kw; - CDataObject *cd; if (base && !CDataObject_Check(base)) { --- 1918,1921 ---- *************** *** 1936,1955 **** Py_DECREF(kw); Py_DECREF(args); ! if (mem == NULL) ! return NULL; ! ! /* XXX cobj will be invalid once we leave this function! */ assert(cobj->ob_refcnt == 1); Py_DECREF(cobj); - cd = (CDataObject *)mem; - return mem; } ! PyObject * CData_AtAddress(PyObject *type, void *buf) { ! return CData_FromBaseObj(type, NULL, 0, buf); } --- 1935,1969 ---- Py_DECREF(kw); Py_DECREF(args); ! /* the pointer in it points to memory local to this func. */ assert(cobj->ob_refcnt == 1); Py_DECREF(cobj); return mem; } ! /* We cannot call CData_FromBaseObj, because we have no base object. So, we ! create an empty instance, free the memory it contains, and fill in the ! memory pointer afterwards. ! */ ! static PyObject * CData_AtAddress(PyObject *type, void *buf) { ! CDataObject *pd; ! ! pd = (CDataObject *)PyObject_CallFunctionObjArgs(type, NULL); ! if (!pd) ! return NULL; ! if (!CDataObject_Check(pd)) { ! Py_DECREF(pd); ! PyErr_SetString(PyExc_TypeError, ! "BUG: type call did not return a CDataObject"); ! return NULL; ! } ! if (pd->b_needsfree) { ! pd->b_needsfree = 0; ! PyMem_Free(pd->b_ptr); ! } ! pd->b_ptr = buf; ! return (PyObject *)pd; } *************** *** 2152,2158 **** obj->b_length = length; - obj->b_ptr = spec->adr; obj->b_size = size; ! obj->b_needsfree = 0; } /* don't pass this to tp_init! */ --- 2166,2173 ---- obj->b_length = length; obj->b_size = size; ! obj->b_ptr = PyMem_Malloc(size); ! obj->b_needsfree = 1; ! memcpy(obj->b_ptr, spec->adr, size); } /* don't pass this to tp_init! */ |
From: Thomas H. <th...@us...> - 2005-03-30 13:20:19
|
Update of /cvsroot/ctypes/ctypes/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv9952 Modified Files: cfield.c Log Message: Use complete signatures for getfuncs. Index: cfield.c =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/cfield.c,v retrieving revision 1.89 retrieving revision 1.90 diff -C2 -d -r1.89 -r1.90 *** cfield.c 30 Mar 2005 08:57:21 -0000 1.89 --- cfield.c 30 Mar 2005 13:20:03 -0000 1.90 *************** *** 587,591 **** static PyObject * ! b_get(void *ptr, unsigned size, ...) { char val = *(char *)ptr; --- 587,591 ---- static PyObject * ! b_get(void *ptr, unsigned size, PyObject *type, CDataObject *src, int index) { char val = *(char *)ptr; *************** *** 607,611 **** static PyObject * ! B_get(void *ptr, unsigned size, ...) { unsigned char val = *(unsigned char *)ptr; --- 607,611 ---- static PyObject * ! B_get(void *ptr, unsigned size, PyObject *type, CDataObject *src, int index) { unsigned char val = *(unsigned char *)ptr; *************** *** 626,630 **** static PyObject * ! h_get(void *ptr, unsigned size, ...) { short val = *(short *)ptr; --- 626,630 ---- static PyObject * ! h_get(void *ptr, unsigned size, PyObject *type, CDataObject *src, int index) { short val = *(short *)ptr; *************** *** 646,650 **** static PyObject * ! H_get(void *ptr, unsigned size, ...) { unsigned short val = *(short *)ptr; --- 646,650 ---- static PyObject * ! H_get(void *ptr, unsigned size, PyObject *type, CDataObject *src, int index) { unsigned short val = *(short *)ptr; *************** *** 668,672 **** static PyObject * ! i_get(void *ptr, unsigned size, ...) { int val = *(int *)ptr; --- 668,672 ---- static PyObject * ! i_get(void *ptr, unsigned size, PyObject *type, CDataObject *src, int index) { int val = *(int *)ptr; *************** *** 694,698 **** static PyObject * ! vBOOL_get(void *ptr, unsigned size, ...) { return PyBool_FromLong((long)*(short int *)ptr); --- 694,698 ---- static PyObject * ! vBOOL_get(void *ptr, unsigned size, PyObject *type, CDataObject *src, int index) { return PyBool_FromLong((long)*(short int *)ptr); *************** *** 716,720 **** static PyObject * ! I_get(void *ptr, unsigned size, ...) { unsigned int val = *(unsigned int *)ptr; --- 716,720 ---- static PyObject * ! I_get(void *ptr, unsigned size, PyObject *type, CDataObject *src, int index) { unsigned int val = *(unsigned int *)ptr; *************** *** 736,740 **** static PyObject * ! l_get(void *ptr, unsigned size, ...) { long val = *(long *)ptr; --- 736,740 ---- static PyObject * ! l_get(void *ptr, unsigned size, PyObject *type, CDataObject *src, int index) { long val = *(long *)ptr; *************** *** 755,759 **** static PyObject * ! L_get(void *ptr, unsigned size, ...) { unsigned long val = *(unsigned long *)ptr; --- 755,759 ---- static PyObject * ! L_get(void *ptr, unsigned size, PyObject *type, CDataObject *src, int index) { unsigned long val = *(unsigned long *)ptr; *************** *** 774,778 **** static PyObject * ! q_get(void *ptr, unsigned size, ...) { PY_LONG_LONG val = *(PY_LONG_LONG *)ptr; --- 774,778 ---- static PyObject * ! q_get(void *ptr, unsigned size, PyObject *type, CDataObject *src, int index) { PY_LONG_LONG val = *(PY_LONG_LONG *)ptr; *************** *** 792,796 **** static PyObject * ! Q_get(void *ptr, unsigned size, ...) { unsigned PY_LONG_LONG val = *(unsigned PY_LONG_LONG *)ptr; --- 792,796 ---- static PyObject * ! Q_get(void *ptr, unsigned size, PyObject *type, CDataObject *src, int index) { unsigned PY_LONG_LONG val = *(unsigned PY_LONG_LONG *)ptr; *************** *** 823,827 **** static PyObject * ! d_get(void *ptr, unsigned size, ...) { return PyFloat_FromDouble(*(double *)ptr); --- 823,827 ---- static PyObject * ! d_get(void *ptr, unsigned size, PyObject *type, CDataObject *src, int index) { return PyFloat_FromDouble(*(double *)ptr); *************** *** 845,849 **** static PyObject * ! f_get(void *ptr, unsigned size, ...) { return PyFloat_FromDouble(*(float *)ptr); --- 845,849 ---- static PyObject * ! f_get(void *ptr, unsigned size, PyObject *type, CDataObject *src, int index) { return PyFloat_FromDouble(*(float *)ptr); *************** *** 851,855 **** static PyObject * ! O_get(void *ptr, unsigned size, ...) { PyObject *ob = *(PyObject **)ptr; --- 851,855 ---- static PyObject * ! O_get(void *ptr, unsigned size, PyObject *type, CDataObject *src, int index) { PyObject *ob = *(PyObject **)ptr; *************** *** 887,891 **** static PyObject * ! c_get(void *ptr, unsigned size, ...) { return PyString_FromStringAndSize((char *)ptr, 1); --- 887,891 ---- static PyObject * ! c_get(void *ptr, unsigned size, PyObject *type, CDataObject *src, int index) { return PyString_FromStringAndSize((char *)ptr, 1); *************** *** 929,933 **** static PyObject * ! u_get(void *ptr, unsigned size, ...) { return PyUnicode_FromWideChar((wchar_t *)ptr, 1); --- 929,933 ---- static PyObject * ! u_get(void *ptr, unsigned size, PyObject *type, CDataObject *src, int index) { return PyUnicode_FromWideChar((wchar_t *)ptr, 1); *************** *** 936,940 **** /* U - a unicode string */ static PyObject * ! U_get(void *ptr, unsigned size, ...) { PyObject *result; --- 936,940 ---- /* U - a unicode string */ static PyObject * ! U_get(void *ptr, unsigned size, PyObject *type, CDataObject *src, int index) { PyObject *result; *************** *** 1004,1008 **** static PyObject * ! s_get(void *ptr, unsigned size, ...) { PyObject *result; --- 1004,1008 ---- static PyObject * ! s_get(void *ptr, unsigned size, PyObject *type, CDataObject *src, int index) { PyObject *result; *************** *** 1082,1086 **** static PyObject * ! z_get(void *ptr, unsigned size, ...) { /* XXX What about invalid pointers ??? */ --- 1082,1086 ---- static PyObject * ! z_get(void *ptr, unsigned size, PyObject *type, CDataObject *src, int index) { /* XXX What about invalid pointers ??? */ *************** *** 1158,1162 **** static PyObject * ! Z_get(void *ptr, unsigned size, ...) { wchar_t *p; --- 1158,1162 ---- static PyObject * ! Z_get(void *ptr, unsigned size, PyObject *type, CDataObject *src, int index) { wchar_t *p; *************** *** 1216,1220 **** static PyObject * ! BSTR_get(void *ptr, unsigned size, ...) { BSTR p; --- 1216,1220 ---- static PyObject * ! BSTR_get(void *ptr, unsigned size, PyObject *type, CDataObject *src, int index) { BSTR p; *************** *** 1255,1259 **** static PyObject * ! P_get(void *ptr, unsigned size, ...) { if (*(void **)ptr == NULL) { --- 1255,1259 ---- static PyObject * ! P_get(void *ptr, unsigned size, PyObject *type, CDataObject *src, int index) { if (*(void **)ptr == NULL) { |
From: Thomas H. <th...@us...> - 2005-03-30 12:10:13
|
Update of /cvsroot/ctypes/ctypes/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv7286 Modified Files: callproc.c Log Message: No need to special case StructType in GetResult() any more. Index: callproc.c =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/callproc.c,v retrieving revision 1.131 retrieving revision 1.132 diff -C2 -d -r1.131 -r1.132 *** callproc.c 30 Mar 2005 12:01:45 -0000 1.131 --- callproc.c 30 Mar 2005 12:09:46 -0000 1.132 *************** *** 753,773 **** } - if (StructTypeObject_Check(restype)) { - CDataObject *pd; - - pd = (CDataObject *)PyObject_CallFunctionObjArgs(restype, NULL); - if (!pd) - return NULL; - if (!CDataObject_Check(pd)) { - Py_DECREF(pd); - PyErr_SetString(PyExc_TypeError, - "BUG: restype call did not return a CDataObject"); - return NULL; - } - /* Even better would be to use the buffer interface */ - memcpy(pd->b_ptr, result, pd->b_size); - return (PyObject *)pd; - } - if (dict && dict->getfunc) { PyObject *retval = dict->getfunc(result, dict->size, --- 753,756 ---- |
From: Thomas H. <th...@us...> - 2005-03-30 12:02:04
|
Update of /cvsroot/ctypes/ctypes/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv2774 Modified Files: callproc.c Log Message: Reorder and explain code. Make it work on little endian machines again. Index: callproc.c =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/callproc.c,v retrieving revision 1.130 retrieving revision 1.131 diff -C2 -d -r1.130 -r1.131 *** callproc.c 30 Mar 2005 11:47:18 -0000 1.130 --- callproc.c 30 Mar 2005 12:01:45 -0000 1.131 *************** *** 716,719 **** --- 716,737 ---- } + dict = PyType_stgdict(restype); + if (dict && dict->size < sizeof(ffi_arg)) { + int n = 1; + char *pn = (char *) &n; + + if (*pn != 1) { /* big endian */ + /* libffi returns the result in a buffer of + sizeof(ffi_arg). This causes problems on big + endian machines, since the result buffer cannot + simply be casted to the actual result type. + Instead, we must adjust the pointer: + */ + char *ptr = result; + ptr += sizeof(ffi_arg) - dict->size; + result = ptr; + } + } + if (PointerTypeObject_Check(restype)) { CDataObject *pd; *************** *** 752,761 **** } - dict = PyType_stgdict(restype); - if (dict && dict->size < sizeof(ffi_arg)) { - char *p = result; - p += sizeof(ffi_arg) - dict->size; - result = p; - } if (dict && dict->getfunc) { PyObject *retval = dict->getfunc(result, dict->size, --- 770,773 ---- |
From: Thomas H. <th...@us...> - 2005-03-30 11:47:28
|
Update of /cvsroot/ctypes/ctypes/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv26492 Modified Files: callproc.c Log Message: About to fix the big endian hack Index: callproc.c =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/callproc.c,v retrieving revision 1.129 retrieving revision 1.130 diff -C2 -d -r1.129 -r1.130 *** callproc.c 30 Mar 2005 11:36:07 -0000 1.129 --- callproc.c 30 Mar 2005 11:47:18 -0000 1.130 *************** *** 753,805 **** dict = PyType_stgdict(restype); if (dict && dict->getfunc) { ! /* This hack is needed for big endian machines. ! Is there another way? ! */ ! PyObject *retval; ! #if 0 ! char c; ! short s; ! int i; ! #if (SIZEOF_LONG != SIZEOF_INT) ! long l; ! #endif ! switch (dict->size) { ! case 1: ! c = (char)*(long *)result; ! retval = dict->getfunc(&c, dict->size, ! restype, NULL, 0); ! break; ! case SIZEOF_SHORT: ! s = (short)*(long *)result; ! retval = dict->getfunc(&s, dict->size, ! restype, NULL, 0); ! break; ! case SIZEOF_INT: ! i = (int)*(long *)result; ! retval = dict->getfunc(&i, dict->size, ! restype, NULL, 0); ! break; ! #if (SIZEOF_LONG != SIZEOF_INT) ! case SIZEOF_LONG: ! l = (long)*(long *)result; ! retval = dict->getfunc(&l, dict->size, ! restype, NULL, 0); ! break; ! #endif ! default: ! retval = dict->getfunc(result, dict->size, ! restype, NULL, 0); ! break; ! } ! #else ! if (dict->size < sizeof(ffi_arg)) { ! char *p = result; ! p += sizeof(ffi_arg) - dict->size; ! result = p; ! } ! retval = dict->getfunc(result, dict->size, ! restype, NULL, 0); ! #endif if (retval == NULL) return NULL; --- 753,764 ---- dict = PyType_stgdict(restype); + if (dict && dict->size < sizeof(ffi_arg)) { + char *p = result; + p += sizeof(ffi_arg) - dict->size; + result = p; + } if (dict && dict->getfunc) { ! PyObject *retval = dict->getfunc(result, dict->size, ! restype, NULL, 0); if (retval == NULL) return NULL; |
From: Thomas H. <th...@us...> - 2005-03-30 11:36:18
|
Update of /cvsroot/ctypes/ctypes/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv19790 Modified Files: callproc.c Log Message: Big endian refactoring Index: callproc.c =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/callproc.c,v retrieving revision 1.128 retrieving revision 1.129 diff -C2 -d -r1.128 -r1.129 *** callproc.c 24 Mar 2005 19:16:40 -0000 1.128 --- callproc.c 30 Mar 2005 11:36:07 -0000 1.129 *************** *** 758,761 **** --- 758,762 ---- */ PyObject *retval; + #if 0 char c; short s; *************** *** 792,795 **** --- 793,805 ---- break; } + #else + if (dict->size < sizeof(ffi_arg)) { + char *p = result; + p += sizeof(ffi_arg) - dict->size; + result = p; + } + retval = dict->getfunc(result, dict->size, + restype, NULL, 0); + #endif if (retval == NULL) return NULL; |
From: Thomas H. <th...@us...> - 2005-03-30 08:57:30
|
Update of /cvsroot/ctypes/ctypes/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv26905 Modified Files: cfield.c Log Message: Remove special casing getfunc for c_char and c_wchar arrays. Index: cfield.c =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/cfield.c,v retrieving revision 1.88 retrieving revision 1.89 diff -C2 -d -r1.88 -r1.89 *** cfield.c 24 Mar 2005 17:43:13 -0000 1.88 --- cfield.c 30 Mar 2005 08:57:21 -0000 1.89 *************** *** 231,241 **** #endif - /* 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... */ if (ArrayTypeObject_Check(desc)) { StgDictObject *adict = PyType_stgdict(desc); --- 231,240 ---- #endif /* Field descriptors for 'c_char * n' are be special cased to return a Python string instead of an Array object instance... */ + /* Special case setfunc for c_char and c_wchar arrays. We can remove + this code once we have setfunc correct for arrays. + */ if (ArrayTypeObject_Check(desc)) { StgDictObject *adict = PyType_stgdict(desc); *************** *** 245,249 **** if (idict->getfunc == getentry("c")->getfunc) { struct fielddesc *fd = getentry("s"); - getfunc = fd->getfunc; setfunc = fd->setfunc; } --- 244,247 ---- *************** *** 251,255 **** if (idict->getfunc == getentry("u")->getfunc) { struct fielddesc *fd = getentry("U"); - getfunc = fd->getfunc; setfunc = fd->setfunc; } --- 249,252 ---- |
From: Thomas H. <th...@us...> - 2005-03-30 08:55:17
|
Update of /cvsroot/ctypes/ctypes/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv25579 Modified Files: _ctypes.c Log Message: Implement Array_getfunc with special casing c_char and c_wchar arrays. Index: _ctypes.c =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/_ctypes.c,v retrieving revision 1.237 retrieving revision 1.238 diff -C2 -d -r1.237 -r1.238 *** _ctypes.c 24 Mar 2005 21:22:58 -0000 1.237 --- _ctypes.c 30 Mar 2005 08:54:50 -0000 1.238 *************** *** 880,884 **** } - /* Array_getfunc is exactly the same as StructUnion_getfunc */ static PyObject * Array_getfunc(void *ptr, unsigned size, --- 880,883 ---- *************** *** 890,903 **** 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); } static PyObject * --- 889,918 ---- return NULL; } ! return CData_FromBaseObj(type, (PyObject *)src, 0, ptr); ! } ! static PyObject * ! CharArray_getfunc(char *ptr, unsigned size, ! PyObject *type, CDataObject *src, ...) ! { ! int i; ! for (i = 0; i < size; ++i) ! if (ptr[i] == '\0') ! break; ! return PyString_FromStringAndSize(ptr, i); ! } ! #ifdef CTYPES_UNICODE ! static PyObject * ! WCharArray_getfunc(wchar_t *ptr, unsigned size, ! PyObject *type, CDataObject *src, ...) ! { ! unsigned int i; ! for (i = 0; i < size/sizeof(wchar_t); ++i) ! if (ptr[i] == (wchar_t)0) ! break; ! return PyUnicode_FromWideChar((wchar_t *)ptr, i); } + #endif static PyObject * *************** *** 938,943 **** return NULL; - stgdict->getfunc = Array_getfunc; - itemdict = PyType_stgdict(proto); if (!itemdict) { --- 953,956 ---- *************** *** 973,986 **** result->tp_dict = (PyObject *)stgdict; ! /* Special case for character arrays. A permanent annoyance: char arrays are also strings! */ if (itemdict->getfunc == getentry("c")->getfunc) { if (-1 == add_getset(result, CharArray_getsets)) return NULL; #ifdef CTYPES_UNICODE } else if (itemdict->getfunc == getentry("u")->getfunc) { if (-1 == add_getset(result, WCharArray_getsets)) return NULL; #endif } --- 986,1005 ---- result->tp_dict = (PyObject *)stgdict; ! stgdict->getfunc = Array_getfunc; ! /* Special casing character arrays. A permanent annoyance: char arrays are also strings! */ + /* + What we really want to check here is if proto is c_char or c_wchar. + */ if (itemdict->getfunc == getentry("c")->getfunc) { if (-1 == add_getset(result, CharArray_getsets)) return NULL; + stgdict->getfunc = CharArray_getfunc; #ifdef CTYPES_UNICODE } else if (itemdict->getfunc == getentry("u")->getfunc) { if (-1 == add_getset(result, WCharArray_getsets)) return NULL; + stgdict->getfunc = WCharArray_getfunc; #endif } *************** *** 3700,3703 **** --- 3719,3726 ---- base = self; + /* XXX There MUST be some types which doen't have a getfunc, so this + cannot be correct. + Was calling CData_get before... + */ return itemdict->getfunc((*(char **)self->b_ptr) + offset, size, proto, base, index); |
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); } |
From: Thomas H. <th...@us...> - 2005-03-24 20:23:02
|
Update of /cvsroot/ctypes/ctypes/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv24340 Modified Files: _ctypes.c Log Message: Install Array_getfunc (which is exactly the same as StructUnion_getfunc). For this to work, Array_item must not call CData_get any longer. Index: _ctypes.c =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/_ctypes.c,v retrieving revision 1.235 retrieving revision 1.236 diff -C2 -d -r1.235 -r1.236 *** _ctypes.c 24 Mar 2005 19:47:45 -0000 1.235 --- _ctypes.c 24 Mar 2005 20:22:52 -0000 1.236 *************** *** 880,883 **** --- 880,895 ---- } + /* Array_getfunc is exactly the same as StructUnion_getfunc */ + static PyObject * + Array_getfunc(void *ptr, unsigned size, + PyObject *type, CDataObject *src, ...) + { + if (type == NULL) { + PyErr_SetString(PyExc_SystemError, + "ctypes bug: Array_getfunc called with NULL type"); + return NULL; + } + return CData_FromBaseObj(type, (PyObject *)src, 0, ptr); + } static PyObject * *************** *** 918,921 **** --- 930,935 ---- return NULL; + stgdict->getfunc = Array_getfunc; + itemdict = PyType_stgdict(proto); if (!itemdict) { *************** *** 1914,1918 **** static PyObject * - //CData_get(PyObject *type, GETFUNC getfunc, PyObject *src, CData_get(PyObject *type, GETFUNC getfunc, CDataObject *src, int index, int size, char *adr) --- 1928,1931 ---- *************** *** 3289,3292 **** --- 3302,3306 ---- { int offset, size; + PyObject *itemtype; StgDictObject *stgdict; *************** *** 3298,3310 **** stgdict = PyObject_stgdict((PyObject *)self); ! assert(stgdict); ! /* Would it be clearer if we got the item size from ! stgdict->proto's stgdict? ! */ ! size = stgdict->size / stgdict->length; offset = index * size; ! return CData_get(stgdict->proto, stgdict->getfunc, self, ! index, size, self->b_ptr + offset); } --- 3312,3323 ---- stgdict = PyObject_stgdict((PyObject *)self); ! itemtype = stgdict->proto; ! stgdict = PyType_stgdict(itemtype); ! ! size = stgdict->size; offset = index * size; ! return stgdict->getfunc(self->b_ptr + offset, size, ! itemtype, self, index); } |
From: Thomas H. <th...@us...> - 2005-03-24 19:47:57
|
Update of /cvsroot/ctypes/ctypes/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv2819 Modified Files: _ctypes.c Log Message: Default StructUnion_getfunc for Structures and Unions, set in the storage dict. Index: _ctypes.c =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/_ctypes.c,v retrieving revision 1.234 retrieving revision 1.235 diff -C2 -d -r1.234 -r1.235 *** _ctypes.c 24 Mar 2005 19:16:41 -0000 1.234 --- _ctypes.c 24 Mar 2005 19:47:45 -0000 1.235 *************** *** 128,131 **** --- 128,143 ---- static PyObject * + StructUnion_getfunc(void *ptr, unsigned size, + PyObject *type, CDataObject *src, ...) + { + if (type == NULL) { + PyErr_SetString(PyExc_SystemError, + "ctypes bug: StructUnion_getfunc called with NULL type"); + return NULL; + } + return CData_FromBaseObj(type, (PyObject *)src, 0, ptr); + } + + static PyObject * StructUnionType_new(PyTypeObject *type, PyObject *args, PyObject *kwds, int isStruct) { *************** *** 179,182 **** --- 191,198 ---- return NULL; } + + /* XXX Allow overriding. __c_to_python__? */ + dict->getfunc = StructUnion_getfunc; + return (PyObject *)result; } *************** *** 3659,3663 **** int size, offset; StgDictObject *stgdict, *itemdict; ! PyObject *base; PyObject *proto; --- 3675,3679 ---- int size, offset; StgDictObject *stgdict, *itemdict; ! CDataObject *base; PyObject *proto; *************** *** 3682,3686 **** base = NULL; else ! base = (PyObject *)self; return CData_get(stgdict->proto, stgdict->getfunc, base, index, size, (*(char **)self->b_ptr) + offset); --- 3698,3702 ---- base = NULL; else ! base = self; return CData_get(stgdict->proto, stgdict->getfunc, base, index, size, (*(char **)self->b_ptr) + offset); |
From: Thomas H. <th...@us...> - 2005-03-24 19:16:51
|
Update of /cvsroot/ctypes/ctypes/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv15802 Modified Files: ctypes.h callproc.c callbacks.c _ctypes.c Log Message: Call getfunc always with 5 arguments. Sometimes type and/or src is NULL. Index: ctypes.h =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/ctypes.h,v retrieving revision 1.82 retrieving revision 1.83 diff -C2 -d -r1.82 -r1.83 *** ctypes.h 24 Mar 2005 11:13:18 -0000 1.82 --- ctypes.h 24 Mar 2005 19:16:40 -0000 1.83 *************** *** 130,136 **** */ ! 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); --- 130,136 ---- */ ! //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); Index: callbacks.c =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/callbacks.c,v retrieving revision 1.71 retrieving revision 1.72 diff -C2 -d -r1.71 -r1.72 *** callbacks.c 16 Mar 2005 17:50:25 -0000 1.71 --- callbacks.c 24 Mar 2005 19:16:41 -0000 1.72 *************** *** 191,195 **** if (dict && dict->getfunc) { ! PyObject *v = dict->getfunc(*pArgs, dict->size); if (!v) { PrintError("create argument %d:\n", i); --- 191,196 ---- if (dict && dict->getfunc) { ! PyObject *v = dict->getfunc(*pArgs, dict->size, ! cnv, NULL, 0); if (!v) { PrintError("create argument %d:\n", i); Index: callproc.c =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/callproc.c,v retrieving revision 1.127 retrieving revision 1.128 diff -C2 -d -r1.127 -r1.128 *** callproc.c 10 Mar 2005 08:53:33 -0000 1.127 --- callproc.c 24 Mar 2005 19:16:40 -0000 1.128 *************** *** 707,711 **** if (restype == NULL) { ! return getentry("i")->getfunc(result, sizeof(int)); } --- 707,712 ---- if (restype == NULL) { ! return getentry("i")->getfunc(result, sizeof(int), ! NULL, NULL, 0); } *************** *** 766,787 **** case 1: c = (char)*(long *)result; ! retval = dict->getfunc(&c, dict->size); break; case SIZEOF_SHORT: s = (short)*(long *)result; ! retval = dict->getfunc(&s, dict->size); break; case SIZEOF_INT: i = (int)*(long *)result; ! retval = dict->getfunc(&i, dict->size); break; #if (SIZEOF_LONG != SIZEOF_INT) case SIZEOF_LONG: l = (long)*(long *)result; ! retval = dict->getfunc(&l, dict->size); break; #endif default: ! retval = dict->getfunc(result, dict->size); break; } --- 767,793 ---- case 1: c = (char)*(long *)result; ! retval = dict->getfunc(&c, dict->size, ! restype, NULL, 0); break; case SIZEOF_SHORT: s = (short)*(long *)result; ! retval = dict->getfunc(&s, dict->size, ! restype, NULL, 0); break; case SIZEOF_INT: i = (int)*(long *)result; ! retval = dict->getfunc(&i, dict->size, ! restype, NULL, 0); break; #if (SIZEOF_LONG != SIZEOF_INT) case SIZEOF_LONG: l = (long)*(long *)result; ! retval = dict->getfunc(&l, dict->size, ! restype, NULL, 0); break; #endif default: ! retval = dict->getfunc(result, dict->size, ! restype, NULL, 0); break; } Index: _ctypes.c =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/_ctypes.c,v retrieving revision 1.233 retrieving revision 1.234 diff -C2 -d -r1.233 -r1.234 *** _ctypes.c 24 Mar 2005 18:40:55 -0000 1.233 --- _ctypes.c 24 Mar 2005 19:16:41 -0000 1.234 *************** *** 1898,1914 **** static PyObject * ! CData_get(PyObject *type, GETFUNC getfunc, PyObject *src, int index, int size, char *adr) { if (getfunc) ! return getfunc(adr, size); if (type) { StgDictObject *dict; dict = PyType_stgdict(type); if (dict && dict->getfunc) ! return dict->getfunc(adr, size); ! return CData_FromBaseObj(type, src, index, adr); } ! return getfunc(adr, size); } --- 1898,1919 ---- static PyObject * ! //CData_get(PyObject *type, GETFUNC getfunc, PyObject *src, ! 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; } *************** *** 2816,2820 **** if (dict->getfunc) { CDataObject *c = (CDataObject *)result; ! return dict->getfunc(c->b_ptr, c->b_size); } Py_INCREF(result); --- 2821,2826 ---- if (dict->getfunc) { CDataObject *c = (CDataObject *)result; ! return dict->getfunc(c->b_ptr, c->b_size, ! (PyObject *)result->ob_type, c, 0); } Py_INCREF(result); *************** *** 3283,3287 **** offset = index * size; ! return CData_get(stgdict->proto, stgdict->getfunc, (PyObject *)self, index, size, self->b_ptr + offset); } --- 3289,3293 ---- offset = index * size; ! return CData_get(stgdict->proto, stgdict->getfunc, self, index, size, self->b_ptr + offset); } *************** *** 3565,3569 **** { StgDictObject *dict = PyObject_stgdict((PyObject *)self); ! return dict->getfunc(self->b_ptr, self->b_size); } --- 3571,3576 ---- { StgDictObject *dict = PyObject_stgdict((PyObject *)self); ! return dict->getfunc(self->b_ptr, self->b_size, ! (PyObject *)self->ob_type, self, 0); } |
From: Thomas H. <th...@us...> - 2005-03-24 18:42:25
|
Update of /cvsroot/ctypes/ctypes/unittests In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv28227/unittests Modified Files: test_complete_cover.py Log Message: More coverage for _ctypes.c Index: test_complete_cover.py =================================================================== RCS file: /cvsroot/ctypes/ctypes/unittests/test_complete_cover.py,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** test_complete_cover.py 24 Mar 2005 17:43:43 -0000 1.2 --- test_complete_cover.py 24 Mar 2005 18:42:15 -0000 1.3 *************** *** 1,3 **** ! # -*- coding: latin-1 from ctypes import * import unittest --- 1,3 ---- ! # -*- coding: latin-1 -*- from ctypes import * import unittest *************** *** 54,57 **** --- 54,84 ---- lambda: pythonapi.PyDict_GetItemString(x.__dict__, "spam")) + def test__ctypes(self): + # only int allowed + self.assertRaises(TypeError, lambda: c_int.from_address("xyz")) + + # "Os" + self.assertRaises(TypeError, lambda: c_int.in_dll(object(), 42)) + self.assertRaises(AttributeError, lambda: c_int.in_dll(object(), "x")) + + class Fake(object): + _handle = "abc" + + # dll must have an 'integer' _handle atrrib + self.assertRaises(TypeError, lambda: c_int.in_dll(Fake(), "x")) + + # setting normal attributes on Structures/Unions + class X(Structure): + _fields_ = [("a", c_int)] + class Y(Union): + _fields_ = [("a", c_int)] + X.b = 99 + Y.b = 99 + self.failUnlessRaises(TypeError, lambda: setattr(X, "__dict__", {})) # unwriteable + self.failUnlessRaises(TypeError, lambda: setattr(Y, "__dict__", {})) # unwriteable + + # from_param + print c_int.from_param(c_int(42)) + if __name__ == "__main__": unittest.main() |
From: Thomas H. <th...@us...> - 2005-03-24 18:41:05
|
Update of /cvsroot/ctypes/ctypes/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv27252/source Modified Files: _ctypes.c Log Message: COV comments, and set a missing exception. Index: _ctypes.c =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/_ctypes.c,v retrieving revision 1.232 retrieving revision 1.233 diff -C2 -d -r1.232 -r1.233 *** _ctypes.c 24 Mar 2005 09:50:39 -0000 1.232 --- _ctypes.c 24 Mar 2005 18:40:55 -0000 1.233 *************** *** 146,158 **** dict = (StgDictObject *)PyObject_CallObject((PyObject *)&StgDict_Type, NULL); if (!dict) { ! Py_DECREF(result); ! return NULL; } /* replace the class dict by our updated stgdict, which holds info about storage requirements of the instances */ if (-1 == PyDict_Update((PyObject *)dict, result->tp_dict)) { ! Py_DECREF(result); ! Py_DECREF((PyObject *)dict); ! return NULL; } Py_DECREF(result->tp_dict); --- 146,158 ---- dict = (StgDictObject *)PyObject_CallObject((PyObject *)&StgDict_Type, NULL); if (!dict) { ! Py_DECREF(result); /*COV*/ ! return NULL; /*COV*/ } /* replace the class dict by our updated stgdict, which holds info about storage requirements of the instances */ if (-1 == PyDict_Update((PyObject *)dict, result->tp_dict)) { ! Py_DECREF(result); /*COV*/ ! Py_DECREF((PyObject *)dict); /*COV*/ ! return NULL; /*COV*/ } Py_DECREF(result->tp_dict); *************** *** 167,172 **** /* copy base dict */ if (-1 == StgDict_clone(dict, basedict)) { ! Py_DECREF(result); ! return NULL; } dict->flags &= ~DICTFLAG_FINAL; /* clear the 'final' flag in the subclass dict */ --- 167,172 ---- /* copy base dict */ if (-1 == StgDict_clone(dict, basedict)) { ! Py_DECREF(result); /*COV*/ ! return NULL; /*COV*/ } dict->flags &= ~DICTFLAG_FINAL; /* clear the 'final' flag in the subclass dict */ *************** *** 229,233 **** return NULL; if (!PyInt_Check(obj)) { ! /* XXX Error */ Py_DECREF(obj); return NULL; --- 229,234 ---- return NULL; if (!PyInt_Check(obj)) { ! PyErr_SetString(PyExc_TypeError, ! "the _handle attribute must be an integer"); Py_DECREF(obj); return NULL; |