Moving pymalloc along.
+ Redirect PyMem_{Del, DEL} to the object allocator's free() when pymalloc is enabled. Needed so old extensions can continue to mix PyObject_New with PyMem_DEL. + This implies that pgen needs to be able to see the PyObject_XYZ declarations too. pgenheaders.h now includes Python.h. An implication is that I expect obmalloc.o needs to get linked into pgen on non-Windows boxes. + When PYMALLOC_DEBUG is defined, *all* Py memory API functions now funnel through the debug allocator wrapper around pymalloc. This is the default in a debug build. + That caused compile.c to fail: it indirectly mixed PyMem_Malloc with raw platform free() in one place. This is verbotten.
This commit is contained in:
parent
a2bc259dd7
commit
51e7f5caba
|
@ -7,23 +7,7 @@ extern "C" {
|
|||
|
||||
/* Include files and extern declarations used by most of the parser. */
|
||||
|
||||
#include "pyconfig.h"
|
||||
|
||||
/* pyconfig.h may or may not define DL_IMPORT */
|
||||
#ifndef DL_IMPORT /* declarations for DLL import/export */
|
||||
#define DL_IMPORT(RTYPE) RTYPE
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#ifdef HAVE_STDLIB_H
|
||||
#include <stdlib.h>
|
||||
#endif
|
||||
|
||||
#include "pymem.h"
|
||||
|
||||
#include "pydebug.h"
|
||||
#include "Python.h"
|
||||
|
||||
DL_IMPORT(void) PySys_WriteStdout(const char *format, ...)
|
||||
__attribute__((format(printf, 1, 2)));
|
||||
|
|
|
@ -52,13 +52,19 @@ extern DL_IMPORT(void) PyMem_Free(void *);
|
|||
no longer supported. They used to call PyErr_NoMemory() on failure. */
|
||||
|
||||
/* Macros. */
|
||||
#ifndef PyMem_MALLOC
|
||||
#ifdef PYMALLOC_DEBUG
|
||||
/* Redirect all memory operations to Python's debugging allocator. */
|
||||
#define PyMem_MALLOC PyObject_MALLOC
|
||||
#define PyMem_REALLOC PyObject_REALLOC
|
||||
#define PyMem_FREE PyObject_FREE
|
||||
|
||||
#else /* ! PYMALLOC_DEBUG */
|
||||
|
||||
#ifdef MALLOC_ZERO_RETURNS_NULL
|
||||
#define PyMem_MALLOC(n) malloc((n) ? (n) : 1)
|
||||
#else
|
||||
#define PyMem_MALLOC malloc
|
||||
#endif
|
||||
|
||||
/* Caution: whether MALLOC_ZERO_RETURNS_NULL is #defined has nothing to
|
||||
do with whether platform realloc(non-NULL, 0) normally frees the memory
|
||||
or returns NULL. Rather than introduce yet another config variation,
|
||||
|
@ -66,7 +72,7 @@ extern DL_IMPORT(void) PyMem_Free(void *);
|
|||
#define PyMem_REALLOC(p, n) realloc((p), (n) ? (n) : 1)
|
||||
|
||||
#define PyMem_FREE free
|
||||
#endif /* PyMem_MALLOC */
|
||||
#endif /* PYMALLOC_DEBUG */
|
||||
|
||||
/*
|
||||
* Type-oriented memory interface
|
||||
|
@ -85,12 +91,7 @@ extern DL_IMPORT(void) PyMem_Free(void *);
|
|||
/* In order to avoid breaking old code mixing PyObject_{New, NEW} with
|
||||
PyMem_{Del, DEL} (there was no choice about this in 1.5.2), the latter
|
||||
have to be redirected to the object allocator. */
|
||||
/* XXX The parser module needs rework before this can be enabled. */
|
||||
#if 0
|
||||
#define PyMem_Del PyObject_Free
|
||||
#else
|
||||
#define PyMem_Del PyMem_Free
|
||||
#endif
|
||||
|
||||
/* Macros */
|
||||
#define PyMem_NEW(type, n) \
|
||||
|
@ -98,12 +99,7 @@ extern DL_IMPORT(void) PyMem_Free(void *);
|
|||
#define PyMem_RESIZE(p, type, n) \
|
||||
( (p) = (type *) PyMem_REALLOC((p), (n) * sizeof(type)) )
|
||||
|
||||
/* XXX The parser module needs rework before this can be enabled. */
|
||||
#if 0
|
||||
#define PyMem_DEL PyObject_FREE
|
||||
#else
|
||||
#define PyMem_DEL PyMem_FREE
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
|
@ -1954,7 +1954,7 @@ com_factor(struct compiling *c, node *n)
|
|||
return;
|
||||
}
|
||||
if (childtype == MINUS) {
|
||||
char *s = malloc(strlen(STR(pnum)) + 2);
|
||||
char *s = PyMem_Malloc(strlen(STR(pnum)) + 2);
|
||||
if (s == NULL) {
|
||||
com_error(c, PyExc_MemoryError, "");
|
||||
com_addbyte(c, 255);
|
||||
|
@ -1962,7 +1962,7 @@ com_factor(struct compiling *c, node *n)
|
|||
}
|
||||
s[0] = '-';
|
||||
strcpy(s + 1, STR(pnum));
|
||||
free(STR(pnum));
|
||||
PyMem_Free(STR(pnum));
|
||||
STR(pnum) = s;
|
||||
}
|
||||
com_atom(c, patom);
|
||||
|
|
Loading…
Reference in New Issue