summaryrefslogtreecommitdiffstats
path: root/Objects/obmalloc.c
diff options
context:
space:
mode:
Diffstat (limited to 'Objects/obmalloc.c')
-rw-r--r--Objects/obmalloc.c50
1 files changed, 28 insertions, 22 deletions
diff --git a/Objects/obmalloc.c b/Objects/obmalloc.c
index 3e9465f..87b3337 100644
--- a/Objects/obmalloc.c
+++ b/Objects/obmalloc.c
@@ -627,6 +627,7 @@ _PyMalloc_Realloc(void *p, size_t nbytes)
/*==========================================================================*/
/* pymalloc not enabled: Redirect the entry points to the PyMem family. */
+
void *
_PyMalloc_Malloc(size_t n)
{
@@ -646,6 +647,11 @@ _PyMalloc_Free(void *p)
}
#endif /* WITH_PYMALLOC */
+/*==========================================================================*/
+/* Regardless of whether pymalloc is enabled, export entry points for
+ * the object-oriented pymalloc functions.
+ */
+
PyObject *
_PyMalloc_New(PyTypeObject *tp)
{
@@ -675,7 +681,9 @@ _PyMalloc_Del(PyObject *op)
#ifdef PYMALLOC_DEBUG
/*==========================================================================*/
-/* A x-platform debugging allocator. */
+/* A x-platform debugging allocator. This doesn't manage memory directly,
+ * it wraps a real allocator, adding extra debugging info to the memory blocks.
+ */
#define PYMALLOC_CLEANBYTE 0xCB /* uninitialized memory */
#define PYMALLOC_DEADBYTE 0xDB /* free()ed memory */
@@ -687,7 +695,7 @@ static ulong serialno = 0; /* incremented on each debug {m,re}alloc */
static ulong
read4(const void *p)
{
- const unsigned char *q = (unsigned char *)p;
+ const uchar *q = (const uchar *)p;
return ((ulong)q[0] << 24) |
((ulong)q[1] << 16) |
((ulong)q[2] << 8) |
@@ -699,11 +707,11 @@ read4(const void *p)
static void
write4(void *p, ulong n)
{
- unsigned char *q = (unsigned char *)p;
- q[0] = (unsigned char)((n >> 24) & 0xff);
- q[1] = (unsigned char)((n >> 16) & 0xff);
- q[2] = (unsigned char)((n >> 8) & 0xff);
- q[3] = (unsigned char)( n & 0xff);
+ uchar *q = (uchar *)p;
+ q[0] = (uchar)((n >> 24) & 0xff);
+ q[1] = (uchar)((n >> 16) & 0xff);
+ q[2] = (uchar)((n >> 8) & 0xff);
+ q[3] = (uchar)( n & 0xff);
}
static void
@@ -758,7 +766,7 @@ void *
_PyMalloc_DebugMalloc(size_t nbytes, int family)
{
uchar *p; /* base address of malloc'ed block */
- uchar *q; /* p + 8 + nbytes + */
+ uchar *tail; /* p + 8 + nbytes == pointer to tail pad bytes */
size_t total; /* nbytes + 16 */
assert(family == 0);
@@ -785,24 +793,22 @@ _PyMalloc_DebugMalloc(size_t nbytes, int family)
if (nbytes > 0)
memset(p+8, PYMALLOC_CLEANBYTE, nbytes);
- q = p + 8 + nbytes;
- q[0] = q[1] = q[2] = q[3] = PYMALLOC_FORBIDDENBYTE;
- write4(q+4, serialno);
+ tail = p + 8 + nbytes;
+ tail[0] = tail[1] = tail[2] = tail[3] = PYMALLOC_FORBIDDENBYTE;
+ write4(tail + 4, serialno);
return p+8;
}
-/* The debug free first uses the address to find the number of bytes
- originally asked for, then checks the 8 bytes on each end for
- sanity (in particular, that the PYMALLOC_FORBIDDENBYTEs are still
- intact).
+/* The debug free first checks the 8 bytes on each end for sanity (in
+ particular, that the PYMALLOC_FORBIDDENBYTEs are still intact).
Then fills the original bytes with PYMALLOC_DEADBYTE.
Then calls the underlying free.
*/
void
_PyMalloc_DebugFree(void *p, int family)
{
- uchar *q = (uchar*)p;
+ uchar *q = (uchar *)p;
size_t nbytes;
assert(family == 0);
@@ -914,11 +920,11 @@ _PyMalloc_DebugDumpAddress(const void *p)
/* In case this is nuts, check the pad bytes before trying to read up
the serial number (the address deref could blow up). */
- fprintf(stderr, " the 3 pad bytes at p-3 are ");
+ fputs(" the 3 pad bytes at p-3 are ", stderr);
if (*(q-3) == PYMALLOC_FORBIDDENBYTE &&
*(q-2) == PYMALLOC_FORBIDDENBYTE &&
*(q-1) == PYMALLOC_FORBIDDENBYTE) {
- fprintf(stderr, "PYMALLOC_FORBIDDENBYTE, as expected\n");
+ fputs("PYMALLOC_FORBIDDENBYTE, as expected\n", stderr);
}
else {
int i;
@@ -939,7 +945,7 @@ _PyMalloc_DebugDumpAddress(const void *p)
tail[1] == PYMALLOC_FORBIDDENBYTE &&
tail[2] == PYMALLOC_FORBIDDENBYTE &&
tail[3] == PYMALLOC_FORBIDDENBYTE) {
- fprintf(stderr, "PYMALLOC_FORBIDDENBYTE, as expected\n");
+ fputs("PYMALLOC_FORBIDDENBYTE, as expected\n", stderr);
}
else {
int i;
@@ -961,7 +967,7 @@ _PyMalloc_DebugDumpAddress(const void *p)
if (nbytes > 0) {
int i = 0;
- fprintf(stderr, " data at p:");
+ fputs(" data at p:", stderr);
/* print up to 8 bytes at the start */
while (q < tail && i < 8) {
fprintf(stderr, " %02x", *q);
@@ -971,7 +977,7 @@ _PyMalloc_DebugDumpAddress(const void *p)
/* and up to 8 at the end */
if (q < tail) {
if (tail - q > 8) {
- fprintf(stderr, " ...");
+ fputs(" ...", stderr);
q = tail - 8;
}
while (q < tail) {
@@ -979,7 +985,7 @@ _PyMalloc_DebugDumpAddress(const void *p)
++q;
}
}
- fprintf(stderr, "\n");
+ fputc('\n', stderr);
}
}