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 ----
|