Coverage Report

Created: 2025-07-11 06:59

/src/Python-3.8.3/Modules/clinic/gcmodule.c.h
Line
Count
Source (jump to first uncovered line)
1
/*[clinic input]
2
preserve
3
[clinic start generated code]*/
4
5
PyDoc_STRVAR(gc_enable__doc__,
6
"enable($module, /)\n"
7
"--\n"
8
"\n"
9
"Enable automatic garbage collection.");
10
11
#define GC_ENABLE_METHODDEF    \
12
    {"enable", (PyCFunction)gc_enable, METH_NOARGS, gc_enable__doc__},
13
14
static PyObject *
15
gc_enable_impl(PyObject *module);
16
17
static PyObject *
18
gc_enable(PyObject *module, PyObject *Py_UNUSED(ignored))
19
0
{
20
0
    return gc_enable_impl(module);
21
0
}
22
23
PyDoc_STRVAR(gc_disable__doc__,
24
"disable($module, /)\n"
25
"--\n"
26
"\n"
27
"Disable automatic garbage collection.");
28
29
#define GC_DISABLE_METHODDEF    \
30
    {"disable", (PyCFunction)gc_disable, METH_NOARGS, gc_disable__doc__},
31
32
static PyObject *
33
gc_disable_impl(PyObject *module);
34
35
static PyObject *
36
gc_disable(PyObject *module, PyObject *Py_UNUSED(ignored))
37
0
{
38
0
    return gc_disable_impl(module);
39
0
}
40
41
PyDoc_STRVAR(gc_isenabled__doc__,
42
"isenabled($module, /)\n"
43
"--\n"
44
"\n"
45
"Returns true if automatic garbage collection is enabled.");
46
47
#define GC_ISENABLED_METHODDEF    \
48
    {"isenabled", (PyCFunction)gc_isenabled, METH_NOARGS, gc_isenabled__doc__},
49
50
static int
51
gc_isenabled_impl(PyObject *module);
52
53
static PyObject *
54
gc_isenabled(PyObject *module, PyObject *Py_UNUSED(ignored))
55
0
{
56
0
    PyObject *return_value = NULL;
57
0
    int _return_value;
58
59
0
    _return_value = gc_isenabled_impl(module);
60
0
    if ((_return_value == -1) && PyErr_Occurred()) {
61
0
        goto exit;
62
0
    }
63
0
    return_value = PyBool_FromLong((long)_return_value);
64
65
0
exit:
66
0
    return return_value;
67
0
}
68
69
PyDoc_STRVAR(gc_collect__doc__,
70
"collect($module, /, generation=2)\n"
71
"--\n"
72
"\n"
73
"Run the garbage collector.\n"
74
"\n"
75
"With no arguments, run a full collection.  The optional argument\n"
76
"may be an integer specifying which generation to collect.  A ValueError\n"
77
"is raised if the generation number is invalid.\n"
78
"\n"
79
"The number of unreachable objects is returned.");
80
81
#define GC_COLLECT_METHODDEF    \
82
    {"collect", (PyCFunction)(void(*)(void))gc_collect, METH_FASTCALL|METH_KEYWORDS, gc_collect__doc__},
83
84
static Py_ssize_t
85
gc_collect_impl(PyObject *module, int generation);
86
87
static PyObject *
88
gc_collect(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
89
0
{
90
0
    PyObject *return_value = NULL;
91
0
    static const char * const _keywords[] = {"generation", NULL};
92
0
    static _PyArg_Parser _parser = {NULL, _keywords, "collect", 0};
93
0
    PyObject *argsbuf[1];
94
0
    Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0;
95
0
    int generation = NUM_GENERATIONS - 1;
96
0
    Py_ssize_t _return_value;
97
98
0
    args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf);
99
0
    if (!args) {
100
0
        goto exit;
101
0
    }
102
0
    if (!noptargs) {
103
0
        goto skip_optional_pos;
104
0
    }
105
0
    if (PyFloat_Check(args[0])) {
106
0
        PyErr_SetString(PyExc_TypeError,
107
0
                        "integer argument expected, got float" );
108
0
        goto exit;
109
0
    }
110
0
    generation = _PyLong_AsInt(args[0]);
111
0
    if (generation == -1 && PyErr_Occurred()) {
112
0
        goto exit;
113
0
    }
114
0
skip_optional_pos:
115
0
    _return_value = gc_collect_impl(module, generation);
116
0
    if ((_return_value == -1) && PyErr_Occurred()) {
117
0
        goto exit;
118
0
    }
119
0
    return_value = PyLong_FromSsize_t(_return_value);
120
121
0
exit:
122
0
    return return_value;
123
0
}
124
125
PyDoc_STRVAR(gc_set_debug__doc__,
126
"set_debug($module, flags, /)\n"
127
"--\n"
128
"\n"
129
"Set the garbage collection debugging flags.\n"
130
"\n"
131
"  flags\n"
132
"    An integer that can have the following bits turned on:\n"
133
"      DEBUG_STATS - Print statistics during collection.\n"
134
"      DEBUG_COLLECTABLE - Print collectable objects found.\n"
135
"      DEBUG_UNCOLLECTABLE - Print unreachable but uncollectable objects\n"
136
"        found.\n"
137
"      DEBUG_SAVEALL - Save objects to gc.garbage rather than freeing them.\n"
138
"      DEBUG_LEAK - Debug leaking programs (everything but STATS).\n"
139
"\n"
140
"Debugging information is written to sys.stderr.");
141
142
#define GC_SET_DEBUG_METHODDEF    \
143
    {"set_debug", (PyCFunction)gc_set_debug, METH_O, gc_set_debug__doc__},
