[ctypes-commit] ctypes/source callproc.c,1.83,1.84
Brought to you by:
theller
From: Thomas H. <th...@us...> - 2004-06-11 19:18:43
|
Update of /cvsroot/ctypes/ctypes/source In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv924 Modified Files: callproc.c Log Message: We need to keep a reference to the original object in ConvParam in some cases. Fix pass-struct-by-value Index: callproc.c =================================================================== RCS file: /cvsroot/ctypes/ctypes/source/callproc.c,v retrieving revision 1.83 retrieving revision 1.84 diff -C2 -d -r1.83 -r1.84 *** callproc.c 11 Jun 2004 18:44:50 -0000 1.83 --- callproc.c 11 Jun 2004 19:18:30 -0000 1.84 *************** *** 435,438 **** --- 435,439 ---- struct argument { ffi_type *ffi_type; + PyObject *keep; union { char c; *************** *** 458,462 **** PyCArgObject *carg = (PyCArgObject *)obj; pa->ffi_type = carg->pffi_type; - /* XXX What about structures by value? */ memcpy(&pa->value, &carg->value, sizeof(pa->value)); return 0; --- 459,462 ---- *************** *** 521,527 **** PyCArgObject *carg = (PyCArgObject *)arg; pa->ffi_type = carg->pffi_type; - /* XXX What about structures by value? */ memcpy(&pa->value, &carg->value, sizeof(pa->value)); ! Py_DECREF(arg); /* XXX */ return 0; } --- 521,526 ---- PyCArgObject *carg = (PyCArgObject *)arg; pa->ffi_type = carg->pffi_type; memcpy(&pa->value, &carg->value, sizeof(pa->value)); ! pa->keep = arg; return 0; } *************** *** 529,533 **** pa->ffi_type = &ffi_type_sint; pa->value.l = PyInt_AS_LONG(arg); ! Py_DECREF(arg); return 0; } --- 528,532 ---- pa->ffi_type = &ffi_type_sint; pa->value.l = PyInt_AS_LONG(arg); ! pa->keep = arg; return 0; } *************** *** 847,852 **** atypes = (ffi_type **)alloca(sizeof(ffi_type *) * argcount); for (i = 0; i < argcount; ++i) { - avalues[i] = (void *)&args[i].value; atypes[i] = args[i].ffi_type; } --- 846,854 ---- atypes = (ffi_type **)alloca(sizeof(ffi_type *) * argcount); for (i = 0; i < argcount; ++i) { atypes[i] = args[i].ffi_type; + if (atypes[i]->type == FFI_TYPE_STRUCT) + avalues[i] = (void *)args[i].value.p; + else + avalues[i] = (void *)&args[i].value; } *************** *** 864,867 **** --- 866,871 ---- retval = GetResult(restype, &result); cleanup: + for (i = 0; i < argcount; ++i) + Py_XDECREF(args[i].keep); return retval; } |