[ctypes-commit] ctypes/source cfield.c,1.81,1.82
Brought to you by:
theller
From: Thomas H. <th...@us...> - 2005-03-24 09:52:56
|
Update of /cvsroot/ctypes/ctypes/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv10285 Modified Files: cfield.c Log Message: Refactoring: inline the _CData_set code into CField_set. Index: cfield.c =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/cfield.c,v retrieving revision 1.81 retrieving revision 1.82 diff -C2 -d -r1.81 -r1.82 *** cfield.c 23 Mar 2005 20:25:50 -0000 1.81 --- cfield.c 24 Mar 2005 09:52:46 -0000 1.82 *************** *** 8,11 **** --- 8,13 ---- #endif + #define EXPERIMENTAL + /******************************************************************/ /* *************** *** 40,44 **** { PyObject *result; - PyObject *arg; PyObject *func = PyObject_GetAttrString(fieldtype, "__from_field__"); if (func == NULL) --- 42,45 ---- *************** *** 229,242 **** } static int ! CField_set(CFieldObject *self, PyObject *inst, PyObject *value) { ! CDataObject *dst; ! char *ptr; ! assert(CDataObject_Check(inst)); ! dst = (CDataObject *)inst; ! ptr = dst->b_ptr + self->offset; ! return CData_set(inst, self->fieldtype, self->setfunc, value, ! self->index, self->size, ptr); } --- 230,315 ---- } + static PyObject * + _CField_set(CDataObject *dst, PyObject *type, PyObject *value, + int size, char *ptr) + { + /* inlined code from _CData_set() */ + if (CDataObject_Check(value)) { + CDataObject *src = (CDataObject *)value; + + /* same type */ + if (PyObject_IsInstance(value, type)) { + memmove(ptr, + src->b_ptr, + size); + value = GetKeepedObjects(src); + Py_INCREF(value); + return value; + } + + /* field type: X* + value type: X[] + */ + if (PointerTypeObject_Check(type) + && ArrayObject_Check(value) + && PyObject_stgdict(value)->proto == PyType_stgdict(type)->proto) { + *(void **)ptr = src->b_ptr; + /* We need to keep the array alive, not just the arrays b_objects. */ + Py_INCREF(value); + return value; + } + } else { + /* Not a CDataObject instance */ + StgDictObject *dict = PyType_stgdict(type); + + /* This could be avoided if setfucn were set in the + CFieldObject constructor. + */ + if (dict && dict->setfunc) + return dict->setfunc(ptr, value, size); + + if (PyTuple_Check(value)) { + /* If value is a tuple, we call the type with the tuple + and use the result */ + PyObject *ob; + PyObject *result; + ob = PyObject_CallObject(type, value); + if (ob == NULL) { + Extend_Error_Info(PyExc_RuntimeError, "(%s) ", + ((PyTypeObject *)type)->tp_name); + return NULL; + } + result = _CField_set(dst, type, ob, size, ptr); + Py_DECREF(ob); + return result; + } + + if (value == Py_None && PointerTypeObject_Check(type)) { + *(void **)ptr = NULL; + Py_INCREF(Py_None); + return Py_None; + } + } + PyErr_Format(PyExc_TypeError, + "Incompatible types %s instance instead of %s instance", + value->ob_type->tp_name, + ((PyTypeObject *)type)->tp_name); + return NULL; + } + static int ! CField_set(CFieldObject *self, CDataObject *dst, PyObject *value) { ! char *ptr = dst->b_ptr + self->offset; ! PyObject *result; ! ! if (self->setfunc) ! result = self->setfunc(ptr, value, self->size); ! else ! result = _CField_set(dst, self->fieldtype, value, ! self->size, ptr); ! if (result == NULL) ! return -1; ! return KeepRef(dst, self->index, result); } *************** *** 248,252 **** return (PyObject *)self; } - return self->getfunc(src->b_ptr + self->offset, self->size, self->fieldtype, src, --- 321,324 ---- |