Coverage Report

Created: 2026-05-16 06:46

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/cpython/Objects/moduleobject.c
Line
Count
Source
1
/* Module object implementation */
2
3
#include "Python.h"
4
#include "pycore_call.h"          // _PyObject_CallNoArgs()
5
#include "pycore_ceval.h"         // _PyEval_EnableGILTransient()
6
#include "pycore_dict.h"          // _PyDict_EnablePerThreadRefcounting()
7
#include "pycore_fileutils.h"     // _Py_wgetcwd
8
#include "pycore_import.h"        // _PyImport_GetNextModuleIndex()
9
#include "pycore_interp.h"        // PyInterpreterState.importlib
10
#include "pycore_lazyimportobject.h" // _PyLazyImportObject_Check()
11
#include "pycore_long.h"          // _PyLong_GetOne()
12
#include "pycore_modsupport.h"    // _PyModule_CreateInitialized()
13
#include "pycore_moduleobject.h"  // _PyModule_GetDefOrNull()
14
#include "pycore_object.h"        // _PyType_AllocNoTrack
15
#include "pycore_pyerrors.h"      // _PyErr_FormatFromCause()
16
#include "pycore_pystate.h"       // _PyInterpreterState_GET()
17
#include "pycore_slots.h"         // _PySlotIterator_Init
18
#include "pycore_unicodeobject.h" // _PyUnicode_EqualToASCIIString()
19
#include "pycore_weakref.h"       // FT_CLEAR_WEAKREFS()
20
21
#include "osdefs.h"               // MAXPATHLEN
22
23
#define _PyModule_CAST(op) \
24
288k
    (assert(PyModule_Check(op)), _Py_CAST(PyModuleObject*, (op)))
25
26
27
static PyMemberDef module_members[] = {
28
    {"__dict__", _Py_T_OBJECT, offsetof(PyModuleObject, md_dict), Py_READONLY},
29
    {0}
30
};
31
32
static void
33
assert_def_missing_or_redundant(PyModuleObject *m)
34
126k
{
35
    /* We copy all relevant info into the module object.
36
     * Modules created using a def keep a reference to that (statically
37
     * allocated) def; the info there should match what we have in the module.
38
     */
39
#ifndef NDEBUG
40
    if (m->md_token_is_def) {
41
        PyModuleDef *def = (PyModuleDef *)m->md_token;
42
        assert(def);
43
#define DO_ASSERT(F) assert (def->m_ ## F == m->md_state_ ## F);
44
        DO_ASSERT(size);
45
        DO_ASSERT(traverse);
46
        DO_ASSERT(clear);
47
        DO_ASSERT(free);
48
#undef DO_ASSERT
49
    }
50
#endif // NDEBUG
51
126k
}
52
53
54
PyTypeObject PyModuleDef_Type = {
55
    PyVarObject_HEAD_INIT(&PyType_Type, 0)
56
    "moduledef",                                /* tp_name */
57
    sizeof(PyModuleDef),                        /* tp_basicsize */
58
    0,                                          /* tp_itemsize */
59
};
60
61
62
int
63
_PyModule_IsExtension(PyObject *obj)
64
0
{
65
0
    if (!PyModule_Check(obj)) {
66
0
        return 0;
67
0
    }
68
0
    PyModuleObject *module = (PyModuleObject*)obj;
69
70
0
    if (module->md_exec) {
71
0
        return 1;
72
0
    }
73
0
    if (module->md_token_is_def) {
74
0
        PyModuleDef *def = (PyModuleDef *)module->md_token;
75
0
        return (module->md_token_is_def && def->m_methods != NULL);
76
0
    }
77
0
    return 0;
78
0
}
79
80
81
PyObject*
82
PyModuleDef_Init(PyModuleDef* def)
83
2.08k
{
84
#ifdef Py_GIL_DISABLED
85
    // Check that this def does not come from a non-free-threading ABI.
86
    //
87
    // This is meant as a "sanity check"; users should never rely on it.
88
    // In particular, if we run out of ob_flags bits, or otherwise need to
89
    // change some of the internals, this check can go away. Still, it
90
    // would be nice to keep it for the free-threading transition.
91
    //
92
    // A PyModuleDef must be initialized with PyModuleDef_HEAD_INIT,
93
    // which (via PyObject_HEAD_INIT) sets _Py_STATICALLY_ALLOCATED_FLAG
94
    // and not _Py_LEGACY_ABI_CHECK_FLAG. For PyModuleDef, these flags never
95
    // change.
96
    // This means that the lower nibble of a valid PyModuleDef's ob_flags is
97
    // always `_10_` (in binary; `_` is don't care).
98
    //
99
    // So, a check for these bits won't reject valid PyModuleDef.
100
    // Rejecting incompatible extensions is slightly less important; here's
101
    // how that works:
102
    //
103
    // In the pre-free-threading stable ABI, PyModuleDef_HEAD_INIT is big
104
    // enough to overlap with free-threading ABI's ob_flags, is all zeros
105
    // except for the refcount field.
106
    // The refcount field can be:
107
    // - 1 (3.11 and below)
108
    // - UINT_MAX >> 2 (32-bit 3.12 & 3.13)
109
    // - UINT_MAX (64-bit 3.12 & 3.13)
110
    // - 7L << 28 (3.14)
111
    //
112
    // This means that the lower nibble of *any byte* in PyModuleDef_HEAD_INIT
113
    // is not `_10_` -- it can be:
114
    // - 0b0000
115
    // - 0b0001
116
    // - 0b0011 (from UINT_MAX >> 2)
117
    // - 0b0111 (from 7L << 28)
118
    // - 0b1111 (e.g. from UINT_MAX)
119
    // (The values may change at runtime as the PyModuleDef is used, but
120
    // PyModuleDef_Init is required before using the def as a Python object,
121
    // so we check at least once with the initial values.
122
    uint16_t flags = ((PyObject*)def)->ob_flags;
123
    uint16_t bits = _Py_STATICALLY_ALLOCATED_FLAG | _Py_LEGACY_ABI_CHECK_FLAG;
124
    if ((flags & bits) != _Py_STATICALLY_ALLOCATED_FLAG) {
125
        const char *message = "invalid PyModuleDef, extension possibly "
126
            "compiled for non-free-threaded Python";
127
        // Write the error as unraisable: if the extension tries calling
128
        // any API, it's likely to segfault and lose the exception.
129
        PyErr_SetString(PyExc_SystemError, message);
130
        PyErr_WriteUnraisable(NULL);
131
        // But also raise the exception normally -- this is technically
132
        // a recoverable state.
133
        PyErr_SetString(PyExc_SystemError, message);
134
        return NULL;
135
    }
136
#endif
137
2.08k
    assert(PyModuleDef_Type.tp_flags & Py_TPFLAGS_READY);
138
2.08k
    if (def->m_base.m_index == 0) {
139
1.11k
        Py_SET_REFCNT(def, 1);
140
1.11k
        Py_SET_TYPE(def, &PyModuleDef_Type);
141
1.11k
        def->m_base.m_index = _PyImport_GetNextModuleIndex();
142
1.11k
    }
143
2.08k
    return (PyObject*)def;
144
2.08k
}
145
146
static int
147
module_init_dict(PyModuleObject *mod, PyObject *md_dict,
148
                 PyObject *name, PyObject *doc)
149
8.28k
{
150
8.28k
    assert(md_dict != NULL);
151
8.28k
    if (doc == NULL)
152
1.23k
        doc = Py_None;
153
154
8.28k
    if (PyDict_SetItem(md_dict, &_Py_ID(__name__), name) != 0)
155
0
        return -1;
156
8.28k
    if (PyDict_SetItem(md_dict, &_Py_ID(__doc__), doc) != 0)
157
0
        return -1;
158
8.28k
    if (PyDict_SetItem(md_dict, &_Py_ID(__package__), Py_None) != 0)
159
0
        return -1;
160
8.28k
    if (PyDict_SetItem(md_dict, &_Py_ID(__loader__), Py_None) != 0)
161
0
        return -1;
162
8.28k
    if (PyDict_SetItem(md_dict, &_Py_ID(__spec__), Py_None) != 0)
163
0
        return -1;
164
8.28k
    if (PyUnicode_CheckExact(name)) {
165
8.28k
        Py_XSETREF(mod->md_name, Py_NewRef(name));
166
8.28k
    }
167
168
8.28k
    return 0;
169
8.28k
}
170
171
static PyModuleObject *
172
new_module_notrack(PyTypeObject *mt)
173
8.28k
{
174
8.28k
    PyModuleObject *m;
175
8.28k
    m = (PyModuleObject *)_PyType_AllocNoTrack(mt, 0);
176
8.28k
    if (m == NULL)
177
0
        return NULL;
178
8.28k
    m->md_state = NULL;
179
8.28k
    m->md_weaklist = NULL;
180
8.28k
    m->md_name = NULL;
181
8.28k
    m->md_token_is_def = false;
182
#ifdef Py_GIL_DISABLED
183
    m->md_requires_gil = true;
184
#endif
185
8.28k
    m->md_state_size = 0;
186
8.28k
    m->md_state_traverse = NULL;
187
8.28k
    m->md_state_clear = NULL;
188
8.28k
    m->md_state_free = NULL;
189
8.28k
    m->md_exec = NULL;
190
8.28k
    m->md_token = NULL;
191
8.28k
    m->md_dict = PyDict_New();
192
8.28k
    if (m->md_dict == NULL) {
193
0
        Py_DECREF(m);
194
0
        return NULL;
195
0
    }
196
8.28k
    return m;
197
8.28k
}
198
199
/* Module dict watcher callback.
200
 * When a module dictionary is modified, we need to clear the keys version
201
 * to invalidate any cached lookups that depend on the dictionary structure.
202
 */
