mirror of
https://github.com/python/cpython.git
synced 2025-07-24 11:44:31 +00:00
Patches from Greg Stein to support 'P' format in struct module's
native format, as void* (translated to Python int or long). Also adds PyLong_FromVoidPtr and PyLong_AsVoidPtr to longobject.c.
This commit is contained in:
parent
43b655c0ab
commit
78694d970f
5 changed files with 96 additions and 0 deletions
|
@ -277,6 +277,61 @@ PyLong_AsDouble(vv)
|
|||
return x * sign;
|
||||
}
|
||||
|
||||
/* Create a new long (or int) object from a C pointer */
|
||||
|
||||
PyObject *
|
||||
PyLong_FromVoidPtr(p)
|
||||
void *p;
|
||||
{
|
||||
#if SIZEOF_VOID_P == SIZEOF_LONG
|
||||
return PyInt_FromLong((long)p);
|
||||
#else
|
||||
/* optimize null pointers */
|
||||
if ( p == NULL )
|
||||
return PyInt_FromLong(0);
|
||||
|
||||
/* we can assume that HAVE_LONG_LONG is true. if not, then the
|
||||
configuration process should have bailed (having big pointers
|
||||
without long longs seems non-sensical) */
|
||||
return PyLong_FromLongLong((LONG_LONG)p);
|
||||
#endif /* SIZEOF_VOID_P == SIZEOF_LONG */
|
||||
}
|
||||
|
||||
/* Get a C pointer from a long object (or an int object in some cases) */
|
||||
|
||||
void *
|
||||
PyLong_AsVoidPtr(vv)
|
||||
PyObject *vv;
|
||||
{
|
||||
/* This function will allow int or long objects. If vv is neither,
|
||||
then the PyLong_AsLong*() functions will raise the exception:
|
||||
PyExc_SystemError, "bad argument to internal function"
|
||||
*/
|
||||
|
||||
#if SIZEOF_VOID_P == SIZEOF_LONG
|
||||
long x;
|
||||
|
||||
if ( PyInt_Check(vv) )
|
||||
x = PyInt_AS_LONG(vv);
|
||||
else
|
||||
x = PyLong_AsLong(vv);
|
||||
#else
|
||||
/* we can assume that HAVE_LONG_LONG is true. if not, then the
|
||||
configuration process should have bailed (having big pointers
|
||||
without long longs seems non-sensical) */
|
||||
LONG_LONG x;
|
||||
|
||||
if ( PyInt_Check(vv) )
|
||||
x = PyInt_AS_LONG(vv);
|
||||
else
|
||||
x = PyLong_AsLongLong(vv);
|
||||
#endif /* SIZEOF_VOID_P == SIZEOF_LONG */
|
||||
|
||||
if (x == -1 && PyErr_Occurred())
|
||||
return NULL;
|
||||
return (void *)x;
|
||||
}
|
||||
|
||||
#ifdef HAVE_LONG_LONG
|
||||
/*
|
||||
* LONG_LONG support by Chris Herborth (chrish@qnx.com)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue