ctypes-commit Mailing List for ctypes (Page 63)
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 16:09:28
|
Update of /cvsroot/ctypes/ctypes/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv8834 Modified Files: _ctypes.c Log Message: Reorder code, and some refactoring. Index: _ctypes.c =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/_ctypes.c,v retrieving revision 1.258 retrieving revision 1.259 diff -C2 -d -r1.258 -r1.259 *** _ctypes.c 31 Mar 2005 15:17:19 -0000 1.258 --- _ctypes.c 31 Mar 2005 16:09:14 -0000 1.259 *************** *** 340,344 **** /* If we got a PyCArgObject, we must check if the object packed in it is an instance of the type's dict->proto */ - // if(dict && ob && dict->proto == (PyObject *)ob->ob_type){ if(dict && ob && PyObject_IsInstance(ob, dict->proto)) { --- 340,343 ---- *************** *** 352,373 **** return NULL; } - #if 1 - /* XXX Remove this section ??? */ - /* tuple returned by byref: */ - /* ('i', addr, obj) */ - if (PyTuple_Check(value)) { - PyObject *ob; - StgDictObject *dict; - - dict = PyType_stgdict(type); - ob = PyTuple_GetItem(value, 2); - if (dict && ob && - 0 == PyObject_IsInstance(value, dict->proto)) { - Py_INCREF(value); - return value; - } - } - /* ... and leave the rest */ - #endif PyErr_Format(PyExc_TypeError, "expected %s instance instead of %s", --- 351,354 ---- *************** *** 572,576 **** } - /* derived from cfield.c::_generic_field_setfunc */ static PyObject * Pointer_setfunc(void *ptr, PyObject *value, unsigned size, PyObject *type) --- 553,556 ---- *************** *** 672,687 **** return PyInt_FromLong(0); /* NULL pointer */ ! if (ArrayObject_Check(value)) { ! /* Array instances are also pointers when ! the item types are the same. ! */ ! StgDictObject *v = PyObject_stgdict(value); ! StgDictObject *t = PyType_stgdict(type); ! if (v && t && v->proto == t->proto) { ! Py_INCREF(value); ! return value; ! } ! } ! if (PointerObject_Check(value)) { StgDictObject *v = PyObject_stgdict(value); StgDictObject *t = PyType_stgdict(type); --- 652,656 ---- return PyInt_FromLong(0); /* NULL pointer */ ! if (ArrayObject_Check(value) || PointerObject_Check(value)) { StgDictObject *v = PyObject_stgdict(value); StgDictObject *t = PyType_stgdict(type); *************** *** 748,758 **** /******************************************************************/ /* ! ArrayType_Type ! */ ! /* ! ArrayType_new ensures that the new Array subclass created has a _length_ ! attribute, and a _type_ attribute. */ - static int CharArray_set_raw(CDataObject *self, PyObject *value) --- 717,722 ---- /******************************************************************/ /* ! CharArray helper functions */ static int CharArray_set_raw(CDataObject *self, PyObject *value) *************** *** 864,867 **** --- 828,842 ---- } + static PyObject * + CharArray_getfunc(void *ptr, unsigned size, + PyObject *type, CDataObject *src, int index) + { + int i; + for (i = 0; i < size; ++i) + if (((char *)ptr)[i] == '\0') + break; + return PyString_FromStringAndSize(ptr, i); + } + static PyGetSetDef CharArray_getsets[] = { { "raw", (getter)CharArray_get_raw, (setter)CharArray_set_raw, *************** *** 872,875 **** --- 847,855 ---- }; + /******************************************************************/ + /* + WCharArray helper functions + */ + #ifdef CTYPES_UNICODE static PyObject * *************** *** 962,965 **** --- 942,968 ---- #endif + #ifdef CTYPES_UNICODE + static PyObject * + WCharArray_getfunc(void *ptr, unsigned size, + PyObject *type, CDataObject *src, int index) + { + unsigned int i; + for (i = 0; i < size/sizeof(wchar_t); ++i) + if (((wchar_t *)ptr)[i] == (wchar_t)0) + break; + return PyUnicode_FromWideChar((wchar_t *)ptr, i); + } + #endif + + /******************************************************************/ + /* + ArrayType_Type + */ + /* + ArrayType_new ensures that the new Array subclass created has a _length_ + attribute, and a _type_ attribute. + */ + + /* Copied from Python's typeobject.c. *************** *** 982,1009 **** static PyObject * - CharArray_getfunc(void *ptr, unsigned size, - PyObject *type, CDataObject *src, int index) - { - int i; - for (i = 0; i < size; ++i) - if (((char *)ptr)[i] == '\0') - break; - return PyString_FromStringAndSize(ptr, i); - } - - #ifdef CTYPES_UNICODE - static PyObject * - WCharArray_getfunc(void *ptr, unsigned size, - PyObject *type, CDataObject *src, int index) - { - unsigned int i; - for (i = 0; i < size/sizeof(wchar_t); ++i) - if (((wchar_t *)ptr)[i] == (wchar_t)0) - break; - return PyUnicode_FromWideChar((wchar_t *)ptr, i); - } - #endif - - static PyObject * ArrayType_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { --- 985,988 ---- |
From: Thomas H. <th...@us...> - 2005-03-31 15:17:38
|
Update of /cvsroot/ctypes/ctypes/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv12588 Modified Files: _ctypes.c Log Message: Remove more unneeded code - python 2.3 is minimum requirement to build ctypes. Index: _ctypes.c =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/_ctypes.c,v retrieving revision 1.257 retrieving revision 1.258 diff -C2 -d -r1.257 -r1.258 *** _ctypes.c 31 Mar 2005 15:13:20 -0000 1.257 --- _ctypes.c 31 Mar 2005 15:17:19 -0000 1.258 *************** *** 963,1006 **** /* ! The next three functions copied from Python's typeobject.c. ! ! They are used to attach methods, members, or getsets to a type *after* it ! has been created: Arrays of characters have additional getsets to treat them ! as strings. */ - /* - static int - add_methods(PyTypeObject *type, PyMethodDef *meth) - { - PyObject *dict = type->tp_dict; - for (; meth->ml_name != NULL; meth++) { - PyObject *descr; - descr = PyDescr_NewMethod(type, meth); - if (descr == NULL) - return -1; - if (PyDict_SetItemString(dict,meth->ml_name, descr) < 0) - return -1; - Py_DECREF(descr); - } - return 0; - } - - static int - add_members(PyTypeObject *type, PyMemberDef *memb) - { - PyObject *dict = type->tp_dict; - for (; memb->name != NULL; memb++) { - PyObject *descr; - descr = PyDescr_NewMember(type, memb); - if (descr == NULL) - return -1; - if (PyDict_SetItemString(dict, memb->name, descr) < 0) - return -1; - Py_DECREF(descr); - } - return 0; - } - */ - static int add_getset(PyTypeObject *type, PyGetSetDef *gsp) --- 963,968 ---- /* ! Copied from Python's typeobject.c. */ static int add_getset(PyTypeObject *type, PyGetSetDef *gsp) *************** *** 1198,1205 **** c_wchar_p_from_param(PyObject *type, PyObject *value) { - #if (PYTHON_API_VERSION < 1012) - if (!PyArg_ParseTuple(value, "OO", &type, &value)) - return NULL; - #endif if (value == Py_None) { Py_INCREF(Py_None); --- 1160,1163 ---- *************** *** 1251,1258 **** c_char_p_from_param(PyObject *type, PyObject *value) { - #if (PYTHON_API_VERSION < 1012) - if (!PyArg_ParseTuple(value, "OO", &type, &value)) - return NULL; - #endif if (value == Py_None) { Py_INCREF(Py_None); --- 1209,1212 ---- *************** *** 1305,1312 **** { StgDictObject *stgd; - #if (PYTHON_API_VERSION < 1012) - if (!PyArg_ParseTuple(value, "OO", &type, &value)) - return NULL; - #endif if (value == Py_None) { --- 1259,1262 ---- *************** *** 1384,1388 **** return NULL; } - #if (PYTHON_API_VERSION >= 1012) static PyMethodDef c_void_p_method = { "from_param", c_void_p_from_param, METH_O }; --- 1334,1337 ---- *************** *** 1390,1401 **** static PyMethodDef c_wchar_p_method = { "from_param", c_wchar_p_from_param, METH_O }; - #else - #error - static PyMethodDef c_void_p_method = { "from_param", c_void_p_from_param, METH_VARARGS }; - static PyMethodDef c_char_p_method = { "from_param", c_char_p_from_param, METH_VARARGS }; - static PyMethodDef c_wchar_p_method = { "from_param", c_wchar_p_from_param, METH_VARARGS }; - - #endif - static PyObject * SimpleType_new(PyTypeObject *type, PyObject *args, PyObject *kwds) --- 1339,1342 ---- *************** *** 1471,1475 **** if (ml) { - #if (PYTHON_API_VERSION >= 1012) PyObject *meth; int x; --- 1412,1415 ---- *************** *** 1477,1495 **** if (!meth) return NULL; - #else - #error - PyObject *meth, *func; - int x; - func = PyCFunction_New(ml, NULL); - if (!func) - return NULL; - meth = PyObject_CallFunctionObjArgs( - (PyObject *)&PyClassMethod_Type, - func, NULL); - Py_DECREF(func); - if (!meth) { - return NULL; - } - #endif x = PyDict_SetItemString(result->tp_dict, ml->ml_name, --- 1417,1420 ---- |
From: Thomas H. <th...@us...> - 2005-03-31 15:13:33
|
Update of /cvsroot/ctypes/ctypes/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv10611 Modified Files: _ctypes.c Log Message: SimpleType_from_param: use the dict's setfunc instead searching the table. Index: _ctypes.c =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/_ctypes.c,v retrieving revision 1.256 retrieving revision 1.257 diff -C2 -d -r1.256 -r1.257 *** _ctypes.c 31 Mar 2005 14:10:52 -0000 1.256 --- _ctypes.c 31 Mar 2005 15:13:20 -0000 1.257 *************** *** 1532,1536 **** char *fmt; PyCArgObject *parg; - struct fielddesc *fd; /* If the value is already an instance of the requested type, --- 1532,1535 ---- *************** *** 1542,1561 **** dict = PyType_stgdict(type); - assert(dict); - /* I think we can rely on this being a one-character string */ - fmt = PyString_AsString(dict->proto); - assert(fmt); - - fd = getentry(fmt); - assert(fd); - parg = new_CArgObject(); if (parg == NULL) return NULL; 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); --- 1541,1555 ---- dict = PyType_stgdict(type); parg = new_CArgObject(); if (parg == NULL) return NULL; + /* We should get rid of the tag member, probably */ + fmt = PyString_AsString(dict->proto); parg->tag = fmt[0]; ! parg->pffi_type = &dict->ffi_type; ! ! parg->obj = dict->setfunc(&parg->value, value, 0, type); if (parg->obj == NULL) { Py_DECREF(parg); |
From: Thomas H. <th...@us...> - 2005-03-31 14:21:35
|
Update of /cvsroot/ctypes/ctypes/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv9267 Modified Files: ctypes.h cfield.c Log Message: Got rid of the setfunc field in CFieldObject. Index: ctypes.h =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/ctypes.h,v retrieving revision 1.88 retrieving revision 1.89 diff -C2 -d -r1.88 -r1.89 *** ctypes.h 31 Mar 2005 09:18:53 -0000 1.88 --- ctypes.h 31 Mar 2005 14:21:18 -0000 1.89 *************** *** 141,145 **** object array */ PyObject *fieldtype; /* ctypes type of field */ - SETFUNC setfunc; /* setter function if proto is NULL */ } CFieldObject; --- 141,144 ---- Index: cfield.c =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/cfield.c,v retrieving revision 1.100 retrieving revision 1.101 diff -C2 -d -r1.100 -r1.101 *** cfield.c 31 Mar 2005 14:05:05 -0000 1.100 --- cfield.c 31 Mar 2005 14:21:18 -0000 1.101 *************** *** 41,45 **** { CFieldObject *self; ! int size, align, length; SETFUNC setfunc = NULL; StgDictObject *dict; --- 41,45 ---- { CFieldObject *self; ! int size, align; SETFUNC setfunc = NULL; StgDictObject *dict; *************** *** 95,104 **** size = dict->size; - length = dict->length; - - assert(dict->setfunc); - setfunc = dict->setfunc; - - self->setfunc = setfunc; self->index = index; --- 95,98 ---- *************** *** 168,172 **** CField_set(CFieldObject *self, CDataObject *dst, PyObject *value) { ! PyObject *result = self->setfunc(dst->b_ptr + self->offset, value, self->size, self->fieldtype); --- 162,167 ---- CField_set(CFieldObject *self, CDataObject *dst, PyObject *value) { ! StgDictObject *dict = PyType_stgdict(self->fieldtype); ! PyObject *result = dict->setfunc(dst->b_ptr + self->offset, value, self->size, self->fieldtype); |
From: Thomas H. <th...@us...> - 2005-03-31 14:11:05
|
Update of /cvsroot/ctypes/ctypes/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv3399 Modified Files: _ctypes.c Log Message: Fix compiler warnings. Index: _ctypes.c =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/_ctypes.c,v retrieving revision 1.255 retrieving revision 1.256 diff -C2 -d -r1.255 -r1.256 *** _ctypes.c 31 Mar 2005 14:04:10 -0000 1.255 --- _ctypes.c 31 Mar 2005 14:10:52 -0000 1.256 *************** *** 1020,1029 **** static PyObject * ! CharArray_getfunc(char *ptr, unsigned size, PyObject *type, CDataObject *src, int index) { int i; for (i = 0; i < size; ++i) ! if (ptr[i] == '\0') break; return PyString_FromStringAndSize(ptr, i); --- 1020,1029 ---- static PyObject * ! CharArray_getfunc(void *ptr, unsigned size, PyObject *type, CDataObject *src, int index) { int i; for (i = 0; i < size; ++i) ! if (((char *)ptr)[i] == '\0') break; return PyString_FromStringAndSize(ptr, i); *************** *** 1032,1041 **** #ifdef CTYPES_UNICODE static PyObject * ! WCharArray_getfunc(wchar_t *ptr, unsigned size, PyObject *type, CDataObject *src, int index) { 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); --- 1032,1041 ---- #ifdef CTYPES_UNICODE static PyObject * ! WCharArray_getfunc(void *ptr, unsigned size, PyObject *type, CDataObject *src, int index) { unsigned int i; for (i = 0; i < size/sizeof(wchar_t); ++i) ! if (((wchar_t *)ptr)[i] == (wchar_t)0) break; return PyUnicode_FromWideChar((wchar_t *)ptr, i); |
From: Thomas H. <th...@us...> - 2005-03-31 14:05:18
|
Update of /cvsroot/ctypes/ctypes/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv32316 Modified Files: cfield.c Log Message: Remove special casing now that WCharArray_setfunc is installed. Index: cfield.c =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/cfield.c,v retrieving revision 1.99 retrieving revision 1.100 diff -C2 -d -r1.99 -r1.100 *** cfield.c 31 Mar 2005 13:43:54 -0000 1.99 --- cfield.c 31 Mar 2005 14:05:05 -0000 1.100 *************** *** 100,123 **** setfunc = dict->setfunc; - /* 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); - StgDictObject *idict; - if (adict && adict->proto) { - idict = PyType_stgdict(adict->proto); - #ifdef CTYPES_UNICODE - if (idict->setfunc == getentry("u")->setfunc) { - struct fielddesc *fd = getentry("U"); - setfunc = fd->setfunc; - } - #endif - } - } - self->setfunc = setfunc; self->index = index; --- 100,103 ---- |
From: Thomas H. <th...@us...> - 2005-03-31 14:04:22
|
Update of /cvsroot/ctypes/ctypes/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv31990 Modified Files: _ctypes.c Log Message: Implement WCharArray_setfunc. Index: _ctypes.c =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/_ctypes.c,v retrieving revision 1.254 retrieving revision 1.255 diff -C2 -d -r1.254 -r1.255 *** _ctypes.c 31 Mar 2005 13:50:12 -0000 1.254 --- _ctypes.c 31 Mar 2005 14:04:10 -0000 1.255 *************** *** 921,924 **** --- 921,958 ---- } + /* merge code with WCharArray_set_value */ + static PyObject * + WCharArray_setfunc(void *ptr, PyObject *value, unsigned size, PyObject *type) + { + if (PyString_Check(value)) { + value = PyUnicode_FromEncodedObject(value, + conversion_mode_encoding, + conversion_mode_errors); + if (value == NULL) + return NULL; + } else + Py_INCREF(value); + if (PyUnicode_Check(value)) { + unsigned len = (unsigned)PyUnicode_GET_SIZE(value); + if (len > size/sizeof(wchar_t)) { + PyErr_SetString(PyExc_ValueError, + "string too long"); + Py_DECREF(value); + return NULL; + } + len = PyUnicode_AsWideChar((PyUnicodeObject *)value, + (wchar_t *)ptr, + size/sizeof(wchar_t)); + Py_DECREF(value); + if (len < 0) + return NULL; + if (len < size/sizeof(wchar_t)) + ((wchar_t *)ptr)[len] = (wchar_t)0; + Py_INCREF(Py_None); + return Py_None; + } + return StructUnion_setfunc(ptr, value, size, type); + } + static PyGetSetDef WCharArray_getsets[] = { { "value", (getter)WCharArray_get_value, (setter)WCharArray_set_value, *************** *** 1097,1101 **** return NULL; stgdict->getfunc = WCharArray_getfunc; ! // stgdict->setfunc = WCharArray_setfunc; #endif } --- 1131,1135 ---- return NULL; stgdict->getfunc = WCharArray_getfunc; ! stgdict->setfunc = WCharArray_setfunc; #endif } |
From: Thomas H. <th...@us...> - 2005-03-31 13:50:26
|
Update of /cvsroot/ctypes/ctypes/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv23907 Modified Files: _ctypes.c Log Message: Reorder functions. Index: _ctypes.c =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/_ctypes.c,v retrieving revision 1.253 retrieving revision 1.254 diff -C2 -d -r1.253 -r1.254 *** _ctypes.c 31 Mar 2005 13:43:54 -0000 1.253 --- _ctypes.c 31 Mar 2005 13:50:12 -0000 1.254 *************** *** 831,834 **** --- 831,867 ---- } + /* DRY: This function should be refactored with CharArray_set_value */ + static PyObject * + CharArray_setfunc(void *ptr, PyObject *value, unsigned size, PyObject *type) + { + if (PyUnicode_Check(value)) { + value = PyUnicode_AsEncodedString(value, + conversion_mode_encoding, + conversion_mode_errors); + if (value == NULL) + return NULL; + } else + Py_INCREF(value); + if (PyString_Check(value)) { + char *data = PyString_AS_STRING(value); + unsigned len = PyString_GET_SIZE(value); + if (len < size) + ++len; /* try to copy the terminating NUL if there is space */ + else if (len > size) { + Py_DECREF(value); + PyErr_Format(PyExc_ValueError, + "string too long (%d, maximum length %d)", + size, len); + return NULL; + } + memcpy(ptr, data, size); + Py_DECREF(value); + Py_INCREF(Py_None); + return Py_None; + } + Py_DECREF(value); + return StructUnion_setfunc(ptr, value, size, type); + } + static PyGetSetDef CharArray_getsets[] = { { "raw", (getter)CharArray_get_raw, (setter)CharArray_set_raw, *************** *** 963,999 **** } - /* DRY: This function should be refactored with CharArray_set_value */ - static PyObject * - CharArray_setfunc(void *ptr, PyObject *value, unsigned size, PyObject *type) - { - if (PyUnicode_Check(value)) { - value = PyUnicode_AsEncodedString(value, - conversion_mode_encoding, - conversion_mode_errors); - if (value == NULL) - return NULL; - } else - Py_INCREF(value); - if (PyString_Check(value)) { - char *data = PyString_AS_STRING(value); - unsigned len = PyString_GET_SIZE(value); - if (len < size) - ++len; /* try to copy the terminating NUL if there is space */ - else if (len > size) { - Py_DECREF(value); - PyErr_Format(PyExc_ValueError, - "string too long (%d, maximum length %d)", - size, len); - return NULL; - } - memcpy(ptr, data, size); - Py_DECREF(value); - Py_INCREF(Py_None); - return Py_None; - } - Py_DECREF(value); - return StructUnion_setfunc(ptr, value, size, type); - } - #ifdef CTYPES_UNICODE static PyObject * --- 996,999 ---- |
From: Thomas H. <th...@us...> - 2005-03-31 13:47:02
|
Update of /cvsroot/ctypes/ctypes/unittests In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv22176 Modified Files: test_complete_cover.py Log Message: Todo. Index: test_complete_cover.py =================================================================== RCS file: /cvsroot/ctypes/ctypes/unittests/test_complete_cover.py,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** test_complete_cover.py 24 Mar 2005 18:42:15 -0000 1.3 --- test_complete_cover.py 31 Mar 2005 13:46:22 -0000 1.4 *************** *** 25,34 **** self.failUnlessRaises(TypeError, lambda: setattr(X(), "u", 42)) self.failUnlessRaises(TypeError, lambda: setattr(X(), "u", "abc")) ! self.failUnlessRaises(UnicodeDecodeError, lambda: setattr(X(), "u", "ä")) # unicode array self.failUnlessRaises(TypeError, lambda: setattr(X(), "U", 42)) X().U = "abc" ! self.failUnlessRaises(UnicodeDecodeError, lambda: setattr(X(), "U", "ä")) X().z = 42 --- 25,34 ---- self.failUnlessRaises(TypeError, lambda: setattr(X(), "u", 42)) self.failUnlessRaises(TypeError, lambda: setattr(X(), "u", "abc")) ! ## self.failUnlessRaises(UnicodeDecodeError, lambda: setattr(X(), "u", "ä")) # unicode array self.failUnlessRaises(TypeError, lambda: setattr(X(), "U", 42)) X().U = "abc" ! ## self.failUnlessRaises(UnicodeDecodeError, lambda: setattr(X(), "U", "ä")) X().z = 42 *************** *** 81,84 **** --- 81,103 ---- print c_int.from_param(c_int(42)) + def test_pointer(self): + class POINT(Structure): + _fields_ = [("x", c_int), + ("y", c_int)] + + class PP(Structure): + _fields_ = [("pt1", POINTER(POINT))] + + pp = PP() + + # THIS ONE CRASHES WITH an object having negative refcount: + # The bug was already in 0.9.6 at least + #XXX pp.pt1 = cast(42, POINTER(POINT)) + + ## pp.pt1 = pointer(POINT(1, 2)) + ## pp.pt1[0].x + ## pp.pt1[0].y + + if __name__ == "__main__": unittest.main() |
From: Thomas H. <th...@us...> - 2005-03-31 13:45:34
|
Update of /cvsroot/ctypes/ctypes/unittests In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv21924 Modified Files: test_structures.py Log Message: We get a different error message now. Check that we can assign unicode strings to c_char arrays. Index: test_structures.py =================================================================== RCS file: /cvsroot/ctypes/ctypes/unittests/test_structures.py,v retrieving revision 1.32 retrieving revision 1.33 diff -C2 -d -r1.32 -r1.33 *** test_structures.py 14 Mar 2005 08:06:12 -0000 1.32 --- test_structures.py 31 Mar 2005 13:45:24 -0000 1.33 *************** *** 291,299 **** cls, msg = self.get_except(Person, "Someone", (1, 2)) self.failUnlessEqual(cls, RuntimeError) ! self.failUnlessEqual(msg, ! "(Phone) exceptions.TypeError: " ! "expected string or Unicode object, int found") cls, msg = self.get_except(Person, "Someone", ("a", "b", "c")) self.failUnlessEqual(cls, RuntimeError) --- 291,309 ---- cls, msg = self.get_except(Person, "Someone", (1, 2)) + # Hm. Shouldn't we get a TypeError? self.failUnlessEqual(cls, RuntimeError) ! ## The error messags is different now. ! ## self.failUnlessEqual(msg, ! ## "(Phone) exceptions.TypeError: " ! ## "expected string or Unicode object, int found") + try: + c_wchar + except NameError: + pass + else: + # must accept unicode + self.failUnlessEqual(Person(u"Someone").name, "Someone") + cls, msg = self.get_except(Person, "Someone", ("a", "b", "c")) self.failUnlessEqual(cls, RuntimeError) |
From: Thomas H. <th...@us...> - 2005-03-31 13:44:04
|
Update of /cvsroot/ctypes/ctypes/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv21090 Modified Files: cfield.c _ctypes.c Log Message: Implement CharArray_setfunc. Index: cfield.c =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/cfield.c,v retrieving revision 1.98 retrieving revision 1.99 diff -C2 -d -r1.98 -r1.99 *** cfield.c 31 Mar 2005 13:09:22 -0000 1.98 --- cfield.c 31 Mar 2005 13:43:54 -0000 1.99 *************** *** 111,118 **** 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) { --- 111,114 ---- *************** *** 902,905 **** --- 898,904 ---- unsigned size; + /* XXX This accepts unicode converting it with the default ancoding. + Not what we want. + */ data = PyString_AsString(value); if (!data) Index: _ctypes.c =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/_ctypes.c,v retrieving revision 1.252 retrieving revision 1.253 diff -C2 -d -r1.252 -r1.253 *** _ctypes.c 31 Mar 2005 12:55:38 -0000 1.252 --- _ctypes.c 31 Mar 2005 13:43:54 -0000 1.253 *************** *** 963,966 **** --- 963,999 ---- } + /* DRY: This function should be refactored with CharArray_set_value */ + static PyObject * + CharArray_setfunc(void *ptr, PyObject *value, unsigned size, PyObject *type) + { + if (PyUnicode_Check(value)) { + value = PyUnicode_AsEncodedString(value, + conversion_mode_encoding, + conversion_mode_errors); + if (value == NULL) + return NULL; + } else + Py_INCREF(value); + if (PyString_Check(value)) { + char *data = PyString_AS_STRING(value); + unsigned len = PyString_GET_SIZE(value); + if (len < size) + ++len; /* try to copy the terminating NUL if there is space */ + else if (len > size) { + Py_DECREF(value); + PyErr_Format(PyExc_ValueError, + "string too long (%d, maximum length %d)", + size, len); + return NULL; + } + memcpy(ptr, data, size); + Py_DECREF(value); + Py_INCREF(Py_None); + return Py_None; + } + Py_DECREF(value); + return StructUnion_setfunc(ptr, value, size, type); + } + #ifdef CTYPES_UNICODE static PyObject * *************** *** 1058,1061 **** --- 1091,1095 ---- return NULL; stgdict->getfunc = CharArray_getfunc; + stgdict->setfunc = CharArray_setfunc; #ifdef CTYPES_UNICODE } else if (itemdict->getfunc == getentry("u")->getfunc) { *************** *** 1063,1066 **** --- 1097,1101 ---- return NULL; stgdict->getfunc = WCharArray_getfunc; + // stgdict->setfunc = WCharArray_setfunc; #endif } |
From: Thomas H. <th...@us...> - 2005-03-31 13:09:31
|
Update of /cvsroot/ctypes/ctypes/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv523 Modified Files: cfield.c Log Message: Remove _generic_field_setfunc - no longer needed. Index: cfield.c =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/cfield.c,v retrieving revision 1.97 retrieving revision 1.98 diff -C2 -d -r1.97 -r1.98 *** cfield.c 31 Mar 2005 12:00:35 -0000 1.97 --- cfield.c 31 Mar 2005 13:09:22 -0000 1.98 *************** *** 23,90 **** } - /* 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. - */ - static PyObject * - _generic_field_setfunc(void *ptr, PyObject *value, unsigned size, - PyObject *type) - { - /* 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); - Py_DECREF(ob); - return result; - } - if (value == Py_None && PointerTypeObject_Check(type)) { - *(void **)ptr = NULL; /*GCOV*/ - Py_INCREF(Py_None); /*GCOV*/ - return Py_None; /*GCOV*/ - } - } - PyErr_Format(PyExc_TypeError, - "Incompatible types %s instance instead of %s instance", - value->ob_type->tp_name, - ((PyTypeObject *)type)->tp_name); - return NULL; - } - /* * Expects the size, index and offset for the current field in *psize and --- 23,26 ---- *************** *** 161,165 **** length = dict->length; ! setfunc = dict->setfunc ? dict->setfunc : _generic_field_setfunc; /* Field descriptors for 'c_char * n' are be special cased to --- 97,102 ---- length = dict->length; ! assert(dict->setfunc); ! setfunc = dict->setfunc; /* Field descriptors for 'c_char * n' are be special cased to |
From: Thomas H. <th...@us...> - 2005-03-31 12:55:59
|
Update of /cvsroot/ctypes/ctypes/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv26295 Modified Files: _ctypes.c Log Message: Implement and install Pointer_setfunc. CFuncPtr gets basic_setfunc. Index: _ctypes.c =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/_ctypes.c,v retrieving revision 1.251 retrieving revision 1.252 diff -C2 -d -r1.251 -r1.252 *** _ctypes.c 31 Mar 2005 11:47:59 -0000 1.251 --- _ctypes.c 31 Mar 2005 12:55:38 -0000 1.252 *************** *** 572,575 **** --- 572,599 ---- } + /* derived from cfield.c::_generic_field_setfunc */ + static PyObject * + Pointer_setfunc(void *ptr, PyObject *value, unsigned size, PyObject *type) + { + StgDictObject *dict; + + if (value == Py_None) { + *(void **)ptr = NULL; + Py_INCREF(Py_None); + return Py_None; + } + dict = PyObject_stgdict(value); + if (dict + && ArrayObject_Check(value) + /* Should we accept subclasses here? */ + && dict->proto == PyType_stgdict(type)->proto) { + *(void **)ptr = ((CDataObject *)value)->b_ptr; + /* We need to keep the array alive, not just the arrays b_objects. */ + Py_INCREF(value); + return value; + } + return basic_setfunc(ptr, value, size, type); + } + static PyObject * PointerType_new(PyTypeObject *type, PyObject *args, PyObject *kwds) *************** *** 618,621 **** --- 642,646 ---- stgdict->getfunc = generic_getfunc; + stgdict->setfunc = Pointer_setfunc; return (PyObject *)result; *************** *** 1578,1583 **** stgdict->length = 1; stgdict->size = sizeof(void *); - stgdict->setfunc = NULL; stgdict->getfunc = generic_getfunc; stgdict->ffi_type = ffi_type_pointer; --- 1603,1608 ---- stgdict->length = 1; stgdict->size = sizeof(void *); stgdict->getfunc = generic_getfunc; + stgdict->setfunc = basic_setfunc; stgdict->ffi_type = ffi_type_pointer; |
From: Thomas H. <th...@us...> - 2005-03-31 12:00:46
|
Update of /cvsroot/ctypes/ctypes/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv29867 Modified Files: cfield.c Log Message: Get rid of another compiler warning. Index: cfield.c =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/cfield.c,v retrieving revision 1.96 retrieving revision 1.97 diff -C2 -d -r1.96 -r1.97 *** cfield.c 31 Mar 2005 11:57:08 -0000 1.96 --- cfield.c 31 Mar 2005 12:00:35 -0000 1.97 *************** *** 29,33 **** */ static PyObject * ! _generic_field_setfunc(char *ptr, PyObject *value, unsigned size, PyObject *type) { --- 29,33 ---- */ static PyObject * ! _generic_field_setfunc(void *ptr, PyObject *value, unsigned size, PyObject *type) { |
From: Thomas H. <th...@us...> - 2005-03-31 11:57:17
|
Update of /cvsroot/ctypes/ctypes/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv28432 Modified Files: cfield.c Log Message: Make the setfuncs conform to their prototype. Index: cfield.c =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/cfield.c,v retrieving revision 1.95 retrieving revision 1.96 diff -C2 -d -r1.95 -r1.96 *** cfield.c 31 Mar 2005 11:36:38 -0000 1.95 --- cfield.c 31 Mar 2005 11:57:08 -0000 1.96 *************** *** 509,513 **** static PyObject * ! b_set(void *ptr, PyObject *value, unsigned size, ...) { long val; --- 509,513 ---- static PyObject * ! b_set(void *ptr, PyObject *value, unsigned size, PyObject *type) { long val; *************** *** 528,532 **** static PyObject * ! B_set(void *ptr, PyObject *value, unsigned size, ...) { unsigned long val; --- 528,532 ---- static PyObject * ! B_set(void *ptr, PyObject *value, unsigned size, PyObject *type) { unsigned long val; *************** *** 548,552 **** static PyObject * ! h_set(void *ptr, PyObject *value, unsigned size, ...) { long val; --- 548,552 ---- static PyObject * ! h_set(void *ptr, PyObject *value, unsigned size, PyObject *type) { long val; *************** *** 567,571 **** static PyObject * ! H_set(void *ptr, PyObject *value, unsigned size, ...) { unsigned long val; --- 567,571 ---- static PyObject * ! H_set(void *ptr, PyObject *value, unsigned size, PyObject *type) { unsigned long val; *************** *** 591,595 **** #else static PyObject * ! i_set(void *ptr, PyObject *value, unsigned size, ...) { long val; --- 591,595 ---- #else static PyObject * ! i_set(void *ptr, PyObject *value, unsigned size, PyObject *type) { long val; *************** *** 612,616 **** /* short BOOL - VARIANT_BOOL */ static PyObject * ! vBOOL_set(void *ptr, PyObject *value, unsigned size, ...) { switch (PyObject_IsTrue(value)) { --- 612,616 ---- /* short BOOL - VARIANT_BOOL */ static PyObject * ! vBOOL_set(void *ptr, PyObject *value, unsigned size, PyObject *type) { switch (PyObject_IsTrue(value)) { *************** *** 638,642 **** #else static PyObject * ! I_set(void *ptr, PyObject *value, unsigned size, ...) { unsigned long val; --- 638,642 ---- #else static PyObject * ! I_set(void *ptr, PyObject *value, unsigned size, PyObject *type) { unsigned long val; *************** *** 658,662 **** static PyObject * ! l_set(void *ptr, PyObject *value, unsigned size, ...) { long val; --- 658,662 ---- static PyObject * ! l_set(void *ptr, PyObject *value, unsigned size, PyObject *type) { long val; *************** *** 677,681 **** static PyObject * ! L_set(void *ptr, PyObject *value, unsigned size, ...) { unsigned long val; --- 677,681 ---- static PyObject * ! L_set(void *ptr, PyObject *value, unsigned size, PyObject *type) { unsigned long val; *************** *** 697,701 **** #ifdef HAVE_LONG_LONG static PyObject * ! q_set(void *ptr, PyObject *value, unsigned size, ...) { PY_LONG_LONG val; --- 697,701 ---- #ifdef HAVE_LONG_LONG static PyObject * ! q_set(void *ptr, PyObject *value, unsigned size, PyObject *type) { PY_LONG_LONG val; *************** *** 715,719 **** static PyObject * ! Q_set(void *ptr, PyObject *value, unsigned size, ...) { unsigned PY_LONG_LONG val; --- 715,719 ---- static PyObject * ! Q_set(void *ptr, PyObject *value, unsigned size, PyObject *type) { unsigned PY_LONG_LONG val; *************** *** 740,744 **** static PyObject * ! d_set(void *ptr, PyObject *value, unsigned size, ...) { double x; --- 740,744 ---- static PyObject * ! d_set(void *ptr, PyObject *value, unsigned size, PyObject *type) { double x; *************** *** 762,766 **** static PyObject * ! f_set(void *ptr, PyObject *value, unsigned size, ...) { float x; --- 762,766 ---- static PyObject * ! f_set(void *ptr, PyObject *value, unsigned size, PyObject *type) { float x; *************** *** 798,802 **** static PyObject * ! O_set(void *ptr, PyObject *value, unsigned size, ...) { *(PyObject **)ptr = value; --- 798,802 ---- static PyObject * ! O_set(void *ptr, PyObject *value, unsigned size, PyObject *type) { *(PyObject **)ptr = value; *************** *** 807,811 **** static PyObject * ! c_set(void *ptr, PyObject *value, unsigned size, ...) { if (!PyString_Check(value) || (1 != PyString_Size(value))) { --- 807,811 ---- static PyObject * ! c_set(void *ptr, PyObject *value, unsigned size, PyObject *type) { if (!PyString_Check(value) || (1 != PyString_Size(value))) { *************** *** 829,833 **** /* u - a single wchar_t character */ static PyObject * ! u_set(void *ptr, PyObject *value, unsigned size, ...) { int len; --- 829,833 ---- /* u - a single wchar_t character */ static PyObject * ! u_set(void *ptr, PyObject *value, unsigned size, PyObject *type) { int len; *************** *** 902,906 **** static PyObject * ! U_set(void *ptr, PyObject *value, unsigned length, ...) { unsigned int size; --- 902,906 ---- static PyObject * ! U_set(void *ptr, PyObject *value, unsigned length, PyObject *type) { unsigned int size; *************** *** 960,964 **** static PyObject * ! s_set(void *ptr, PyObject *value, unsigned length, ...) { char *data; --- 960,964 ---- static PyObject * ! s_set(void *ptr, PyObject *value, unsigned length, PyObject *type) { char *data; *************** *** 986,990 **** static PyObject * ! z_set(void *ptr, PyObject *value, unsigned size, ...) { if (value == Py_None) { --- 986,990 ---- static PyObject * ! z_set(void *ptr, PyObject *value, unsigned size, PyObject *type) { if (value == Py_None) { *************** *** 1030,1034 **** #ifdef CTYPES_UNICODE static PyObject * ! Z_set(void *ptr, PyObject *value, unsigned size, ...) { if (value == Py_None) { --- 1030,1034 ---- #ifdef CTYPES_UNICODE static PyObject * ! Z_set(void *ptr, PyObject *value, unsigned size, PyObject *type) { if (value == Py_None) { *************** *** 1108,1112 **** #ifdef MS_WIN32 static PyObject * ! BSTR_set(void *ptr, PyObject *value, unsigned size, ...) { BSTR bstr; --- 1108,1112 ---- #ifdef MS_WIN32 static PyObject * ! BSTR_set(void *ptr, PyObject *value, unsigned size, PyObject *type) { BSTR bstr; *************** *** 1168,1172 **** static PyObject * ! P_set(void *ptr, PyObject *value, unsigned size, ...) { void *v; --- 1168,1172 ---- static PyObject * ! P_set(void *ptr, PyObject *value, unsigned size, PyObject *type) { void *v; |
From: Thomas H. <th...@us...> - 2005-03-31 11:48:24
|
Update of /cvsroot/ctypes/ctypes/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv23234 Modified Files: _ctypes.c Log Message: Several simplifications. Install StructUnion_setfunc. Mark obviously unused code. Index: _ctypes.c =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/_ctypes.c,v retrieving revision 1.250 retrieving revision 1.251 diff -C2 -d -r1.250 -r1.251 *** _ctypes.c 31 Mar 2005 10:18:41 -0000 1.250 --- _ctypes.c 31 Mar 2005 11:47:59 -0000 1.251 *************** *** 122,126 **** static PyObject * generic_getfunc(void *ptr, unsigned size, ! PyObject *type, CDataObject *src, ...) { if (type == NULL) { --- 122,126 ---- static PyObject * generic_getfunc(void *ptr, unsigned size, ! PyObject *type, CDataObject *src, int index) { if (type == NULL) { *************** *** 929,933 **** static PyObject * CharArray_getfunc(char *ptr, unsigned size, ! PyObject *type, CDataObject *src, ...) { int i; --- 929,933 ---- static PyObject * CharArray_getfunc(char *ptr, unsigned size, ! PyObject *type, CDataObject *src, int index) { int i; *************** *** 941,945 **** static PyObject * WCharArray_getfunc(wchar_t *ptr, unsigned size, ! PyObject *type, CDataObject *src, ...) { unsigned int i; --- 941,945 ---- static PyObject * WCharArray_getfunc(wchar_t *ptr, unsigned size, ! PyObject *type, CDataObject *src, int index) { unsigned int i; *************** *** 1022,1025 **** --- 1022,1026 ---- stgdict->getfunc = generic_getfunc; + stgdict->setfunc = StructUnion_setfunc; /* Special casing character arrays. A permanent annoyance: char arrays are also strings! *************** *** 2007,2010 **** --- 2008,2012 ---- * This function has the same signature as the SETFUNC has. * XXX Explain differences between this function and the type's setfunc. + * XXX See also _generic_field_setfunc... */ static PyObject * *************** *** 2015,2020 **** 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 --- 2017,2025 ---- if (!CDataObject_Check(value)) { StgDictObject *dict = PyType_stgdict(type); ! assert(dict); ! assert(dict->setfunc); ! return dict->setfunc(ptr, value, size, type); ! /* Seems this code is unused */ ! #if 0 /* If value is a tuple, we try to call the type with the tuple *************** *** 2045,2051 **** --- 2050,2058 ---- return NULL; } + #endif } src = (CDataObject *)value; + /* Hm. Shouldn't dict->setfunc accept this? */ if (PyObject_IsInstance(value, type)) { memcpy(ptr, *************** *** 2058,2061 **** --- 2065,2070 ---- } + /* Seems this code is unused */ + #if 0 if (PointerTypeObject_Check(type) && ArrayObject_Check(value)) { *************** *** 2079,2082 **** --- 2088,2092 ---- return (PyObject *)src; } + #endif PyErr_Format(PyExc_TypeError, "incompatible types, %s instance instead of %s instance", *************** *** 3337,3341 **** { StgDictObject *stgdict, *itemdict; - PyObject *proto; PyListObject *np; int i, len; --- 3347,3350 ---- *************** *** 3352,3358 **** stgdict = PyObject_stgdict((PyObject *)self); ! 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; --- 3361,3366 ---- stgdict = PyObject_stgdict((PyObject *)self); ! itemdict = PyType_stgdict(stgdict->proto); ! if (itemdict->getfunc == getentry("c")->getfunc) { char *ptr = (char *)self->b_ptr; *************** *** 3381,3386 **** int size, offset; StgDictObject *stgdict; - PyObject *itemtype; - char *ptr; PyObject *keep; --- 3389,3392 ---- *************** *** 3399,3406 **** size = stgdict->size / stgdict->length; offset = index * size; - ptr = self->b_ptr + offset; - itemtype = stgdict->proto; ! keep = _CData_set(ptr, value, size, itemtype); if (keep == NULL) return -1; --- 3405,3410 ---- size = stgdict->size / stgdict->length; offset = index * size; ! keep = _CData_set(self->b_ptr + offset, value, size, stgdict->proto); if (keep == NULL) return -1; *************** *** 3883,3887 **** PyListObject *np; StgDictObject *stgdict, *itemdict; - PyObject *proto; int i, len; --- 3887,3890 ---- *************** *** 3893,3899 **** stgdict = PyObject_stgdict((PyObject *)self); ! 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; --- 3896,3901 ---- stgdict = PyObject_stgdict((PyObject *)self); ! itemdict = PyType_stgdict(stgdict->proto); ! if (itemdict->getfunc == getentry("c")->getfunc) { char *ptr = *(char **)self->b_ptr; |
From: Thomas H. <th...@us...> - 2005-03-31 11:37:03
|
Update of /cvsroot/ctypes/ctypes/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv18139 Modified Files: cfield.c Log Message: Add assertions. Index: cfield.c =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/cfield.c,v retrieving revision 1.94 retrieving revision 1.95 diff -C2 -d -r1.94 -r1.95 *** cfield.c 31 Mar 2005 08:32:04 -0000 1.94 --- cfield.c 31 Mar 2005 11:36:38 -0000 1.95 *************** *** 822,825 **** --- 822,826 ---- c_get(void *ptr, unsigned size, PyObject *type, CDataObject *src, int index) { + assert(size == 1); return PyString_FromStringAndSize((char *)ptr, 1); } *************** *** 864,867 **** --- 865,869 ---- u_get(void *ptr, unsigned size, PyObject *type, CDataObject *src, int index) { + assert(size = sizeof(wchar_t)); return PyUnicode_FromWideChar((wchar_t *)ptr, 1); } |
From: Thomas H. <th...@us...> - 2005-03-31 10:18:51
|
Update of /cvsroot/ctypes/ctypes/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv3304 Modified Files: _ctypes.c Log Message: _CData_set conforms now to the signature of SETFUNC. Index: _ctypes.c =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/_ctypes.c,v retrieving revision 1.249 retrieving revision 1.250 diff -C2 -d -r1.249 -r1.250 *** _ctypes.c 31 Mar 2005 09:57:47 -0000 1.249 --- _ctypes.c 31 Mar 2005 10:18:41 -0000 1.250 *************** *** 2004,2013 **** /* ! * Set a slice in object 'dst', which has the type 'type', ! * to the value 'value'. */ static PyObject * ! _CData_set(CDataObject *dst, PyObject *type, PyObject *value, ! int size, char *ptr) { CDataObject *src; --- 2004,2013 ---- /* ! * Set an item in object 'dst', which has the itemtype 'type', to 'value'. ! * This function has the same signature as the SETFUNC has. ! * XXX Explain differences between this function and the type's setfunc. */ static PyObject * ! _CData_set(void *ptr, PyObject *value, unsigned size, PyObject *type) { CDataObject *src; *************** *** 2031,2040 **** return NULL; } ! result = _CData_set(dst, type, ob, ! size, ptr); Py_DECREF(ob); return result; } else if (value == Py_None && PointerTypeObject_Check(type)) { ! *(void **)dst->b_ptr = NULL; Py_INCREF(Py_None); return Py_None; --- 2031,2039 ---- return NULL; } ! result = _CData_set(ptr, ob, size, type); Py_DECREF(ob); return result; } else if (value == Py_None && PointerTypeObject_Check(type)) { ! *(void **)ptr = NULL; Py_INCREF(Py_None); return Py_None; *************** *** 3403,3407 **** itemtype = stgdict->proto; ! keep = _CData_set(self, itemtype, value, size, ptr); if (keep == NULL) return -1; --- 3402,3406 ---- itemtype = stgdict->proto; ! keep = _CData_set(ptr, value, size, itemtype); if (keep == NULL) return -1; *************** *** 3765,3770 **** size = stgdict->size / stgdict->length; ! keep = _CData_set(self, stgdict->proto, value, ! size, *(void **)self->b_ptr); if (keep == NULL) return -1; --- 3764,3768 ---- size = stgdict->size / stgdict->length; ! keep = _CData_set(*(void **)self->b_ptr, value, size, stgdict->proto); if (keep == NULL) return -1; |
From: Thomas H. <th...@us...> - 2005-03-31 09:58:25
|
Update of /cvsroot/ctypes/ctypes/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv24082 Modified Files: _ctypes.c Log Message: Inline CData_set in Pointer_ass_item also, and remove CData_set completely. Index: _ctypes.c =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/_ctypes.c,v retrieving revision 1.248 retrieving revision 1.249 diff -C2 -d -r1.248 -r1.249 *** _ctypes.c 31 Mar 2005 09:47:08 -0000 1.248 --- _ctypes.c 31 Mar 2005 09:57:47 -0000 1.249 *************** *** 2004,2009 **** /* ! Helper function for CData_set below. ! */ static PyObject * _CData_set(CDataObject *dst, PyObject *type, PyObject *value, --- 2004,2010 ---- /* ! * Set a slice in object 'dst', which has the type 'type', ! * to the value 'value'. ! */ static PyObject * _CData_set(CDataObject *dst, PyObject *type, PyObject *value, *************** *** 2086,2108 **** } - /* - * Set a slice in object 'dst', which has the type 'type', - * to the value 'value'. - */ - static int - CData_set(CDataObject *dst, PyObject *type, PyObject *value, - int index, int size, char *ptr) - { - PyObject *result = _CData_set(dst, type, value, - size, ptr); - if (result == NULL) - return -1; - - /* KeepRef steals a refcount from it's last argument */ - /* If KeepRef fails, we are stumped. The dst memory block has already - been changed */ - return KeepRef(dst, index, result); - } - /******************************************************************/ --- 2087,2090 ---- *************** *** 3761,3764 **** --- 3743,3747 ---- int size; StgDictObject *stgdict; + PyObject *keep; if (value == NULL) { *************** *** 3782,3788 **** size = stgdict->size / stgdict->length; ! /* XXXXX Make sure proto is NOT NULL! */ ! return CData_set(self, stgdict->proto, value, ! index, size, *(void **)self->b_ptr); } --- 3765,3773 ---- size = stgdict->size / stgdict->length; ! keep = _CData_set(self, stgdict->proto, value, ! size, *(void **)self->b_ptr); ! if (keep == NULL) ! return -1; ! return KeepRef(self, index, keep); } |
From: Thomas H. <th...@us...> - 2005-03-31 09:47:41
|
Update of /cvsroot/ctypes/ctypes/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv19157 Modified Files: _ctypes.c Log Message: Inline CData_set in Array_ass_item. Index: _ctypes.c =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/_ctypes.c,v retrieving revision 1.247 retrieving revision 1.248 diff -C2 -d -r1.247 -r1.248 *** _ctypes.c 31 Mar 2005 09:44:08 -0000 1.247 --- _ctypes.c 31 Mar 2005 09:47:08 -0000 1.248 *************** *** 3402,3405 **** --- 3402,3406 ---- PyObject *itemtype; char *ptr; + PyObject *keep; if (value == NULL) { *************** *** 3420,3425 **** itemtype = stgdict->proto; ! return CData_set(self, itemtype, value, ! index, size, ptr); } --- 3421,3428 ---- itemtype = stgdict->proto; ! keep = _CData_set(self, itemtype, value, size, ptr); ! if (keep == NULL) ! return -1; ! return KeepRef(self, index, keep); } |
From: Thomas H. <th...@us...> - 2005-03-31 09:44:20
|
Update of /cvsroot/ctypes/ctypes/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv16926 Modified Files: _ctypes.c Log Message: Remove more unused code. Index: _ctypes.c =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/_ctypes.c,v retrieving revision 1.246 retrieving revision 1.247 diff -C2 -d -r1.246 -r1.247 *** _ctypes.c 31 Mar 2005 09:23:26 -0000 1.246 --- _ctypes.c 31 Mar 2005 09:44:08 -0000 1.247 *************** *** 2053,2059 **** size); - if (PointerTypeObject_Check(type)) - /* XXX */; - value = GetKeepedObjects(src); Py_INCREF(value); --- 2053,2056 ---- *************** *** 2064,2071 **** && ArrayObject_Check(value)) { StgDictObject *p1, *p2; - PyObject *keep; p1 = PyObject_stgdict(value); p2 = PyType_stgdict(type); if (p1->proto != p2->proto) { PyErr_Format(PyExc_TypeError, --- 2061,2068 ---- && ArrayObject_Check(value)) { StgDictObject *p1, *p2; p1 = PyObject_stgdict(value); p2 = PyType_stgdict(type); + /* Should probably use issubclass instead of == ... */ if (p1->proto != p2->proto) { PyErr_Format(PyExc_TypeError, *************** *** 2076,2096 **** } *(void **)ptr = src->b_ptr; ! ! keep = GetKeepedObjects(src); ! /* ! We are assigning an array object to a field which represents ! a pointer. This has the same effect as converting an array ! into a pointer. So, again, we have to keep the whole object ! pointed to (which is the array in this case) alive, and not ! only it's object list. So we create a tuple, containing ! 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); } PyErr_Format(PyExc_TypeError, --- 2073,2081 ---- } *(void **)ptr = src->b_ptr; ! /* We are assigning an array object to a field representing a ! pointer. We need to keep the array object alive, not only ! its b_objects. */ ! return (PyObject *)src; } PyErr_Format(PyExc_TypeError, |
From: Thomas H. <th...@us...> - 2005-03-31 09:23:55
|
Update of /cvsroot/ctypes/ctypes/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv5337 Modified Files: _ctypes.c Log Message: More simplifications in CData_set. Index: _ctypes.c =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/_ctypes.c,v retrieving revision 1.245 retrieving revision 1.246 diff -C2 -d -r1.245 -r1.246 *** _ctypes.c 31 Mar 2005 09:18:54 -0000 1.245 --- _ctypes.c 31 Mar 2005 09:23:26 -0000 1.246 *************** *** 2106,2123 **** */ static int ! CData_set(PyObject *dst, PyObject *type, PyObject *value, int index, int size, char *ptr) { ! CDataObject *mem = (CDataObject *)dst; ! PyObject *result; ! ! if (!CDataObject_Check(dst)) { ! PyErr_SetString(PyExc_TypeError, ! "not a ctype instance"); ! return -1; ! } ! ! result = _CData_set(mem, type, value, ! size, ptr); if (result == NULL) return -1; --- 2106,2114 ---- */ static int ! CData_set(CDataObject *dst, PyObject *type, PyObject *value, int index, int size, char *ptr) { ! PyObject *result = _CData_set(dst, type, value, ! size, ptr); if (result == NULL) return -1; *************** *** 2126,2130 **** /* If KeepRef fails, we are stumped. The dst memory block has already been changed */ ! return KeepRef(mem, index, result); } --- 2117,2121 ---- /* If KeepRef fails, we are stumped. The dst memory block has already been changed */ ! return KeepRef(dst, index, result); } *************** *** 3444,3448 **** itemtype = stgdict->proto; ! return CData_set((PyObject *)self, itemtype, value, index, size, ptr); } --- 3435,3439 ---- itemtype = stgdict->proto; ! return CData_set(self, itemtype, value, index, size, ptr); } *************** *** 3804,3808 **** /* XXXXX Make sure proto is NOT NULL! */ ! return CData_set((PyObject *)self, stgdict->proto, value, index, size, *(void **)self->b_ptr); } --- 3795,3799 ---- /* XXXXX Make sure proto is NOT NULL! */ ! return CData_set(self, stgdict->proto, value, index, size, *(void **)self->b_ptr); } |
From: Thomas H. <th...@us...> - 2005-03-31 09:19:05
|
Update of /cvsroot/ctypes/ctypes/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv2821 Modified Files: ctypes.h _ctypes.c Log Message: Simplify CData_set: - make it static - remove the setfunc parameter, which was always NULL Index: ctypes.h =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/ctypes.h,v retrieving revision 1.87 retrieving revision 1.88 diff -C2 -d -r1.87 -r1.88 *** ctypes.h 31 Mar 2005 09:05:13 -0000 1.87 --- ctypes.h 31 Mar 2005 09:18:53 -0000 1.88 *************** *** 273,280 **** extern PyCArgObject *new_CArgObject(void); - extern int - CData_set(PyObject *dst, PyObject *type, SETFUNC setfunc, PyObject *value, - int index, int size, char *ptr); - extern void Extend_Error_Info(PyObject *exc_class, char *fmt, ...); --- 273,276 ---- Index: _ctypes.c =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/_ctypes.c,v retrieving revision 1.244 retrieving revision 1.245 diff -C2 -d -r1.244 -r1.245 *** _ctypes.c 31 Mar 2005 08:34:21 -0000 1.244 --- _ctypes.c 31 Mar 2005 09:18:54 -0000 1.245 *************** *** 2007,2018 **** */ static PyObject * ! _CData_set(CDataObject *dst, PyObject *type, SETFUNC setfunc, PyObject *value, int size, char *ptr) { CDataObject *src; - if (setfunc) - return setfunc(ptr, value, size, type); - if (!CDataObject_Check(value)) { StgDictObject *dict = PyType_stgdict(type); --- 2007,2015 ---- */ static PyObject * ! _CData_set(CDataObject *dst, PyObject *type, PyObject *value, int size, char *ptr) { CDataObject *src; if (!CDataObject_Check(value)) { StgDictObject *dict = PyType_stgdict(type); *************** *** 2033,2037 **** return NULL; } ! result = _CData_set(dst, type, setfunc, ob, size, ptr); Py_DECREF(ob); --- 2030,2034 ---- return NULL; } ! result = _CData_set(dst, type, ob, size, ptr); Py_DECREF(ob); *************** *** 2108,2113 **** * to the value 'value'. */ ! int ! CData_set(PyObject *dst, PyObject *type, SETFUNC setfunc, PyObject *value, int index, int size, char *ptr) { --- 2105,2110 ---- * to the value 'value'. */ ! static int ! CData_set(PyObject *dst, PyObject *type, PyObject *value, int index, int size, char *ptr) { *************** *** 2121,2125 **** } ! result = _CData_set(mem, type, setfunc, value, size, ptr); if (result == NULL) --- 2118,2122 ---- } ! result = _CData_set(mem, type, value, size, ptr); if (result == NULL) *************** *** 3427,3430 **** --- 3424,3428 ---- int size, offset; StgDictObject *stgdict; + PyObject *itemtype; char *ptr; *************** *** 3444,3449 **** offset = index * size; ptr = self->b_ptr + offset; ! return CData_set((PyObject *)self, stgdict->proto, stgdict->setfunc, value, index, size, ptr); } --- 3442,3448 ---- offset = index * size; ptr = self->b_ptr + offset; + itemtype = stgdict->proto; ! return CData_set((PyObject *)self, itemtype, value, index, size, ptr); } *************** *** 3805,3809 **** /* XXXXX Make sure proto is NOT NULL! */ ! return CData_set((PyObject *)self, stgdict->proto, stgdict->setfunc, value, index, size, *(void **)self->b_ptr); } --- 3804,3808 ---- /* XXXXX Make sure proto is NOT NULL! */ ! return CData_set((PyObject *)self, stgdict->proto, value, index, size, *(void **)self->b_ptr); } |
From: Thomas H. <th...@us...> - 2005-03-31 09:05:40
|
Update of /cvsroot/ctypes/ctypes/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv27365 Modified Files: ctypes.h Log Message: *** empty log message *** Index: ctypes.h =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/ctypes.h,v retrieving revision 1.86 retrieving revision 1.87 diff -C2 -d -r1.86 -r1.87 *** ctypes.h 31 Mar 2005 08:32:04 -0000 1.86 --- ctypes.h 31 Mar 2005 09:05:13 -0000 1.87 *************** *** 122,134 **** 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... ! */ ! ! //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 */ --- 122,127 ---- extern PyMethodDef module_methods[]; ! typedef PyObject *(* GETFUNC)(void *ptr, unsigned size, PyObject *type, CDataObject *src, int index); ! typedef PyObject *(* SETFUNC)(void *ptr, PyObject* value, unsigned size, PyObject *type); /* a table entry describing a predefined ctypes type */ |
From: Thomas H. <th...@us...> - 2005-03-31 08:34:47
|
Update of /cvsroot/ctypes/ctypes/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv11099 Modified Files: _ctypes.c Log Message: A setfunc for structures and unions. Index: _ctypes.c =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/_ctypes.c,v retrieving revision 1.243 retrieving revision 1.244 diff -C2 -d -r1.243 -r1.244 *** _ctypes.c 31 Mar 2005 08:32:05 -0000 1.243 --- _ctypes.c 31 Mar 2005 08:34:21 -0000 1.244 *************** *** 216,220 **** result->tp_dict = (PyObject *)dict; ! // dict->setfunc = StructUnion_setfunc; dict->getfunc = generic_getfunc; --- 216,220 ---- result->tp_dict = (PyObject *)dict; ! dict->setfunc = StructUnion_setfunc; dict->getfunc = generic_getfunc; |