203
static int
204
module_dict_watcher(PyDict_WatchEvent event, PyObject *dict,
205
                    PyObject *key, PyObject *new_value)
206
323k
{
207
323k
    assert(PyDict_Check(dict));
208
    // Only if a new lazy object shows up do we need to clear the dictionary. If
209
    // this is adding a new key then the version will be reset anyway.
210
323k
    if (event == PyDict_EVENT_MODIFIED &&
211
92.9k
        new_value != NULL &&
212
92.9k
        PyLazyImport_CheckExact(new_value)) {
213
0
        _PyDict_ClearKeysVersionLockHeld(dict);
214
0
    }
215
323k
    return 0;
216
323k
}
217
218
int
219
_PyModule_InitModuleDictWatcher(PyInterpreterState *interp)
220
37
{
221
    // This is a reserved watcher for CPython so there's no need to check for non-NULL.
222
37
    assert(interp->dict_state.watchers[MODULE_WATCHER_ID] == NULL);
223
37
    interp->dict_state.watchers[MODULE_WATCHER_ID] = &module_dict_watcher;
224
37
    return 0;
225
37
}
226
227
static void
228
track_module(PyModuleObject *m)
229
8.28k
{
230
8.28k
    _PyDict_EnablePerThreadRefcounting(m->md_dict);
231
8.28k
    _PyObject_SetDeferredRefcount((PyObject *)m);
232
8.28k
    PyDict_Watch(MODULE_WATCHER_ID, m->md_dict);
233
8.28k
    PyObject_GC_Track(m);
234
8.28k
}
235
236
static PyObject *
237
new_module(PyTypeObject *mt, PyObject *args, PyObject *kws)
238
7.04k
{
239
7.04k
    PyModuleObject *m = new_module_notrack(mt);
240
7.04k
    if (m != NULL) {
241
7.04k
        track_module(m);
242
7.04k
    }
243
7.04k
    return (PyObject *)m;
244
7.04k
}
245
246
PyObject *
247
PyModule_NewObject(PyObject *name)
248
1.23k
{
249
1.23k
    PyModuleObject *m = new_module_notrack(&PyModule_Type);
250
1.23k
    if (m == NULL)
251
0
        return NULL;
252
1.23k
    if (module_init_dict(m, m->md_dict, name, NULL) != 0)
253
0
        goto fail;
254
1.23k
    track_module(m);
255
1.23k
    return (PyObject *)m;
256
257
0
 fail:
258
0
    Py_DECREF(m);
259
0
    return NULL;
260
1.23k
}
261
262
PyObject *
263
PyModule_New(const char *name)
264
193
{
265
193
    PyObject *nameobj, *module;
266
193
    nameobj = PyUnicode_FromString(name);
267
193
    if (nameobj == NULL)
268
0
        return NULL;
269
193
    module = PyModule_NewObject(nameobj);
270
193
    Py_DECREF(nameobj);
271
193
    return module;
272
193
}
273
274
/* Check API/ABI version
275
 * Issues a warning on mismatch, which is usually not fatal.
276
 * Returns 0 if an exception is raised.
277
 */
278
static int
279
check_api_version(const char *name, int module_api_version)
280
1.11k
{
281
1.11k
    if (module_api_version != PYTHON_API_VERSION && module_api_version != PYTHON_ABI_VERSION) {
282
0
        int err;
283
0
        err = PyErr_WarnFormat(PyExc_RuntimeWarning, 1,
284
0
            "Python C API version mismatch for module %.100s: "
285
0
            "This Python has API version %d, module %.100s has version %d.",
286
0
             name,
287
0
             PYTHON_API_VERSION, name, module_api_version);
288
0
        if (err)
289
0
            return 0;
290
0
    }
291
1.11k
    return 1;
292
1.11k
}
293
294
static int
295
_add_methods_to_object(PyObject *module, PyObject *name, PyMethodDef *functions)
296
1.05k
{
297
1.05k
    PyObject *func;
298
1.05k
    PyMethodDef *fdef;
299
300
22.4k
    for (fdef = functions; fdef->ml_name != NULL; fdef++) {
301
21.3k
        if ((fdef->ml_flags & METH_CLASS) ||
302
21.3k
            (fdef->ml_flags & METH_STATIC)) {
303
0
            PyErr_SetString(PyExc_ValueError,
304
0
                            "module functions cannot set"
305
0
                            " METH_CLASS or METH_STATIC");
306
0
            return -1;
307
0
        }
308
21.3k
        func = PyCFunction_NewEx(fdef, (PyObject*)module, name);
309
21.3k
        if (func == NULL) {
310
0
            return -1;
311
0
        }
312
21.3k
        _PyObject_SetDeferredRefcount(func);
313
21.3k
        if (PyObject_SetAttrString(module, fdef->ml_name, func) != 0) {
314
0
            Py_DECREF(func);
315
0
            return -1;
316
0
        }
317
21.3k
        Py_DECREF(func);
318
21.3k
    }
319
320
1.05k
    return 0;
321
1.05k
}
322
323
PyObject *
324
PyModule_Create2(PyModuleDef* module, int module_api_version)
325
0
{
326
0
    if (!_PyImport_IsInitialized(_PyInterpreterState_GET())) {
327
0
        PyErr_SetString(PyExc_SystemError,
328
0
                        "Python import machinery not initialized");
329
0
        return NULL;
330
0
    }
331
0
    return _PyModule_CreateInitialized(module, module_api_version);
332
0
}
333
334
static void
335
module_copy_members_from_deflike(
336
    PyModuleObject *md,
337
    PyModuleDef *def_like /* not necessarily a valid Python object */)
338
1.11k
{
339
1.11k
    md->md_state_size = def_like->m_size;
340
1.11k
    md->md_state_traverse = def_like->m_traverse;
341
1.11k
    md->md_state_clear = def_like->m_clear;
342
1.11k
    md->md_state_free = def_like->m_free;
343
1.11k
}
344
345
PyObject *
346
_PyModule_CreateInitialized(PyModuleDef* module, int module_api_version)
347
148
{
348
148
    const char* name;
349
148
    PyModuleObject *m;
350
351
148
    if (!PyModuleDef_Init(module))
352
0
        return NULL;
353
148
    name = module->m_name;
354
148
    if (!check_api_version(name, module_api_version)) {
355
0
        return NULL;
356
0
    }
357
148
    if (module->m_slots) {
358
0
        PyErr_Format(
359
0
            PyExc_SystemError,
360
0
            "module %s: PyModule_Create is incompatible with m_slots", name);
361
0
        return NULL;
362
0
    }
363
148
    name = _PyImport_ResolveNameWithPackageContext(name);
364
365
148
    m = (PyModuleObject*)PyModule_New(name);
366
148
    if (m == NULL)
367
0
        return NULL;
368
369
148
    if (module->m_size > 0) {
370
0
        m->md_state = PyMem_Malloc(module->m_size);
371
0
        if (!m->md_state) {
372
0
            PyErr_NoMemory();
373
0
            Py_DECREF(m);
374
0
            return NULL;
375
0
        }
376
0
        memset(m->md_state, 0, module->m_size);
377
0
    }
378
379
148
    if (module->m_methods != NULL) {
380
148
        if (PyModule_AddFunctions((PyObject *) m, module->m_methods) != 0) {
381
0
            Py_DECREF(m);
382
0
            return NULL;
383
0
        }
384
148
    }
385
148
    if (module->m_doc != NULL) {
386
111
        if (PyModule_SetDocString((PyObject *) m, module->m_doc) != 0) {
387
0
            Py_DECREF(m);
388
0
            return NULL;
389
0
        }
390
111
    }
391
148
    m->md_token = module;
392
148
    m->md_token_is_def = true;
393
148
    module_copy_members_from_deflike(m, module);
394
#ifdef Py_GIL_DISABLED
395
    m->md_requires_gil = true;
396
#endif
397
148
    return (PyObject*)m;
398
148
}
399
400
typedef PyObject *(*createfunc_t)(PyObject *, PyModuleDef*);
401
402
static PyObject *
403
module_from_slots_and_spec(
404
    const PySlot *slots,
405
    PyObject *spec,
406
    int module_api_version,
407
    PyModuleDef* original_def /* NULL if not defined by a def */)
