Revert changeset 6661a8154eb3: Issue #3329: Add new APIs to customize memory allocators

The new API require more discussion.
diff --git a/Include/pymem.h b/Include/pymem.h
index 34d9318..10b5bea 100644
--- a/Include/pymem.h
+++ b/Include/pymem.h
@@ -11,40 +11,6 @@
 extern "C" {
 #endif
 
-typedef struct {
-    /* user context passed as the first argument to the 3 functions */
-    void *ctx;
-
-    /* allocate memory */
-    void* (*malloc) (void *ctx, size_t size);
-
-    /* allocate memory or resize a memory buffer */
-    void* (*realloc) (void *ctx, void *ptr, size_t new_size);
-
-    /* release memory */
-    void (*free) (void *ctx, void *ptr);
-} PyMemAllocators;
-
-/* Raw memory allocators, system functions: malloc(), realloc(), free().
-
-   These functions are thread-safe, the GIL does not need to be held. */
-
-/* Get internal functions of PyMem_RawMalloc(), PyMem_RawRealloc() and
-   PyMem_RawFree(). *ctx_p is an arbitrary user value. */
-PyAPI_FUNC(void) PyMem_GetRawAllocators(PyMemAllocators *allocators);
-
-/* Set internal functions of PyMem_RawMalloc(), PyMem_RawRealloc() and
-   PyMem_RawFree(). ctx is an arbitrary user value.
-
-   PyMem_SetupDebugHooks() should be called to reinstall debug hooks if new
-   functions do no call original functions anymore. */
-PyAPI_FUNC(void) PyMem_SetRawAllocators(PyMemAllocators *allocators);
-
-PyAPI_FUNC(void *) PyMem_RawMalloc(size_t size);
-PyAPI_FUNC(void *) PyMem_RawRealloc(void *ptr, size_t new_size);
-PyAPI_FUNC(void) PyMem_RawFree(void *ptr);
-
-
 /* BEWARE:
 
    Each interface exports both functions and macros.  Extension modules should
@@ -83,11 +49,21 @@
    performed on failure (no exception is set, no warning is printed, etc).
 */
 
-PyAPI_FUNC(void *) PyMem_Malloc(size_t size);
-PyAPI_FUNC(void *) PyMem_Realloc(void *ptr, size_t new_size);
-PyAPI_FUNC(void) PyMem_Free(void *ptr);
+PyAPI_FUNC(void *) PyMem_Malloc(size_t);
+PyAPI_FUNC(void *) PyMem_Realloc(void *, size_t);
+PyAPI_FUNC(void) PyMem_Free(void *);
+
+/* Starting from Python 1.6, the wrappers Py_{Malloc,Realloc,Free} are
+   no longer supported. They used to call PyErr_NoMemory() on failure. */
 
 /* Macros. */
+#ifdef PYMALLOC_DEBUG
+/* Redirect all memory operations to Python's debugging allocator. */
+#define PyMem_MALLOC		_PyMem_DebugMalloc
+#define PyMem_REALLOC		_PyMem_DebugRealloc
+#define PyMem_FREE		_PyMem_DebugFree
+
+#else	/* ! PYMALLOC_DEBUG */
 
 /* PyMem_MALLOC(0) means malloc(1). Some systems would return NULL
    for malloc(0), which would be treated as an error. Some platforms
@@ -95,9 +71,13 @@
    pymalloc. To solve these problems, allocate an extra byte. */
 /* Returns NULL to indicate error if a negative size or size larger than
    Py_ssize_t can represent is supplied.  Helps prevents security holes. */
-#define PyMem_MALLOC(n)         PyMem_Malloc(n)
-#define PyMem_REALLOC(p, n)     PyMem_Realloc(p, n)
-#define PyMem_FREE(p)           PyMem_Free(p)
+#define PyMem_MALLOC(n)		((size_t)(n) > (size_t)PY_SSIZE_T_MAX ? NULL \
+				: malloc((n) ? (n) : 1))
+#define PyMem_REALLOC(p, n)	((size_t)(n) > (size_t)PY_SSIZE_T_MAX  ? NULL \
+				: realloc((p), (n) ? (n) : 1))
+#define PyMem_FREE		free
+
+#endif	/* PYMALLOC_DEBUG */
 
 /*
  * Type-oriented memory interface
@@ -135,37 +115,6 @@
 #define PyMem_Del		PyMem_Free
 #define PyMem_DEL		PyMem_FREE
 
-/* Get internal functions of PyMem_Malloc(), PyMem_Realloc()
-   and PyMem_Free() */
-PyAPI_FUNC(void) PyMem_GetAllocators(PyMemAllocators *allocators);
-
-/* Set internal functions of PyMem_Malloc(), PyMem_Realloc() and PyMem_Free().
-
-   malloc(ctx, 0) and realloc(ctx, ptr, 0) must not return NULL: it would be
-   treated as an error.
-
-   PyMem_SetupDebugHooks() should be called to reinstall debug hooks if new
-   functions do no call original functions anymore. */
-PyAPI_FUNC(void) PyMem_SetAllocators(PyMemAllocators *allocators);
-
-/* Setup hooks to detect bugs in the following Python memory allocator
-   functions:
-
-   - PyMem_RawMalloc(), PyMem_RawRealloc(), PyMem_RawFree()
-   - PyMem_Malloc(), PyMem_Realloc(), PyMem_Free()
-   - PyObject_Malloc(), PyObject_Realloc() and PyObject_Free()
-
-   Newly allocated memory is filled with the byte 0xCB, freed memory is filled
-   with the byte 0xDB. Additionnal checks:
-
-   - detect API violations, ex: PyObject_Free() called on a buffer allocated
-     by PyMem_Malloc()
-   - detect write before the start of the buffer (buffer underflow)
-   - detect write after the end of the buffer (buffer overflow)
-
-   The function does nothing if Python is not compiled is debug mode. */
-PyAPI_FUNC(void) PyMem_SetupDebugHooks(void);
-
 #ifdef __cplusplus
 }
 #endif