Merged revisions 55896 via svnmerge from

svn+ssh://pythondev@svn.python.org/python/trunk/Modules/_ctypes

........
  r55896 | thomas.heller | 2007-06-11 17:58:33 +0200 (Mo, 11 Jun 2007) | 3 lines

  Use "O&" in calls to PyArg_Parse when we need a 'void*' instead of "k"
  or "K" codes.
........
This commit is contained in:
Thomas Heller 2007-06-15 17:10:41 +00:00
parent d3d80f3cd1
commit 59fc24403d
2 changed files with 17 additions and 13 deletions

View File

@ -1029,6 +1029,15 @@ PyObject *_CallProc(PPROC pProc,
return retval; return retval;
} }
static int
_parse_voidp(PyObject *obj, void **address)
{
*address = PyLong_AsVoidPtr(obj);
if (*address == NULL)
return 0;
return 1;
}
#ifdef MS_WIN32 #ifdef MS_WIN32
#ifdef _UNICODE #ifdef _UNICODE
@ -1112,7 +1121,7 @@ Free the handle of an executable previously loaded by LoadLibrary.\n";
static PyObject *free_library(PyObject *self, PyObject *args) static PyObject *free_library(PyObject *self, PyObject *args)
{ {
void *hMod; void *hMod;
if (!PyArg_ParseTuple(args, PY_VOID_P_CODE ":FreeLibrary", &hMod)) if (!PyArg_ParseTuple(args, "O&:FreeLibrary", &_parse_voidp, &hMod))
return NULL; return NULL;
if (!FreeLibrary((HMODULE)hMod)) if (!FreeLibrary((HMODULE)hMod))
return PyErr_SetFromWindowsErr(GetLastError()); return PyErr_SetFromWindowsErr(GetLastError());
@ -1235,7 +1244,7 @@ static PyObject *py_dl_close(PyObject *self, PyObject *args)
{ {
void *handle; void *handle;
if (!PyArg_ParseTuple(args, PY_VOID_P_CODE ":dlclose", &handle)) if (!PyArg_ParseTuple(args, "O&:dlclose", &_parse_voidp, &handle))
return NULL; return NULL;
if (dlclose(handle)) { if (dlclose(handle)) {
PyErr_SetString(PyExc_OSError, PyErr_SetString(PyExc_OSError,
@ -1252,7 +1261,8 @@ static PyObject *py_dl_sym(PyObject *self, PyObject *args)
void *handle; void *handle;
void *ptr; void *ptr;
if (!PyArg_ParseTuple(args, PY_VOID_P_CODE "s:dlsym", &handle, &name)) if (!PyArg_ParseTuple(args, "O&s:dlsym",
&_parse_voidp, &handle, &name))
return NULL; return NULL;
ptr = ctypes_dlsym(handle, name); ptr = ctypes_dlsym(handle, name);
if (!ptr) { if (!ptr) {
@ -1277,8 +1287,8 @@ call_function(PyObject *self, PyObject *args)
PyObject *result; PyObject *result;
if (!PyArg_ParseTuple(args, if (!PyArg_ParseTuple(args,
PY_VOID_P_CODE "O!", "O&O!",
&func, &_parse_voidp, &func,
&PyTuple_Type, &arguments)) &PyTuple_Type, &arguments))
return NULL; return NULL;
@ -1308,8 +1318,8 @@ call_cdeclfunction(PyObject *self, PyObject *args)
PyObject *result; PyObject *result;
if (!PyArg_ParseTuple(args, if (!PyArg_ParseTuple(args,
PY_VOID_P_CODE "O!", "O&O!",
&func, &_parse_voidp, &func,
&PyTuple_Type, &arguments)) &PyTuple_Type, &arguments))
return NULL; return NULL;

View File

@ -23,12 +23,6 @@ typedef int Py_ssize_t;
#define PY_LONG_LONG LONG_LONG #define PY_LONG_LONG LONG_LONG
#endif #endif
#if SIZEOF_VOID_P == SIZEOF_LONG
#define PY_VOID_P_CODE "k"
#elif defined(HAVE_LONG_LONG) && (SIZEOF_VOID_P == SIZEOF_LONG_LONG)
#define PY_VOID_P_CODE "K"
#endif
typedef struct tagPyCArgObject PyCArgObject; typedef struct tagPyCArgObject PyCArgObject;
typedef struct tagCDataObject CDataObject; typedef struct tagCDataObject CDataObject;
typedef PyObject *(* GETFUNC)(void *, unsigned size); typedef PyObject *(* GETFUNC)(void *, unsigned size);