408
966
{
409
966
    createfunc_t create = NULL;
410
966
    PyObject *nameobj;
411
966
    PyObject *m = NULL;
412
966
    uint64_t multiple_interpreters = (uint64_t)Py_MOD_MULTIPLE_INTERPRETERS_SUPPORTED;
413
966
    bool requires_gil = true;
414
966
    const char *name;
415
966
    int ret;
416
966
    void *token = NULL;
417
966
    _Py_modexecfunc m_exec = NULL;
418
966
    PyInterpreterState *interp = _PyInterpreterState_GET();
419
420
966
    nameobj = PyObject_GetAttrString(spec, "name");
421
966
    if (nameobj == NULL) {
422
0
        return NULL;
423
0
    }
424
966
    name = PyUnicode_AsUTF8(nameobj);
425
966
    if (name == NULL) {
426
0
        goto error;
427
0
    }
428
429
966
    if (!check_api_version(name, module_api_version)) {
430
0
        goto error;
431
0
    }
432
433
966
    _PySlotIterator it;
434
435
966
    PyModuleDef _dummy_def = {0};
436
966
    PyModuleDef *def_like;
437
966
    if (slots) {
438
0
        assert(!original_def);
439
0
        def_like = &_dummy_def;
440
0
         _PySlotIterator_Init(&it, slots, _PySlot_KIND_MOD);
441
0
    }
442
966
    else {
443
966
        assert(original_def);
444
966
        def_like = original_def;
445
966
         _PySlotIterator_InitLegacy(&it, def_like->m_slots, _PySlot_KIND_MOD);
446
966
    }
447
966
    it.name = name;
448
449
4.76k
    while (_PySlotIterator_Next(&it)) {
450
3.80k
        switch (it.current.sl_id) {
451
0
            case Py_slot_invalid:
452
0
                goto error;
453
0
            case Py_mod_create:
454
0
                create = (createfunc_t)it.current.sl_func;
455
0
                break;
456
981
            case Py_mod_exec:
457
981
                if (!original_def) {
458
0
                    if (m_exec) {
459
0
                        PyErr_Format(
460
0
                            PyExc_SystemError,
461
0
                            "module %s has multiple Py_mod_exec slots",
462
0
                            name);
463
0
                        goto error;
464
0
                    }
465
0
                    m_exec = (_Py_modexecfunc)it.current.sl_func;
466
0
                }
467
981
                break;
468
981
            case Py_mod_multiple_interpreters:
469
966
                multiple_interpreters = it.current.sl_uint64;
470
966
                break;
471
966
            case Py_mod_gil:
472
966
                {
473
966
                    uint64_t val = it.current.sl_uint64;
474
966
                    requires_gil = (val != (uint64_t)Py_MOD_GIL_NOT_USED);
475
966
                }
476
966
                break;
477
888
            case Py_mod_abi:
478
888
                if (PyABIInfo_Check(it.current.sl_ptr, name) < 0) {
479
0
                    goto error;
480
0
                }
481
888
                break;
482
888
            case Py_mod_token:
483
0
                if (original_def && original_def != it.current.sl_ptr) {
484
0
                    PyErr_Format(
485
0
                        PyExc_SystemError,
486
0
                        "module %s: arbitrary Py_mod_token not "
487
0
                        "allowed with PyModuleDef",
488
0
                        name);
489
0
                    goto error;
490
0
                }
491
0
                token = it.current.sl_ptr;
492
0
                break;
493
            // Common case: Copy a PEP 793 slot to def_like
494
0
#define DEF_SLOT_CASE(SLOT, TYPE, SL_MEMBER, MEMBER)                        \
495
0
            case SLOT:                                                      \
496
0
                do {                                                        \
497
0
                    if (original_def) {                                     \
498
0
                        TYPE orig_value = (TYPE)original_def->MEMBER;       \
499
0
                        TYPE new_value = (TYPE)it.current.SL_MEMBER;        \
500
0
                        if (orig_value != new_value) {                      \
501
0
                            PyErr_Format(                                   \
502
0
                                PyExc_SystemError,                          \
503
0
                                "module %s: %s conflicts with "             \
504
0
                                "PyModuleDef." #MEMBER,                     \
505
0
                                name, _PySlot_GetName(it.current.sl_id));   \
506
0
                            goto error;                                     \
507
0
                        }                                                   \
508
0
                    }                                                       \
509
0
                    (def_like->MEMBER) = (TYPE)it.current.SL_MEMBER;        \
510
0
                } while (0);                                                \
511
0
                break;                                                      \
512
            /////////////////////////////////////////////////////////////////
513
0
            DEF_SLOT_CASE(Py_mod_name, char*, sl_ptr, m_name)
514
0
            DEF_SLOT_CASE(Py_mod_doc, char*, sl_ptr, m_doc)
515
0
            DEF_SLOT_CASE(Py_mod_state_size, Py_ssize_t, sl_size, m_size)
516
0
            DEF_SLOT_CASE(Py_mod_methods, PyMethodDef*, sl_ptr, m_methods)
517
0
            DEF_SLOT_CASE(Py_mod_state_traverse,
518
0
                          traverseproc, sl_func, m_traverse)
519
0
            DEF_SLOT_CASE(Py_mod_state_clear, inquiry, sl_func, m_clear)
520
3.80k
            DEF_SLOT_CASE(Py_mod_state_free, freefunc, sl_func, m_free)
521
3.80k
#undef DEF_SLOT_CASE
522
3.80k
        }
523
3.80k
    }
524
966
    if (!original_def && !_PySlotIterator_SawSlot(&it, Py_mod_abi)) {
525
0
        PyErr_Format(
526
0
            PyExc_SystemError,
527
0
            "module %s does not define Py_mod_abi,"
528
0
            " which is mandatory for modules defined from slots only.",
529
0
            name);
530
0
        goto error;
531
0
    }
532
533
#ifdef Py_GIL_DISABLED
534
    // For modules created directly from slots (not from a def), we enable
535
    // the GIL here (pairing `_PyEval_EnableGILTransient` with
536
    // an immediate `_PyImport_EnableGILAndWarn`).
537
    // For modules created from a def, the caller is responsible for this.
538
    if (!original_def && requires_gil) {
539
        PyThreadState *tstate = _PyThreadState_GET();
540
        if (_PyEval_EnableGILTransient(tstate) < 0) {
541
            goto error;
542
        }
543
        if (_PyImport_EnableGILAndWarn(tstate, nameobj) < 0) {
544
            goto error;
545
        }
546
    }
547
#endif
548
549
966
    if (def_like->m_size < 0) {
550
0
        PyErr_Format(
551
0
            PyExc_SystemError,
552
0
            "module %s: m_size may not be negative for multi-phase initialization",
553
0
            name);
554
0
        goto error;
555
0
    }
556
557
    /* By default, multi-phase init modules are expected
558
       to work under multiple interpreters. */
559
966
    if (multiple_interpreters == (int64_t)(intptr_t)Py_MOD_MULTIPLE_INTERPRETERS_NOT_SUPPORTED) {
560
0
        if (!_Py_IsMainInterpreter(interp)
561
0
            && _PyImport_CheckSubinterpIncompatibleExtensionAllowed(name) < 0)
562
0
        {
563
0
            goto error;
564
0
        }
565
0
    }
566
966
    else if (multiple_interpreters != (int64_t)(intptr_t)Py_MOD_PER_INTERPRETER_GIL_SUPPORTED
567
0
             && interp->ceval.own_gil
568
0
             && !_Py_IsMainInterpreter(interp)
569
0
             && _PyImport_CheckSubinterpIncompatibleExtensionAllowed(name) < 0)
570
0
    {
571
0
        goto error;
572
0
    }
573
574
966
    if (create) {
575
0
        m = create(spec, original_def);
576
0
        if (m == NULL) {
577
0
            if (!PyErr_Occurred()) {
578
0
                PyErr_Format(
579
0
                    PyExc_SystemError,
580
0
                    "creation of module %s failed without setting an exception",
581
0
                    name);
582
0
            }
583
0
            goto error;
584
0
        } else {
585
0
            if (PyErr_Occurred()) {
586
0
                _PyErr_FormatFromCause(
587
0
                    PyExc_SystemError,
588
0
                    "creation of module %s raised unreported exception",
589
0
                    name);
590
0
                goto error;
591
0
            }
592
0
        }
593
966
    } else {
594
966
        m = PyModule_NewObject(nameobj);
595
966
        if (m == NULL) {
596
0
            goto error;
597
0
        }
598
966
    }
599
600
966
    if (PyModule_Check(m)) {
601
966
        PyModuleObject *mod = (PyModuleObject*)m;
602
966
        mod->md_state = NULL;
603
966
        module_copy_members_from_deflike(mod, def_like);
604
966
        if (original_def) {
605
966
            assert (!token || token == original_def);
606
966
            mod->md_token = original_def;
607
966
            mod->md_token_is_def = 1;
608
966
        }
609
0
        else {
610
0
            mod->md_token = token;
611
0
        }
612
#ifdef Py_GIL_DISABLED
613
        mod->md_requires_gil = requires_gil;
614
#else
615
966
        (void)requires_gil;
616
966
#endif
617
966
        mod->md_exec = m_exec;
618
966
    } else {
619
0
        if (def_like->m_size > 0 || def_like->m_traverse || def_like->m_clear
620
0
            || def_like->m_free)
621
0
        {
622
0
            PyErr_Format(
623
0
                PyExc_SystemError,
624
0
                "module %s is not a module object, but requests module state",
625
0
                name);
626
0
            goto error;
627
0
        }
628
0
        if (_PySlotIterator_SawSlot(&it, Py_mod_exec)) {
629
0
            PyErr_Format(
630
0
                PyExc_SystemError,
631
0
                "module %s specifies execution slots, but did not create "
632
0
                    "a ModuleType instance",
633
0
                name);
634
0
            goto error;
635
0
        }
636
0
        if (token) {
637
0
            PyErr_Format(
638
0
                PyExc_SystemError,
639
0
                "module %s specifies a token, but did not create "
640
0
                    "a ModuleType instance",
641
0
                name);
642
0
            goto error;
643
0
        }
644
0
    }
645
646
966
    if (def_like->m_methods != NULL) {
647
910
        ret = _add_methods_to_object(m, nameobj, def_like->m_methods);
648
910
        if (ret != 0) {
649
0
            goto error;
650
0
        }
651
910
    }
652
653
966
    if (def_like->m_doc != NULL) {
654
844
        ret = PyModule_SetDocString(m, def_like->m_doc);
655
844
        if (ret != 0) {
656
0
            goto error;
657
0
        }
658
844
    }
659
660
966
    Py_DECREF(nameobj);
661
966
    return m;
662
663
0
error:
664
0
    Py_DECREF(nameobj);
665
0
    Py_XDECREF(m);
666
0
    return NULL;
667
966
}
668
669
PyObject *
670
PyModule_FromDefAndSpec2(PyModuleDef* def, PyObject *spec, int module_api_version)
671
966
{
672
966
    PyModuleDef_Init(def);
673
966
    return module_from_slots_and_spec(NULL, spec, module_api_version, def);
674
966
}
675
676
PyObject *
677
PyModule_FromSlotsAndSpec(const PySlot *slots, PyObject *spec)
678
0
{
679
0
    if (!slots) {
680
0
        PyErr_SetString(
681
0
            PyExc_SystemError,
682
0
            "PyModule_FromSlotsAndSpec called with NULL slots");
683
0
        return NULL;
684
0
    }
685
686
0
    return module_from_slots_and_spec(slots, spec, PYTHON_API_VERSION,
687
0
                                      NULL);
688
0
}
689
690
#ifdef Py_GIL_DISABLED
691
int
692
PyUnstable_Module_SetGIL(PyObject *module, void *gil)
693
{
694
    bool requires_gil = (gil != Py_MOD_GIL_NOT_USED);
695
    if (!PyModule_Check(module)) {
696
        PyErr_BadInternalCall();
697
        return -1;
698
    }
699
    ((PyModuleObject *)module)->md_requires_gil = requires_gil;
700
    return 0;
701
}
702
#endif
703
704
static int
705
run_exec_func(PyObject *module, int (*exec)(PyObject *))
706
981
{
707
981
    int ret = exec(module);
708
981
    if (ret != 0) {
709
0
        if (!PyErr_Occurred()) {
710
0
            PyErr_Format(
711
0
                PyExc_SystemError,
712
0
                "execution of %R failed without setting an exception",
713
0
                module);
714
0
        }
715
0
        return -1;
716
0
    }
717
981
    if (PyErr_Occurred()) {
718
0
        _PyErr_FormatFromCause(
719
0
            PyExc_SystemError,
720
0
            "execution of module %R raised unreported exception",
721
0
            module);
722
0
        return -1;
723
0
    }
724
981
    return 0;
725
981
}
726
727
static int
728
alloc_state(PyObject *module)
729
1.93k
{
730
1.93k
    if (!PyModule_Check(module)) {
731
0
        PyErr_Format(PyExc_TypeError, "expected module, got %T", module);
732
0
        return -1;
733
0
    }
734
1.93k
    PyModuleObject *md = (PyModuleObject*)module;
735
736
1.93k
    if (md->md_state_size >= 0) {
737
1.93k
        if (md->md_state == NULL) {
738
            /* Always set a state pointer; this serves as a marker to skip
739
             * multiple initialization (importlib.reload() is no-op) */
740
966
            md->md_state = PyMem_Malloc(md->md_state_size);
741
966
            if (!md->md_state) {
742
0
                PyErr_NoMemory();
743
0
                return -1;
744
0
            }
745
966
            memset(md->md_state, 0, md->md_state_size);
746
966
        }
747
1.93k
    }
748
1.93k
    return 0;
749
1.93k
}
750
751
int
752
PyModule_Exec(PyObject *module)
753
966
{
754
966
    if (alloc_state(module) < 0) {
755
0
        return -1;
756
0
    }
757
966
    PyModuleObject *md = (PyModuleObject*)module;
758
966
    if (md->md_exec) {
759
0
        assert(!md->md_token_is_def);
760
0
        return run_exec_func(module, md->md_exec);
761
0
    }
762
763
966
    PyModuleDef *def = _PyModule_GetDefOrNull(module);
764
966
    if (def) {
765
966
        return PyModule_ExecDef(module, def);
766
966
    }
767
0
    return 0;
768
966
}
769
770
int
771
PyModule_ExecDef(PyObject *module, PyModuleDef *def)
772
966
{
773
966
    if (alloc_state(module) < 0) {
774
0
        return -1;
775
0
    }
776
777
966
    assert(PyModule_Check(module));
778
779
966
    if (def->m_slots == NULL) {
780
0
        return 0;
781
0
    }
782
783
966
    _PySlotIterator it;
784
966
    _PySlotIterator_InitLegacy(&it, def->m_slots, _PySlot_KIND_MOD);
785
4.76k
    while (_PySlotIterator_Next(&it)) {
786
3.80k
        _Py_modexecfunc func;
787
3.80k
        switch (it.current.sl_id) {
788
0
            case Py_slot_invalid:
789
0
                return -1;
790
981
            case Py_mod_exec:
791
981
                func = (_Py_modexecfunc)it.current.sl_func;
792
981
                if (run_exec_func(module, func) < 0) {
793
0
                    return -1;
794
0
                }
795
981
                break;
796
3.80k
        }
797
3.80k
    }
798
966
    return 0;
799
966
}
800
801
int
802
PyModule_AddFunctions(PyObject *m, PyMethodDef *functions)
803
148
{
804
148
    int res;
805
148
    PyObject *name = PyModule_GetNameObject(m);
806
148
    if (name == NULL) {
807
0
        return -1;
808
0
    }
809
810
148
    res = _add_methods_to_object(m, name, functions);
811
148
    Py_DECREF(name);
812
148
    return res;
813
148
}
814
815
int
816
PyModule_SetDocString(PyObject *m, const char *doc)
817
955
{
818
955
    PyObject *v;
819
820
955
    v = PyUnicode_FromString(doc);
821
955
    if (v == NULL || PyObject_SetAttr(m, &_Py_ID(__doc__), v) != 0) {
822
0
        Py_XDECREF(v);
823
0
        return -1;
824
0
    }
825
955
    Py_DECREF(v);
826
955
    return 0;
827
955
}
828
829
PyObject *
830
PyModule_GetDict(PyObject *m)
831
22.0k
{
832
22.0k
    if (!PyModule_Check(m)) {
833
0
        PyErr_BadInternalCall();
834
0
        return NULL;
835
0
    }
836
22.0k
    return _PyModule_GetDict(m);  // borrowed reference
837
22.0k
}
838
839
int
840
PyModule_GetStateSize(PyObject *m, Py_ssize_t *size_p)
841
0
{
842
0
    *size_p = -1;
843
0
    if (!PyModule_Check(m)) {
844
0
        PyErr_Format(PyExc_TypeError, "expected module, got %T", m);
845
0
        return -1;
846
0
    }
847
0
    PyModuleObject *mod = (PyModuleObject *)m;
848
0
    *size_p = mod->md_state_size;
849
0
    return 0;
850
0
}
851
852
int
853
PyModule_GetToken_DuringGC(PyObject *m, void **token_p)
854
0
{
855
0
    *token_p = NULL;
856
0
    if (!PyModule_Check(m)) {
857
0
        return -1;
858
0
    }
859
0
    *token_p = _PyModule_GetToken(m);
860
0
    return 0;
861
0
}
862
863
int
864
PyModule_GetToken(PyObject *m, void **token_p)
865
0
{
866
0
    *token_p = NULL;
867
0
    if (!PyModule_Check(m)) {
868
0
        PyErr_Format(PyExc_TypeError, "expected module, got %T", m);
869
0
        return -1;
870
0
    }
871
0
    *token_p = _PyModule_GetToken(m);
872
0
    return 0;
873
0
}
874
875
PyObject*
876
PyModule_GetNameObject(PyObject *mod)
877
148
{
878
148
    if (!PyModule_Check(mod)) {
879
0
        PyErr_BadArgument();
880
0
        return NULL;
881
0
    }
882
148
    PyObject *dict = ((PyModuleObject *)mod)->md_dict;  // borrowed reference
883
148
    if (dict == NULL || !PyDict_Check(dict)) {
884
0
        goto error;
885
0
    }
886
148
    PyObject *name;
887
148
    if (PyDict_GetItemRef(dict, &_Py_ID(__name__), &name) <= 0) {
888
        // error or not found
889
0
        goto error;
890
0
    }
891
148
    if (!PyUnicode_Check(name)) {
892
0
        Py_DECREF(name);
893
0
        goto error;
894
0
    }
895
148
    return name;
896
897
0
error:
898
0
    if (!PyErr_Occurred()) {
899
0
        PyErr_SetString(PyExc_SystemError, "nameless module");
900
0
    }
901
0
    return NULL;
902
148
}
903
904
const char *
905
PyModule_GetName(PyObject *m)
906
0
{
907
0
    PyObject *name = PyModule_GetNameObject(m);
908
0
    if (name == NULL) {
909
0
        return NULL;
910
0
    }
911
0
    assert(Py_REFCNT(name) >= 2);
912
0
    Py_DECREF(name);   /* module dict has still a reference */
913
0
    return PyUnicode_AsUTF8(name);
914
0
}
915
916
PyObject*
917
_PyModule_GetFilenameObject(PyObject *mod)
918
28
{
919
    // We return None to indicate "not found" or "bogus".
920
28
    if (!PyModule_Check(mod)) {
921
0
        PyErr_BadArgument();
922
0
        return NULL;
923
0
    }
924
28
    PyObject *dict = ((PyModuleObject *)mod)->md_dict;  // borrowed reference
925
28
    if (dict == NULL) {
926
        // The module has been tampered with.
927
0
        Py_RETURN_NONE;
928
0
    }
929
28
    PyObject *fileobj;
930
28
    int res = PyDict_GetItemRef(dict, &_Py_ID(__file__), &fileobj);
931
28
    if (res < 0) {
932
0
        return NULL;
933
0
    }
934
28
    if (res == 0) {
935
        // __file__ isn't set.  There are several reasons why this might
936
        // be so, most of them valid reasons.  If it's the __main__
937
        // module then we're running the REPL or with -c.  Otherwise
938
        // it's a namespace package or other module with a loader that
939
        // isn't disk-based.  It could also be that a user created
940
        // a module manually but without manually setting __file__.
941
26
        Py_RETURN_NONE;
942
26
    }
943
2
    if (!PyUnicode_Check(fileobj)) {
944
0
        Py_DECREF(fileobj);
945
0
        Py_RETURN_NONE;
946
0
    }
947
2
    return fileobj;
948
2
}
949
950
PyObject*
951
PyModule_GetFilenameObject(PyObject *mod)
952
28
{
953
28
    PyObject *fileobj = _PyModule_GetFilenameObject(mod);
954
28
    if (fileobj == NULL) {
955
0
        return NULL;
956
0
    }
957
28
    if (fileobj == Py_None) {
958
26
        PyErr_SetString(PyExc_SystemError, "module filename missing");
959
26
        return NULL;
960
26
    }
961
2
    return fileobj;
962
28
}
963
964
const char *
965
PyModule_GetFilename(PyObject *m)
966
0
{
967
0
    PyObject *fileobj;
968
0
    const char *utf8;
969
0
    fileobj = PyModule_GetFilenameObject(m);
970
0
    if (fileobj == NULL)
971
0
        return NULL;
972
0
    utf8 = PyUnicode_AsUTF8(fileobj);
973
0
    Py_DECREF(fileobj);   /* module dict has still a reference */
974
0
    return utf8;
975
0
}
976
977
Py_ssize_t
978
_PyModule_GetFilenameUTF8(PyObject *mod, char *buffer, Py_ssize_t maxlen)
979
0
{
980
    // We "return" an empty string for an invalid module
981
    // and for a missing, empty, or invalid filename.
982
0
    assert(maxlen >= 0);
983
0
    Py_ssize_t size = -1;
984
0
    PyObject *filenameobj = _PyModule_GetFilenameObject(mod);
985
0
    if (filenameobj == NULL) {
986
0
        return -1;
987
0
    }
988
0
    if (filenameobj == Py_None) {
989
        // It is missing or invalid.
990
0
        buffer[0] = '\0';
991
0
        size = 0;
992
0
    }
993
0
    else {
994
0
        const char *filename = PyUnicode_AsUTF8AndSize(filenameobj, &size);
995
0
        assert(size >= 0);
996
0
        if (size > maxlen) {
997
0
            size = -1;
998
0
            PyErr_SetString(PyExc_ValueError, "__file__ too long");
999
0
        }
1000
0
        else {
1001
0
            (void)strcpy(buffer, filename);
1002
0
        }
1003
0
    }
1004
0
    Py_DECREF(filenameobj);
1005
0
    return size;
1006
0
}
1007
1008
PyModuleDef*
1009
PyModule_GetDef(PyObject* m)
1010
4
{
1011
4
    if (!PyModule_Check(m)) {
1012
0
        PyErr_BadArgument();
1013
0
        return NULL;
1014
0
    }
1015
4
    return _PyModule_GetDefOrNull(m);
1016
4
}
1017
1018
void*
1019
PyModule_GetState_DuringGC(PyObject* m)
1020
0
{
1021
0
    if (!PyModule_Check(m)) {
1022
0
        return NULL;
1023
0
    }
1024
0
    return _PyModule_GetState(m);
1025
0
}
1026
1027
void*
1028
PyModule_GetState(PyObject* m)
1029
31.5M
{
1030
31.5M
    if (!PyModule_Check(m)) {
1031
0
        PyErr_BadArgument();
1032
0
        return NULL;
1033
0
    }
1034
31.5M
    return _PyModule_GetState(m);
1035
31.5M
}
1036
1037
void
1038
_PyModule_Clear(PyObject *m)
1039
0
{
1040
0
    PyObject *d = ((PyModuleObject *)m)->md_dict;
1041
0
    if (d != NULL)
1042
0
        _PyModule_ClearDict(d);
1043
0
}
1044
1045
void
1046
_PyModule_ClearDict(PyObject *d)
1047
0
{
1048
    /* To make the execution order of destructors for global
1049
       objects a bit more predictable, we first zap all objects
1050
       whose name starts with a single underscore, before we clear
1051
       the entire dictionary.  We zap them by replacing them with
1052
       None, rather than deleting them from the dictionary, to
1053
       avoid rehashing the dictionary (to some extent). */
1054
1055
0
    Py_ssize_t pos;
1056
0
    PyObject *key, *value;
1057
1058
0
    int verbose = _Py_GetConfig()->verbose;
1059
1060
    /* First, clear only names starting with a single underscore */
1061
0
    pos = 0;
1062
0
    while (PyDict_Next(d, &pos, &key, &value)) {
1063
0
        if (value != Py_None && PyUnicode_Check(key)) {
1064
0
            if (PyUnicode_READ_CHAR(key, 0) == '_' &&
1065
0
                PyUnicode_READ_CHAR(key, 1) != '_') {
1066
0
                if (verbose > 1) {
1067
0
                    const char *s = PyUnicode_AsUTF8(key);
1068
0
                    if (s != NULL)
1069
0
                        PySys_WriteStderr("#   clear[1] %s\n", s);
1070
0
                    else
1071
0
                        PyErr_Clear();
1072
0
                }
1073
0
                if (PyDict_SetItem(d, key, Py_None) != 0) {
1074
0
                    PyErr_FormatUnraisable("Exception ignored while "
1075
0
                                           "clearing module dict");
1076
0
                }
1077
0
            }
1078
0
        }
1079
0
    }
1080
1081
    /* Next, clear all names except for __builtins__ */
1082
0
    pos = 0;
1083
0
    while (PyDict_Next(d, &pos, &key, &value)) {
1084
0
        if (value != Py_None && PyUnicode_Check(key)) {
1085
0
            if (PyUnicode_READ_CHAR(key, 0) != '_' ||
1086
0
                !_PyUnicode_EqualToASCIIString(key, "__builtins__"))
1087
0
            {
1088
0
                if (verbose > 1) {
1089
0
                    const char *s = PyUnicode_AsUTF8(key);
1090
0
                    if (s != NULL)
1091
0
                        PySys_WriteStderr("#   clear[2] %s\n", s);
1092
0
                    else
1093
0
                        PyErr_Clear();
1094
0
                }
1095
0
                if (PyDict_SetItem(d, key, Py_None) != 0) {
1096
0
                    PyErr_FormatUnraisable("Exception ignored while "
1097
0
                                           "clearing module dict");
1098
0
                }
1099
0
            }
1100
0
        }
1101
0
    }
1102
1103
    /* Note: we leave __builtins__ in place, so that destructors
1104
       of non-global objects defined in this module can still use
1105
       builtins, in particularly 'None'. */
1106
1107
0
}
1108
1109
/*[clinic input]
1110
class module "PyModuleObject *" "&PyModule_Type"
1111
[clinic start generated code]*/
1112
/*[clinic end generated code: output=da39a3ee5e6b4b0d input=3e35d4f708ecb6af]*/
1113
1114
#include "clinic/moduleobject.c.h"
1115
1116
/* Methods */
1117
1118
/*[clinic input]
1119
module.__init__
1120
    name: unicode
1121
    doc: object = None
1122
1123
Create a module object.
1124
1125
The name must be a string; the optional doc argument can have any type.
1126
[clinic start generated code]*/
1127
1128
static int
1129
module___init___impl(PyModuleObject *self, PyObject *name, PyObject *doc)
1130
/*[clinic end generated code: output=e7e721c26ce7aad7 input=57f9e177401e5e1e]*/
1131
7.04k
{
1132
7.04k
    return module_init_dict(self, self->md_dict, name, doc);
1133
7.04k
}
1134
1135
static void
1136
module_dealloc(PyObject *self)
1137
4.32k
{
1138
4.32k
    PyModuleObject *m = _PyModule_CAST(self);
1139
1140
4.32k
    PyObject_GC_UnTrack(m);
1141
1142
4.32k
    int verbose = _Py_GetConfig()->verbose;
1143
4.32k
    if (verbose && m->md_name) {
1144
0
        PySys_FormatStderr("# destroy %U\n", m->md_name);
1145
0
    }
1146
4.32k
    FT_CLEAR_WEAKREFS(self, m->md_weaklist);
1147
1148
4.32k
    assert_def_missing_or_redundant(m);
1149
    /* bpo-39824: Don't call m_free() if m_size > 0 and md_state=NULL */
1150
4.32k
    if (m->md_state_free && (m->md_state_size <= 0 || m->md_state != NULL))
1151
0
    {
1152
0
        m->md_state_free(m);
1153
0
    }
1154
1155
4.32k
    Py_XDECREF(m->md_dict);
1156
4.32k
    Py_XDECREF(m->md_name);
1157
4.32k
    if (m->md_state != NULL) {
1158
0
        PyMem_Free(m->md_state);
1159
0
    }
1160
4.32k
    Py_TYPE(m)->tp_free((PyObject *)m);
1161
4.32k
}
1162
1163
static PyObject *
1164
module_repr(PyObject *self)
1165
0
{
1166
0
    PyModuleObject *m = _PyModule_CAST(self);
1167
0
    PyInterpreterState *interp = _PyInterpreterState_GET();
1168
0
    return _PyImport_ImportlibModuleRepr(interp, (PyObject *)m);
1169
0
}
1170
1171
/* Check if the "_initializing" attribute of the module spec is set to true.
1172
 */
