Download Microsoft C/C++ compiler for use with Python 2.6/2.7 ASAP

sturlamolden sturlamolden at yahoo.no
Wed Jul 7 15:32:11 EDT 2010


On 7 Jul, 21:12, sturlamolden <sturlamol... at yahoo.no> wrote:

> > #define PyMem_MALLOC(n)         (((n) < 0 || (n) > PY_SSIZE_T_MAX) ? NULL \
> >                                 : malloc((n) ? (n) : 1))
>
> I was afraid of that :(

Also observe that this macro is very badly written (even illegal) C.
Consider what this would do:

    PyMem_MALLOC(n++)

According to Linus Thorvalds using macros like this is not even legal
C:

http://www.linuxfocus.org/common/src/January2004_linus.html

This would be ok, and safe as long as we use the GIL:

register Py_ssize_t __pymem_malloc_tmp;
#define PyMem_MALLOC(n)\
     (__pymem_malloc_tmp = n, (((__pymem_malloc_tmp) < 0 ||
(__pymem_malloc_tmp) > PY_SSIZE_T_MAX) ? NULL \
                                 : malloc((__pymem_malloc_tmp) ?
(__pymem_malloc_tmp) : 1)))


An inline function is a better solution, but not ANSI C standard:

inline void *PyMem_MALLOC(Py_ssize_t n)
{
  return (((n) < 0 || (n) > PY_SSIZE_T_MAX) ? NULL
       : malloc((n) ? (n) : 1));
}









More information about the Python-list mailing list