144
145
static PyObject *
146
gc_set_debug_impl(PyObject *module, int flags);
147
148
static PyObject *
149
gc_set_debug(PyObject *module, PyObject *arg)
150
0
{
151
0
    PyObject *return_value = NULL;
152
0
    int flags;
153
154
0
    if (PyFloat_Check(arg)) {
155
0
        PyErr_SetString(PyExc_TypeError,
156
0
                        "integer argument expected, got float" );
157
0
        goto exit;
158
0
    }
159
0
    flags = _PyLong_AsInt(arg);
160
0
    if (flags == -1 && PyErr_Occurred()) {
161
0
        goto exit;
162
0
    }
163
0
    return_value = gc_set_debug_impl(module, flags);
164
165
0
exit:
166
0
    return return_value;
167
0
}
168
169
PyDoc_STRVAR(gc_get_debug__doc__,
170
"get_debug($module, /)\n"
171
"--\n"
172
"\n"
173
"Get the garbage collection debugging flags.");
174
175
#define GC_GET_DEBUG_METHODDEF    \
176
    {"get_debug", (PyCFunction)gc_get_debug, METH_NOARGS, gc_get_debug__doc__},
177
178
static int
179
gc_get_debug_impl(PyObject *module);
180
181
static PyObject *
182
gc_get_debug(PyObject *module, PyObject *Py_UNUSED(ignored))
183
0
{
184
0
    PyObject *return_value = NULL;
185
0
    int _return_value;
186
187
0
    _return_value = gc_get_debug_impl(module);
188
0
    if ((_return_value == -1) && PyErr_Occurred()) {
189
0
        goto exit;
190
0
    }
191
0
    return_value = PyLong_FromLong((long)_return_value);
192
193
0
exit:
194
0
    return return_value;
195
0
}
196
197
PyDoc_STRVAR(gc_get_threshold__doc__,
198
"get_threshold($module, /)\n"
199
"--\n"
200
"\n"
201
"Return the current collection thresholds.");
202
203
#define GC_GET_THRESHOLD_METHODDEF    \
204
    {"get_threshold", (PyCFunction)gc_get_threshold, METH_NOARGS, gc_get_threshold__doc__},
205
206
static PyObject *
207
gc_get_threshold_impl(PyObject *module);
208
209
static PyObject *
210
gc_get_threshold(PyObject *module, PyObject *Py_UNUSED(ignored))
211
0
{
212
0
    return gc_get_threshold_impl(module);
213
0
}
214
215
PyDoc_STRVAR(gc_get_count__doc__,
216
"get_count($module, /)\n"
217
"--\n"
218
"\n"
219
"Return a three-tuple of the current collection counts.");
220
221
#define GC_GET_COUNT_METHODDEF    \
222
    {"get_count", (PyCFunction)gc_get_count, METH_NOARGS, gc_get_count__doc__},
223
224
static PyObject *
225
gc_get_count_impl(PyObject *module);
226
227
static PyObject *
228
gc_get_count(PyObject *module, PyObject *Py_UNUSED(ignored))
229
0
{
230
0
    return gc_get_count_impl(module);
231
0
}
232
233
PyDoc_STRVAR(gc_get_objects__doc__,
234
"get_objects($module, /, generation=None)\n"
235
"--\n"
236
"\n"
237
"Return a list of objects tracked by the collector (excluding the list returned).\n"
238
"\n"
239
"  generation\n"
240
"    Generation to extract the objects from.\n"
241
"\n"
242
"If generation is not None, return only the objects tracked by the collector\n"
243
"that are in that generation.");
244
245
#define GC_GET_OBJECTS_METHODDEF    \
246
    {"get_objects", (PyCFunction)(void(*)(void))gc_get_objects, METH_FASTCALL|METH_KEYWORDS, gc_get_objects__doc__},