1173
int
1174
_PyModuleSpec_IsInitializing(PyObject *spec)
1175
4.75M
{
1176
4.75M
    if (spec == NULL) {
1177
0
        return 0;
1178
0
    }
1179
4.75M
    PyObject *value;
1180
4.75M
    int rc = PyObject_GetOptionalAttr(spec, &_Py_ID(_initializing), &value);
1181
4.75M
    if (rc > 0) {
1182
4.50M
        rc = PyObject_IsTrue(value);
1183
4.50M
        Py_DECREF(value);
1184
4.50M
    }
1185
4.75M
    return rc;
1186
4.75M
}
1187
1188
/* Check if the submodule name is in the "_uninitialized_submodules" attribute
1189
   of the module spec.
1190
 */
1191
int
1192
_PyModuleSpec_IsUninitializedSubmodule(PyObject *spec, PyObject *name)
1193
2.45k
{
1194
2.45k
    if (spec == NULL) {
1195
0
         return 0;
1196
0
    }
1197
1198
2.45k
    PyObject *value;
1199
2.45k
    int rc = PyObject_GetOptionalAttr(spec, &_Py_ID(_uninitialized_submodules), &value);
1200
2.45k
    if (rc > 0) {
1201
2.15k
        rc = PySequence_Contains(value, name);
1202
2.15k
        Py_DECREF(value);
1203
2.15k
    }
1204
2.45k
    return rc;
1205
2.45k
}
1206
1207
int
1208
_PyModuleSpec_GetFileOrigin(PyObject *spec, PyObject **p_origin)
1209
2.48k
{
1210
2.48k
    PyObject *has_location = NULL;
1211
2.48k
    int rc = PyObject_GetOptionalAttr(spec, &_Py_ID(has_location), &has_location);
1212
2.48k
    if (rc <= 0) {
1213
296
        return rc;
1214
296
    }
1215
    // If origin is not a location, or doesn't exist, or is not a str, we could consider falling
1216
    // back to module.__file__. But the cases in which module.__file__ is not __spec__.origin
1217
    // are cases in which we probably shouldn't be guessing.
1218
2.18k
    rc = PyObject_IsTrue(has_location);
1219
2.18k
    Py_DECREF(has_location);
1220
2.18k
    if (rc <= 0) {
1221
773
        return rc;
1222
773
    }
1223
    // has_location is true, so origin is a location
1224
1.41k
    PyObject *origin = NULL;
1225
1.41k
    rc = PyObject_GetOptionalAttr(spec, &_Py_ID(origin), &origin);
1226
1.41k
    if (rc <= 0) {
1227
0
        return rc;
1228
0
    }
1229
1.41k
    assert(origin != NULL);
1230
1.41k
    if (!PyUnicode_Check(origin)) {
1231
0
        Py_DECREF(origin);
1232
0
        return 0;
1233
0
    }
1234
1.41k
    *p_origin = origin;
1235
1.41k
    return 1;
1236
1.41k
}
1237
1238
int
1239
_PyModule_IsPossiblyShadowing(PyObject *origin)
1240
2.48k
{
1241
    // origin must be a unicode subtype
1242
    // Returns 1 if the module at origin could be shadowing a module of the
1243
    // same name later in the module search path. The condition we check is basically:
1244
    // root = os.path.dirname(origin.removesuffix(os.sep + "__init__.py"))
1245
    // return not sys.flags.safe_path and root == (sys.path[0] or os.getcwd())
1246
    // Returns 0 otherwise (or if we aren't sure)
1247
    // Returns -1 if an error occurred that should be propagated
1248
2.48k
    if (origin == NULL) {
1249
1.06k
        return 0;
1250
1.06k
    }
1251
1252
    // not sys.flags.safe_path
1253
1.41k
    const PyConfig *config = _Py_GetConfig();
1254
1.41k
    if (config->safe_path) {
1255
0
        return 0;
1256
0
    }
1257
1258
    // root = os.path.dirname(origin.removesuffix(os.sep + "__init__.py"))
1259
1.41k
    wchar_t root[MAXPATHLEN + 1];
1260
1.41k
    Py_ssize_t size = PyUnicode_AsWideChar(origin, root, MAXPATHLEN);
1261
1.41k
    if (size < 0) {
1262
0
        return -1;
1263
0
    }
1264
1.41k
    assert(size <= MAXPATHLEN);
1265
1.41k
    root[size] = L'\0';
1266
1267
1.41k
    wchar_t *sep = wcsrchr(root, SEP);
1268
1.41k
    if (sep == NULL) {
1269
0
        return 0;
1270
0
    }
1271
    // If it's a package then we need to look one directory further up
1272
1.41k
    if (wcscmp(sep + 1, L"__init__.py") == 0) {
1273
0
        *sep = L'\0';
1274
0
        sep = wcsrchr(root, SEP);
1275
0
        if (sep == NULL) {
1276
0
            return 0;
1277
0
        }
1278
0
    }
1279
1.41k
    *sep = L'\0';
1280
1281
    // sys.path[0] or os.getcwd()
1282
1.41k
    wchar_t *sys_path_0 = config->sys_path_0;
1283
1.41k
    if (!sys_path_0) {
1284
1.41k
        return 0;
1285
1.41k
    }
1286
1287
0
    wchar_t sys_path_0_buf[MAXPATHLEN];
1288
0
    if (sys_path_0[0] == L'\0') {
1289
        // if sys.path[0] == "", treat it as if it were the current directory
1290
0
        if (!_Py_wgetcwd(sys_path_0_buf, MAXPATHLEN)) {
1291
            // If we failed to getcwd, don't raise an exception and instead
1292
            // let the caller proceed assuming no shadowing
1293
0
            return 0;
1294
0
        }
1295
0
        sys_path_0 = sys_path_0_buf;
1296
0
    }
1297
1298
0
    int result = wcscmp(sys_path_0, root) == 0;
1299
0
    return result;
1300
0
}
1301
1302
PyObject*
1303
_Py_module_getattro_impl(PyModuleObject *m, PyObject *name, int suppress)
1304
8.57M
{
1305
    // When suppress=1, this function suppresses AttributeError.
1306
8.57M
    PyObject *attr, *mod_name, *getattr;
1307
8.57M
    attr = _PyObject_GenericGetAttrWithDict((PyObject *)m, name, NULL, suppress);
1308
8.57M
    if (attr) {
1309
7.31M
        if (PyLazyImport_CheckExact(attr)) {
1310
            // gh-144957: Module __getattr__ should get a chance to provide
1311
            // the attribute before resolving a lazy import placeholder.
1312
0
            if (PyDict_GetItemRef(m->md_dict, &_Py_ID(__getattr__), &getattr) < 0) {
1313
0
                Py_DECREF(attr);
1314
0
                return NULL;
1315
0
            }
1316
0
            if (getattr) {
1317
0
                PyObject *result = PyObject_CallOneArg(getattr, name);
1318
0
                Py_DECREF(getattr);
1319
0
                if (result != NULL) {
1320
0
                    Py_DECREF(attr);
1321
0
                    return result;
1322
0
                }
1323
0
                if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
1324
0
                    Py_DECREF(attr);
1325
0
                    return NULL;
1326
0
                }
1327
0
                PyErr_Clear();
1328
0
            }
1329
0
            PyObject *new_value = _PyImport_LoadLazyImportTstate(
1330
0
                PyThreadState_GET(), attr);
1331
0
            if (new_value == NULL) {
1332
0
                if (suppress &&
1333
0
                    PyErr_ExceptionMatches(PyExc_ImportCycleError)) {
1334
                    // ImportCycleError is raised when a lazy object tries
1335
                    // to import itself. In this case, the error should not
1336
                    // propagate to the caller and instead treated as if the
1337
                    // attribute doesn't exist.
1338
0
                    PyErr_Clear();
1339
0
                }
1340
0
                Py_DECREF(attr);
1341
0
                return NULL;
1342
0
            }
1343
1344
0
            if (PyDict_SetItem(m->md_dict, name, new_value) < 0) {
1345
0
                Py_CLEAR(new_value);
1346
0
            }
1347
0
            Py_DECREF(attr);
1348
0
            return new_value;
1349
0
        }
1350
7.31M
        return attr;
1351
7.31M
    }
