3#ifndef __NUITKA_FREELISTS_H__
4#define __NUITKA_FREELISTS_H__
10#ifdef _NUITKA_EXPERIMENTAL_DISABLE_FREELIST_ALL
11static const bool use_freelists =
false;
13static const bool use_freelists =
true;
16#define allocateFromFreeList(free_list, object_type, type_type, size) \
17 if (free_list != NULL) { \
19 free_list = *((object_type **)free_list); \
20 free_list##_count -= 1; \
21 assert(free_list##_count >= 0); \
23 if (Py_SIZE(result) < size) { \
24 result = PyObject_GC_Resize(object_type, result, size); \
25 assert(result != NULL); \
28 Nuitka_Py_NewReference((PyObject *)result); \
30 result = (object_type *)Nuitka_GC_NewVar(&type_type, size); \
34#define allocateFromFreeListFixed(free_list, object_type, type_type) \
35 if (free_list != NULL) { \
37 free_list = *((object_type **)free_list); \
38 free_list##_count -= 1; \
39 assert(free_list##_count >= 0); \
41 Nuitka_Py_NewReference((PyObject *)result); \
43 result = (object_type *)Nuitka_GC_New(&type_type); \
47#define releaseToFreeList(free_list, object, max_free_list_count) \
48 if (free_list != NULL || max_free_list_count == 0 || use_freelists == false) { \
49 if (free_list##_count >= max_free_list_count) { \
50 PyObject_GC_Del(object); \
52 *((void **)object) = (void *)free_list; \
55 free_list##_count += 1; \
59 *((void **)object) = NULL; \
61 assert(free_list##_count == 0); \
63 free_list##_count += 1; \
66#if PYTHON_VERSION >= 0x3d0
67NUITKA_MAY_BE_UNUSED
static inline struct _Py_object_freelists *_Nuitka_object_freelists_GET(PyThreadState *tstate) {
70 return &((_PyThreadStateImpl *)tstate)->freelists;
72 return &tstate->interp->object_state.freelists;