From: Tim Peters Date: Mon, 22 Apr 2002 02:33:27 +0000 (+0000) Subject: Moving pymalloc along. X-Git-Tag: v2.3c1~5845 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=51e7f5cabaef2ed6e36412ce933061cfc89a766d;p=python 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. --- diff --git a/Include/pgenheaders.h b/Include/pgenheaders.h index 051173cc5e..fecfcc1db5 100644 --- a/Include/pgenheaders.h +++ b/Include/pgenheaders.h @@ -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 -#include - -#ifdef HAVE_STDLIB_H -#include -#endif - -#include "pymem.h" - -#include "pydebug.h" +#include "Python.h" DL_IMPORT(void) PySys_WriteStdout(const char *format, ...) __attribute__((format(printf, 1, 2))); diff --git a/Include/pymem.h b/Include/pymem.h index 3b9c0e2988..2330366f48 100644 --- a/Include/pymem.h +++ b/Include/pymem.h @@ -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 } diff --git a/Python/compile.c b/Python/compile.c index 4340522fd8..373363fb68 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -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);