1352
1.25M
    if (suppress == 1) {
1353
1.25M
        if (PyErr_Occurred()) {
1354
            // pass up non-AttributeError exception
1355
0
            return NULL;
1356
0
        }
1357
1.25M
    }
1358
2.45k
    else {
1359
2.45k
        if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
1360
            // pass up non-AttributeError exception
1361
0
            return NULL;
1362
0
        }
1363
2.45k
        PyErr_Clear();
1364
2.45k
    }
1365
1.25M
    assert(m->md_dict != NULL);
1366
1.25M
    if (PyDict_GetItemRef(m->md_dict, &_Py_ID(__getattr__), &getattr) < 0) {
1367
0
        return NULL;
1368
0
    }
1369
1.25M
    if (getattr) {
1370
806
        PyObject *result = PyObject_CallOneArg(getattr, name);
1371
806
        if (result == NULL && suppress == 1 && PyErr_ExceptionMatches(PyExc_AttributeError)) {
1372
            // suppress AttributeError
1373
802
            PyErr_Clear();
1374
802
        }
1375
806
        Py_DECREF(getattr);
1376
806
        return result;
1377
806
    }
1378
1379
    // The attribute was not found.  We make a best effort attempt at a useful error message,
1380
    // but only if we're not suppressing AttributeError.
