Index: third_party/cython/src/Cython/Includes/cpython/mem.pxd |
diff --git a/third_party/cython/src/Cython/Includes/cpython/mem.pxd b/third_party/cython/src/Cython/Includes/cpython/mem.pxd |
new file mode 100644 |
index 0000000000000000000000000000000000000000..3b3ab5be16d778dd4109ae054139f88559fb7081 |
--- /dev/null |
+++ b/third_party/cython/src/Cython/Includes/cpython/mem.pxd |
@@ -0,0 +1,75 @@ |
+cdef extern from "Python.h": |
+ |
+ ##################################################################### |
+ # 9.2 Memory Interface |
+ ##################################################################### |
+ # You are definitely *supposed* to use these: "In most situations, |
+ # however, it is recommended to allocate memory from the Python |
+ # heap specifically because the latter is under control of the |
+ # Python memory manager. For example, this is required when the |
+ # interpreter is extended with new object types written in |
+ # C. Another reason for using the Python heap is the desire to |
+ # inform the Python memory manager about the memory needs of the |
+ # extension module. Even when the requested memory is used |
+ # exclusively for internal, highly-specific purposes, delegating |
+ # all memory requests to the Python memory manager causes the |
+ # interpreter to have a more accurate image of its memory |
+ # footprint as a whole. Consequently, under certain circumstances, |
+ # the Python memory manager may or may not trigger appropriate |
+ # actions, like garbage collection, memory compaction or other |
+ # preventive procedures. Note that by using the C library |
+ # allocator as shown in the previous example, the allocated memory |
+ # for the I/O buffer escapes completely the Python memory |
+ # manager." |
+ |
+ # The following function sets, modeled after the ANSI C standard, |
+ # but specifying behavior when requesting zero bytes, are |
+ # available for allocating and releasing memory from the Python |
+ # heap: |
+ |
+ void* PyMem_Malloc(size_t n) |
+ # Allocates n bytes and returns a pointer of type void* to the |
+ # allocated memory, or NULL if the request fails. Requesting zero |
+ # bytes returns a distinct non-NULL pointer if possible, as if |
+ # PyMem_Malloc(1) had been called instead. The memory will not |
+ # have been initialized in any way. |
+ |
+ void* PyMem_Realloc(void *p, size_t n) |
+ # Resizes the memory block pointed to by p to n bytes. The |
+ # contents will be unchanged to the minimum of the old and the new |
+ # sizes. If p is NULL, the call is equivalent to PyMem_Malloc(n); |
+ # else if n is equal to zero, the memory block is resized but is |
+ # not freed, and the returned pointer is non-NULL. Unless p is |
+ # NULL, it must have been returned by a previous call to |
+ # PyMem_Malloc() or PyMem_Realloc(). |
+ |
+ void PyMem_Free(void *p) |
+ # Frees the memory block pointed to by p, which must have been |
+ # returned by a previous call to PyMem_Malloc() or |
+ # PyMem_Realloc(). Otherwise, or if PyMem_Free(p) has been called |
+ # before, undefined behavior occurs. If p is NULL, no operation is |
+ # performed. |
+ |
+ # The following type-oriented macros are provided for |
+ # convenience. Note that TYPE refers to any C type. |
+ |
+ # TYPE* PyMem_New(TYPE, size_t n) |
+ # Same as PyMem_Malloc(), but allocates (n * sizeof(TYPE)) bytes |
+ # of memory. Returns a pointer cast to TYPE*. The memory will not |
+ # have been initialized in any way. |
+ |
+ # TYPE* PyMem_Resize(void *p, TYPE, size_t n) |
+ # Same as PyMem_Realloc(), but the memory block is resized to (n * |
+ # sizeof(TYPE)) bytes. Returns a pointer cast to TYPE*. |
+ |
+ void PyMem_Del(void *p) |
+ # Same as PyMem_Free(). |
+ |
+ # In addition, the following macro sets are provided for calling |
+ # the Python memory allocator directly, without involving the C |
+ # API functions listed above. However, note that their use does |
+ # not preserve binary compatibility across Python versions and is |
+ # therefore deprecated in extension modules. |
+ |
+ # PyMem_MALLOC(), PyMem_REALLOC(), PyMem_FREE(). |
+ # PyMem_NEW(), PyMem_RESIZE(), PyMem_DEL(). |