247
248
static PyObject *
249
gc_get_objects_impl(PyObject *module, Py_ssize_t generation);
250
251
static PyObject *
252
gc_get_objects(PyObject *module, PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames)
253
0
{
254
0
    PyObject *return_value = NULL;
255
0
    static const char * const _keywords[] = {"generation", NULL};
256
0
    static _PyArg_Parser _parser = {NULL, _keywords, "get_objects", 0};
257
0
    PyObject *argsbuf[1];
258
0
    Py_ssize_t noptargs = nargs + (kwnames ? PyTuple_GET_SIZE(kwnames) : 0) - 0;
259
0
    Py_ssize_t generation = -1;
260
261
0
    args = _PyArg_UnpackKeywords(args, nargs, NULL, kwnames, &_parser, 0, 1, 0, argsbuf);
262
0
    if (!args) {
263
0
        goto exit;
264
0
    }
265
0
    if (!noptargs) {
266
0
        goto skip_optional_pos;
267
0
    }
268
0
    if (!_Py_convert_optional_to_ssize_t(args[0], &generation)) {
269
0
        goto exit;
270
0
    }
271
0
skip_optional_pos:
272
0
    return_value = gc_get_objects_impl(module, generation);
273
274
0
exit:
275
0
    return return_value;
276
0
}
277
278
PyDoc_STRVAR(gc_get_stats__doc__,
279
"get_stats($module, /)\n"
280
"--\n"
281
"\n"
282
"Return a list of dictionaries containing per-generation statistics.");
283
284
#define GC_GET_STATS_METHODDEF    \
285
    {"get_stats", (PyCFunction)gc_get_stats, METH_NOARGS, gc_get_stats__doc__},
286
287
static PyObject *
288
gc_get_stats_impl(PyObject *module);
289
290
static PyObject *
291
gc_get_stats(PyObject *module, PyObject *Py_UNUSED(ignored))
292
0
{
293
0
    return gc_get_stats_impl(module);
294
0
}
295
296
PyDoc_STRVAR(gc_is_tracked__doc__,
297
"is_tracked($module, obj, /)\n"
298
"--\n"
299
"\n"
300
"Returns true if the object is tracked by the garbage collector.\n"
301
"\n"
302
"Simple atomic objects will return false.");
303
304
#define GC_IS_TRACKED_METHODDEF    \
305
    {"is_tracked", (PyCFunction)gc_is_tracked, METH_O, gc_is_tracked__doc__},
306
307
PyDoc_STRVAR(gc_freeze__doc__,
308
"freeze($module, /)\n"
309
"--\n"
310
"\n"
311
"Freeze all current tracked objects and ignore them for future collections.\n"
312
"\n"
313
"This can be used before a POSIX fork() call to make the gc copy-on-write friendly.\n"
314
"Note: collection before a POSIX fork() call may free pages for future allocation\n"
315
"which can cause copy-on-write.");
316
317
#define GC_FREEZE_METHODDEF    \
318
    {"freeze", (PyCFunction)gc_freeze, METH_NOARGS, gc_freeze__doc__},
319
320
static PyObject *
321
gc_freeze_impl(PyObject *module);
322
323
static PyObject *
324
gc_freeze(PyObject *module, PyObject *Py_UNUSED(ignored))
325
0
{
326
0
    return gc_freeze_impl(module);
327
0
}
328
329
PyDoc_STRVAR(gc_unfreeze__doc__,
330
"unfreeze($module, /)\n"
331
"--\n"
332
"\n"
333
"Unfreeze all objects in the permanent generation.\n"
334
"\n"
335
"Put all objects in the permanent generation back into oldest generation.");
336
337
#define GC_UNFREEZE_METHODDEF    \
338
    {"unfreeze", (PyCFunction)gc_unfreeze, METH_NOARGS, gc_unfreeze__doc__},
339
340
static PyObject *
341
gc_unfreeze_impl(PyObject *module);
342
343
static PyObject *
344
gc_unfreeze(PyObject *module, PyObject *Py_UNUSED(ignored))
345
0
{
346
0
    return gc_unfreeze_impl(module);
347
0
}
348
349
PyDoc_STRVAR(gc_get_freeze_count__doc__,
350
"get_freeze_count($module, /)\n"
351
"--\n"
352
"\n"
353
"Return the number of objects in the permanent generation.");
354
355
#define GC_GET_FREEZE_COUNT_METHODDEF    \
356
    {"get_freeze_count", (PyCFunction)gc_get_freeze_count, METH_NOARGS, gc_get_freeze_count__doc__},
357
358
static Py_ssize_t
359
gc_get_freeze_count_impl(PyObject *module);
360
361
static PyObject *
362
gc_get_freeze_count(PyObject *module, PyObject *Py_UNUSED(ignored))
363
0
{
364
0
    PyObject *return_value = NULL;
365
0
    Py_ssize_t _return_value;
366
367
0
    _return_value = gc_get_freeze_count_impl(module);
368
0
    if ((_return_value == -1) && PyErr_Occurred()) {
369
0
        goto exit;
370
0
    }
371
0
    return_value = PyLong_FromSsize_t(_return_value);
372
373
0
exit:
374
0
    return return_value;
375
0
}
376
/*[clinic end generated code: output=e40d384b1f0d513c input=a9049054013a1b77]*/