1381
1.25M
    if (suppress == 1) {
1382
1.25M
        return NULL;
1383
1.25M
    }
1384
2.45k
    if (PyDict_GetItemRef(m->md_dict, &_Py_ID(__name__), &mod_name) < 0) {
1385
0
        return NULL;
1386
0
    }
1387
2.45k
    if (!mod_name || !PyUnicode_Check(mod_name)) {
1388
0
        Py_XDECREF(mod_name);
1389
0
        PyErr_Format(PyExc_AttributeError,
1390
0
                    "module has no attribute '%U'", name);
1391
0
        return NULL;
1392
0
    }
1393
2.45k
    PyObject *spec;
1394
2.45k
    if (PyDict_GetItemRef(m->md_dict, &_Py_ID(__spec__), &spec) < 0) {
1395
0
        Py_DECREF(mod_name);
1396
0
        return NULL;
1397
0
    }
1398
2.45k
    if (spec == NULL) {
1399
0
        PyErr_Format(PyExc_AttributeError,
1400
0
                     "module '%U' has no attribute '%U'",
1401
0
                     mod_name, name);
1402
0
        Py_DECREF(mod_name);
1403
0
        return NULL;
1404
0
    }
1405
1406
2.45k
    PyObject *origin = NULL;
1407
2.45k
    if (_PyModuleSpec_GetFileOrigin(spec, &origin) < 0) {
1408
0
        goto done;
1409
0
    }
1410
1411
2.45k
    int is_possibly_shadowing = _PyModule_IsPossiblyShadowing(origin);
1412
2.45k
    if (is_possibly_shadowing < 0) {
1413
0
        goto done;
1414
0
    }
1415
2.45k
    int is_possibly_shadowing_stdlib = 0;
1416
2.45k
    if (is_possibly_shadowing) {
1417
0
        PyObject *stdlib_modules;
1418
0
        if (PySys_GetOptionalAttrString("stdlib_module_names", &stdlib_modules) < 0) {
1419
0
            goto done;
1420
0
        }
1421
0
        if (stdlib_modules && PyAnySet_Check(stdlib_modules)) {
1422
0
            is_possibly_shadowing_stdlib = PySet_Contains(stdlib_modules, mod_name);
1423
0
            if (is_possibly_shadowing_stdlib < 0) {
1424
0
                Py_DECREF(stdlib_modules);
1425
0
                goto done;
1426
0
            }
1427
0
        }
1428
0
        Py_XDECREF(stdlib_modules);
1429
0
    }
1430
1431
2.45k
    if (is_possibly_shadowing_stdlib) {
1432
0
        assert(origin);
1433
0
        PyErr_Format(PyExc_AttributeError,
1434
0
                    "module '%U' has no attribute '%U' "
1435
0
                    "(consider renaming '%U' since it has the same "
1436
0
                    "name as the standard library module named '%U' "
1437
0
                    "and prevents importing that standard library module)",
1438
0
                    mod_name, name, origin, mod_name);
1439
0
    }
1440
2.45k
    else {
1441
2.45k
        int rc = _PyModuleSpec_IsInitializing(spec);
1442
2.45k
        if (rc < 0) {
1443
0
            goto done;
1444
0
        }
1445
2.45k
        else if (rc > 0) {
1446
0
            if (is_possibly_shadowing) {
1447
0
                assert(origin);
1448
                // For non-stdlib modules, only mention the possibility of
1449
                // shadowing if the module is being initialized.
1450
0
                PyErr_Format(PyExc_AttributeError,
1451
0
                            "module '%U' has no attribute '%U' "
1452
0
                            "(consider renaming '%U' if it has the same name "
1453
0
                            "as a library you intended to import)",
1454
0
                            mod_name, name, origin);
1455
0
            }
1456
0
            else if (origin) {
1457
0
                PyErr_Format(PyExc_AttributeError,
1458
0
                            "partially initialized "
1459
0
                            "module '%U' from '%U' has no attribute '%U' "
1460
0
                            "(most likely due to a circular import)",
1461
0
                            mod_name, origin, name);
1462
0
            }
1463
0
            else {
1464
0
                PyErr_Format(PyExc_AttributeError,
1465
0
                            "partially initialized "
1466
0
                            "module '%U' has no attribute '%U' "
1467
0
                            "(most likely due to a circular import)",
1468
0
                            mod_name, name);
1469
0
            }
1470
0
        }
1471
2.45k
        else {
1472
2.45k
            assert(rc == 0);
1473
2.45k
            rc = _PyModuleSpec_IsUninitializedSubmodule(spec, name);
1474
2.45k
            if (rc > 0) {
1475
0
                PyErr_Format(PyExc_AttributeError,
1476
0
                            "cannot access submodule '%U' of module '%U' "
1477
0
                            "(most likely due to a circular import)",
1478
0
                            name, mod_name);
1479
0
            }
1480
2.45k
            else if (rc == 0) {
1481
2.45k
                PyErr_Format(PyExc_AttributeError,
1482
2.45k
                            "module '%U' has no attribute '%U'",
1483
2.45k
                            mod_name, name);
1484
2.45k
            }
1485
2.45k
        }
1486
2.45k
    }
1487
1488
2.45k
done:
1489
2.45k
    Py_XDECREF(origin);
1490
2.45k
    Py_DECREF(spec);
1491
2.45k
    Py_DECREF(mod_name);
1492
2.45k
    return NULL;
1493
2.45k
}
1494
1495
1496
PyObject*
1497
_Py_module_getattro(PyObject *self, PyObject *name)
1498
161k
{
1499
161k
    PyModuleObject *m = _PyModule_CAST(self);
1500
161k
    return _Py_module_getattro_impl(m, name, 0);
1501
161k
}
1502
1503
static int
1504
module_traverse(PyObject *self, visitproc visit, void *arg)
1505
122k
{
1506
122k
    PyModuleObject *m = _PyModule_CAST(self);
1507
1508
122k
    assert_def_missing_or_redundant(m);
1509
    /* bpo-39824: Don't call m_traverse() if m_size > 0 and md_state=NULL */
1510
122k
    if (m->md_state_traverse && (m->md_state_size <= 0 || m->md_state != NULL))
1511
18.6k
    {
1512
18.6k
        int res = m->md_state_traverse((PyObject*)m, visit, arg);
1513
18.6k
        if (res)
1514
0
            return res;
1515
18.6k
    }
1516
1517
122k
    Py_VISIT(m->md_dict);
1518
122k
    return 0;
1519
122k
}
1520
1521
static int
1522
module_clear(PyObject *self)
1523
0
{
1524
0
    PyModuleObject *m = _PyModule_CAST(self);
1525
1526
0
    assert_def_missing_or_redundant(m);
1527
    /* bpo-39824: Don't call m_clear() if m_size > 0 and md_state=NULL */
1528
0
    if (m->md_state_clear && (m->md_state_size <= 0 || m->md_state != NULL))
1529
0
    {
1530
0
        int res = m->md_state_clear((PyObject*)m);
1531
0
        if (PyErr_Occurred()) {
1532
0
            PyErr_FormatUnraisable("Exception ignored in m_clear of module%s%V",
1533
0
                                   m->md_name ? " " : "",
1534
0
                                   m->md_name, "");
1535
0
        }
1536
0
        if (res) {
1537
0
            return res;
1538
0
        }
1539
0
    }
1540
0
    Py_CLEAR(m->md_dict);
1541
0
    return 0;
1542
0
}
1543
1544
static PyObject *
1545
module_dir(PyObject *self, PyObject *args)
1546
47
{
1547
47
    PyObject *result = NULL;
1548
47
    PyObject *dict;
1549
47
    if (PyModule_CheckExact(self)) {
1550
47
        dict = Py_NewRef(((PyModuleObject *)self)->md_dict);
1551
47
    } else {
1552
0
        dict = PyObject_GetAttr(self, &_Py_ID(__dict__));
1553
0
    }
1554
1555
47
    if (dict != NULL) {
1556
47
        if (PyDict_Check(dict)) {
1557
47
            PyObject *dirfunc = PyDict_GetItemWithError(dict, &_Py_ID(__dir__));
1558
47
            if (dirfunc) {
1559
0
                result = _PyObject_CallNoArgs(dirfunc);
1560
0
            }
1561
47
            else if (!PyErr_Occurred()) {
1562
47
                result = PyDict_Keys(dict);
1563
47
            }
1564
47
        }
1565
0
        else {
1566
0
            PyErr_Format(PyExc_TypeError, "<module>.__dict__ is not a dictionary");
1567
0
        }
1568
47
    }
1569
1570
47
    Py_XDECREF(dict);
1571
47
    return result;
1572
47
}
1573
1574
static PyMethodDef module_methods[] = {
1575
    {"__dir__", module_dir, METH_NOARGS,
1576
     PyDoc_STR("__dir__() -> list\nspecialized dir() implementation")},
1577
    {0}
1578
};
1579
1580
static PyObject *
1581
module_load_dict(PyModuleObject *m)
1582
0
{
1583
0
    PyObject *dict = PyObject_GetAttr((PyObject *)m, &_Py_ID(__dict__));
1584
0
    if (dict == NULL) {
1585
0
        return NULL;
1586
0
    }
1587
0
    if (!PyDict_Check(dict)) {
1588
0
        PyErr_Format(PyExc_TypeError, "<module>.__dict__ is not a dictionary");
1589
0
        Py_DECREF(dict);
1590
0
        return NULL;
1591
0
    }
1592
0
    return dict;
1593
0
}
1594
1595
static PyObject *
1596
module_get_annotate(PyObject *self, void *Py_UNUSED(ignored))
1597
0
{
1598
0
    PyModuleObject *m = _PyModule_CAST(self);
1599
1600
0
    PyObject *dict = module_load_dict(m);
1601
0
    if (dict == NULL) {
1602
0
        return NULL;
1603
0
    }
1604
1605
0
    PyObject *annotate;
1606
0
    if (PyDict_GetItemRef(dict, &_Py_ID(__annotate__), &annotate) == 0) {
1607
0
        annotate = Py_None;
1608
0
        if (PyDict_SetItem(dict, &_Py_ID(__annotate__), annotate) == -1) {
1609
0
            Py_CLEAR(annotate);
1610
0
        }
1611
0
    }
1612
0
    Py_DECREF(dict);
1613
0
    return annotate;
1614
0
}
1615
1616
static int
1617
module_set_annotate(PyObject *self, PyObject *value, void *Py_UNUSED(ignored))
1618
0
{
1619
0
    PyModuleObject *m = _PyModule_CAST(self);
1620
0
    if (value == NULL) {
1621
0
        PyErr_SetString(PyExc_TypeError, "cannot delete __annotate__ attribute");
1622
0
        return -1;
1623
0
    }
1624
1625
0
    PyObject *dict = module_load_dict(m);
1626
0
    if (dict == NULL) {
1627
0
        return -1;
1628
0
    }
1629
1630
0
    if (!Py_IsNone(value) && !PyCallable_Check(value)) {
1631
0
        PyErr_SetString(PyExc_TypeError, "__annotate__ must be callable or None");
1632
0
        Py_DECREF(dict);
1633
0
        return -1;
1634
0
    }
1635
1636
0
    if (PyDict_SetItem(dict, &_Py_ID(__annotate__), value) == -1) {
1637
0
        Py_DECREF(dict);
1638
0
        return -1;
1639
0
    }
1640
0
    if (!Py_IsNone(value)) {
1641
0
        if (PyDict_Pop(dict, &_Py_ID(__annotations__), NULL) == -1) {
1642
0
            Py_DECREF(dict);
1643
0
            return -1;
1644
0
        }
1645
0
    }
1646
0
    Py_DECREF(dict);
1647
0
    return 0;
1648
0
}
1649
1650
static PyObject *
1651
module_get_annotations(PyObject *self, void *Py_UNUSED(ignored))
1652
0
{
1653
0
    PyModuleObject *m = _PyModule_CAST(self);
1654
1655
0
    PyObject *dict = module_load_dict(m);
1656
0
    if (dict == NULL) {
1657
0
        return NULL;
1658
0
    }
1659
1660
0
    PyObject *annotations;
1661
0
    if (PyDict_GetItemRef(dict, &_Py_ID(__annotations__), &annotations) == 0) {
1662
0
        PyObject *spec;
1663
0
        if (PyDict_GetItemRef(m->md_dict, &_Py_ID(__spec__), &spec) < 0) {
1664
0
            Py_DECREF(dict);
1665
0
            return NULL;
1666
0
        }
1667
0
        bool is_initializing = false;
1668
0
        if (spec != NULL) {
1669
0
            int rc = _PyModuleSpec_IsInitializing(spec);
1670
0
            if (rc < 0) {
1671
0
                Py_DECREF(spec);
1672
0
                Py_DECREF(dict);
1673
0
                return NULL;
1674
0
            }
1675
0
            Py_DECREF(spec);
1676
0
            if (rc) {
1677
0
                is_initializing = true;
1678
0
            }
1679
0
        }
1680
1681
0
        PyObject *annotate;
1682
0
        int annotate_result = PyDict_GetItemRef(dict, &_Py_ID(__annotate__), &annotate);
1683
0
        if (annotate_result < 0) {
1684
0
            Py_DECREF(dict);
1685
0
            return NULL;
1686
0
        }
1687
0
        if (annotate_result == 1 && PyCallable_Check(annotate)) {
1688
0
            PyObject *one = _PyLong_GetOne();
1689
0
            annotations = _PyObject_CallOneArg(annotate, one);
1690
0
            if (annotations == NULL) {
1691
0
                Py_DECREF(annotate);
1692
0
                Py_DECREF(dict);
1693
0
                return NULL;
1694
0
            }
1695
0
            if (!PyDict_Check(annotations)) {
1696
0
                PyErr_Format(PyExc_TypeError,
1697
0
                             "__annotate__() must return a dict, not %T",
1698
0
                             annotations);
1699
0
                Py_DECREF(annotate);
1700
0
                Py_DECREF(annotations);
1701
0
                Py_DECREF(dict);
1702
0
                return NULL;
1703
0
            }
1704
0
        }
1705
0
        else {
1706
0
            annotations = PyDict_New();
1707
0
        }
1708
0
        Py_XDECREF(annotate);
1709
        // Do not cache annotations if the module is still initializing
1710
0
        if (annotations && !is_initializing) {
1711
0
            int result = PyDict_SetItem(
1712
0
                    dict, &_Py_ID(__annotations__), annotations);
1713
0
            if (result) {
1714
0
                Py_CLEAR(annotations);
1715
0
            }
1716
0
        }
1717
0
    }
1718
0
    Py_DECREF(dict);
1719
0
    return annotations;
1720
0
}
1721
1722
static int
1723
module_set_annotations(PyObject *self, PyObject *value, void *Py_UNUSED(ignored))
1724
0
{
1725
0
    PyModuleObject *m = _PyModule_CAST(self);
1726
1727
0
    PyObject *dict = module_load_dict(m);
1728
0
    if (dict == NULL) {
1729
0
        return -1;
1730
0
    }
1731
1732
0
    int ret = -1;
1733
0
    if (value != NULL) {
1734
        /* set */
1735
0
        ret = PyDict_SetItem(dict, &_Py_ID(__annotations__), value);
1736
0
    }
1737
0
    else {
1738
        /* delete */
1739
0
        ret = PyDict_Pop(dict, &_Py_ID(__annotations__), NULL);
1740
0
        if (ret == 0) {
1741
0
            PyErr_SetObject(PyExc_AttributeError, &_Py_ID(__annotations__));
1742
0
            ret = -1;
1743
0
        }
1744
0
        else if (ret > 0) {
1745
0
            ret = 0;
1746
0
        }
1747
0
    }
1748
0
    if (ret == 0 && PyDict_Pop(dict, &_Py_ID(__annotate__), NULL) < 0) {
1749
0
        ret = -1;
1750
0
    }
1751
1752
0
    Py_DECREF(dict);
1753
0
    return ret;
1754
0
}
1755
1756
static PyGetSetDef module_getsets[] = {
1757
    {"__annotations__", module_get_annotations, module_set_annotations},
1758
    {"__annotate__", module_get_annotate, module_set_annotate},
1759
    {NULL}
1760
};
1761
1762
PyTypeObject PyModule_Type = {
1763
    PyVarObject_HEAD_INIT(&PyType_Type, 0)
1764
    "module",                                   /* tp_name */
1765
    sizeof(PyModuleObject),                     /* tp_basicsize */
1766
    0,                                          /* tp_itemsize */
1767
    module_dealloc,                             /* tp_dealloc */
1768
    0,                                          /* tp_vectorcall_offset */
1769
    0,                                          /* tp_getattr */
1770
    0,                                          /* tp_setattr */
1771
    0,                                          /* tp_as_async */
1772
    module_repr,                                /* tp_repr */
1773
    0,                                          /* tp_as_number */
1774
    0,                                          /* tp_as_sequence */
1775
    0,                                          /* tp_as_mapping */
1776
    0,                                          /* tp_hash */
1777
    0,                                          /* tp_call */
1778
    0,                                          /* tp_str */
1779
    _Py_module_getattro,                        /* tp_getattro */
1780
    PyObject_GenericSetAttr,                    /* tp_setattro */
1781
    0,                                          /* tp_as_buffer */
1782
    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
1783
        Py_TPFLAGS_BASETYPE,                    /* tp_flags */
1784
    module___init____doc__,                     /* tp_doc */
1785
    module_traverse,                            /* tp_traverse */
1786
    module_clear,                               /* tp_clear */
1787
    0,                                          /* tp_richcompare */
1788
    offsetof(PyModuleObject, md_weaklist),      /* tp_weaklistoffset */
1789
    0,                                          /* tp_iter */
1790
    0,                                          /* tp_iternext */
1791
    module_methods,                             /* tp_methods */
1792
    module_members,                             /* tp_members */
1793
    module_getsets,                             /* tp_getset */
1794
    0,                                          /* tp_base */
1795
    0,                                          /* tp_dict */
1796
    0,                                          /* tp_descr_get */
1797
    0,                                          /* tp_descr_set */
1798
    offsetof(PyModuleObject, md_dict),          /* tp_dictoffset */
1799
    module___init__,                            /* tp_init */
1800
    0,                                          /* tp_alloc */
1801
    new_module,                                 /* tp_new */
1802
    PyObject_GC_Del,                            /* tp_free */
1803
};