Coverage Report

Created: 2026-10-17 06:15

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" // PyLazyImport_CheckExact()
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
302k
    (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
149k
{
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
149k
}
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.06k
{
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.06k
    assert(PyModuleDef_Type.tp_flags & Py_TPFLAGS_READY);
138
2.06k
    if (def->m_base.m_index == 0) {
139
1.10k
        Py_SET_REFCNT(def, 1);
140
1.10k
        Py_SET_TYPE(def, &PyModuleDef_Type);
141
1.10k
        def->m_base.m_index = _PyImport_GetNextModuleIndex();
142
1.10k
    }
143
2.06k
    return (PyObject*)def;
144
2.06k
}
145
146
static int
147
module_init_dict(PyModuleObject *mod, PyObject *md_dict,
148
                 PyObject *name, PyObject *doc)
149
7.54k
{
150
7.54k
    assert(md_dict != NULL);
151
7.54k
    if (doc == NULL)
152
1.28k
        doc = Py_None;
153
154
7.54k
    if (PyDict_SetItem(md_dict, &_Py_ID(__name__), name) != 0)
155
0
        return -1;
156
7.54k
    if (PyDict_SetItem(md_dict, &_Py_ID(__doc__), doc) != 0)
157
0
        return -1;
158
7.54k
    if (PyDict_SetItem(md_dict, &_Py_ID(__package__), Py_None) != 0)
159
0
        return -1;
160
7.54k
    if (PyDict_SetItem(md_dict, &_Py_ID(__loader__), Py_None) != 0)
161
0
        return -1;
162
7.54k
    if (PyDict_SetItem(md_dict, &_Py_ID(__spec__), Py_None) != 0)
163
0
        return -1;
164
7.54k
    if (PyUnicode_CheckExact(name)) {
165
7.54k
        Py_XSETREF(mod->md_name, Py_NewRef(name));
166
7.54k
    }
167
168
7.54k
    return 0;
169
7.54k
}
170
171
static PyModuleObject *
172
new_module_notrack(PyTypeObject *mt)
173
7.54k
{
174
7.54k
    PyModuleObject *m;
175
7.54k
    m = (PyModuleObject *)_PyType_AllocNoTrack(mt, 0);
176
7.54k
    if (m == NULL)
177
0
        return NULL;
178
7.54k
    m->md_state = NULL;
179
7.54k
    m->md_weaklist = NULL;
180
7.54k
    m->md_name = NULL;
181
7.54k
    m->md_token_is_def = false;
182
#ifdef Py_GIL_DISABLED
183
    m->md_requires_gil = true;
184
#endif
185
7.54k
    m->md_state_size = 0;
186
7.54k
    m->md_state_traverse = NULL;
187
7.54k
    m->md_state_clear = NULL;
188
7.54k
    m->md_state_free = NULL;
189
7.54k
    m->md_exec = NULL;
190
7.54k
    m->md_token = NULL;
191
7.54k
    m->md_dict = PyDict_New();
192
7.54k
    if (m->md_dict == NULL) {
193
0
        Py_DECREF(m);
194
0
        return NULL;
195
0
    }
196
7.54k
    return m;
197
7.54k
}
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
310k
{
207
310k
    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
310k
    if (event == PyDict_EVENT_MODIFIED &&
211
80.8k
        new_value != NULL &&
212
80.8k
        PyLazyImport_CheckExact(new_value)) {
213
0
        _PyDict_ClearKeysVersionLockHeld(dict);
214
0
    }
215
310k
    return 0;
216
310k
}
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
7.54k
{
230
7.54k
    _PyDict_EnablePerThreadRefcounting(m->md_dict);
231
7.54k
    _PyObject_SetDeferredRefcount((PyObject *)m);
232
7.54k
    PyDict_Watch(MODULE_WATCHER_ID, m->md_dict);
233
7.54k
    PyObject_GC_Track(m);
234
7.54k
}
235
236
static PyObject *
237
new_module(PyTypeObject *mt, PyObject *args, PyObject *kws)
238
6.26k
{
239
6.26k
    PyModuleObject *m = new_module_notrack(mt);
240
6.26k
    if (m != NULL) {
241
6.26k
        track_module(m);
242
6.26k
    }
243
6.26k
    return (PyObject *)m;
244
6.26k
}
245
246
PyObject *
247
PyModule_NewObject(PyObject *name)
248
1.28k
{
249
1.28k
    PyModuleObject *m = new_module_notrack(&PyModule_Type);
250
1.28k
    if (m == NULL)
251
0
        return NULL;
252
1.28k
    if (module_init_dict(m, m->md_dict, name, NULL) != 0)
253
0
        goto fail;
254
1.28k
    track_module(m);
255
1.28k
    return (PyObject *)m;
256
257
0
 fail:
258
0
    Py_DECREF(m);
259
0
    return NULL;
260
1.28k
}
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.12k
{
281
1.12k
    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.12k
    return 1;
292
1.12k
}
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.4k
        if ((fdef->ml_flags & METH_CLASS) ||
302
21.4k
            (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.4k
        func = PyCFunction_NewEx(fdef, (PyObject*)module, name);
309
21.4k
        if (func == NULL) {
310
0
            return -1;
311
0
        }
312
21.4k
        _PyObject_SetDeferredRefcount(func);
313
21.4k
        if (PyObject_SetAttrString(module, fdef->ml_name, func) != 0) {
314
0
            Py_DECREF(func);
315
0
            return -1;
316
0
        }
317
21.4k
        Py_DECREF(func);
318
21.4k
    }
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.12k
{
339
1.12k
    md->md_state_size = def_like->m_size;
340
1.12k
    md->md_state_traverse = def_like->m_traverse;
341
1.12k
    md->md_state_clear = def_like->m_clear;
342
1.12k
    md->md_state_free = def_like->m_free;
343
1.12k
}
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
976
{
409
976
    createfunc_t create = NULL;
410
976
    PyObject *nameobj;
411
976
    PyObject *m = NULL;
412
976
    uint64_t multiple_interpreters = (uint64_t)Py_MOD_MULTIPLE_INTERPRETERS_SUPPORTED;
413
976
    bool requires_gil = true;
414
976
    const char *name;
415
976
    int ret;
416
976
    void *token = NULL;
417
976
    _Py_modexecfunc m_exec = NULL;
418
976
    PyInterpreterState *interp = _PyInterpreterState_GET();
419
420
976
    nameobj = PyObject_GetAttrString(spec, "name");
421
976
    if (nameobj == NULL) {
422
0
        return NULL;
423
0
    }
424
976
    name = PyUnicode_AsUTF8(nameobj);
425
976
    if (name == NULL) {
426
0
        goto error;
427
0
    }
428
429
976
    if (!check_api_version(name, module_api_version)) {
430
0
        goto error;
431
0
    }
432
433
976
    _PySlotIterator it;
434
435
976
    PyModuleDef _dummy_def = {0};
436
976
    PyModuleDef *def_like;
437
976
    if (slots) {
438
16
        assert(!original_def);
439
16
        def_like = &_dummy_def;
440
16
         _PySlotIterator_Init(&it, slots, _PySlot_KIND_MOD);
441
16
    }
442
960
    else {
443
960
        assert(original_def);
444
960
        def_like = original_def;
445
960
         _PySlotIterator_InitLegacy(&it, def_like->m_slots, _PySlot_KIND_MOD);
446
960
    }
447
976
    it.name = name;
448
449
4.83k
    while (_PySlotIterator_Next(&it)) {
450
3.85k
        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
989
            case Py_mod_exec:
457
989
                if (!original_def) {
458
16
                    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
16
                    m_exec = (_Py_modexecfunc)it.current.sl_func;
466
16
                }
467
989
                break;
468
989
            case Py_mod_multiple_interpreters:
469
960
                multiple_interpreters = it.current.sl_uint64;
470
960
                break;
471
976
            case Py_mod_gil:
472
976
                {
473
976
                    uint64_t val = it.current.sl_uint64;
474
976
                    requires_gil = (val != (uint64_t)Py_MOD_GIL_NOT_USED);
475
976
                }
476
976
                break;
477
898
            case Py_mod_abi:
478
898
                if (PyABIInfo_Check(it.current.sl_ptr, name) < 0) {
479
0
                    goto error;
480
0
                }
481
898
                break;
482
898
            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
32
            case SLOT:                                                      \
496
32
                do {                                                        \
497
32
                    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
32
                    (def_like->MEMBER) = (TYPE)it.current.SL_MEMBER;        \
510
32
                } while (0);                                                \
511
32
                break;                                                      \
512
            /////////////////////////////////////////////////////////////////
513
16
            DEF_SLOT_CASE(Py_mod_name, char*, sl_ptr, m_name)
514
16
            DEF_SLOT_CASE(Py_mod_doc, char*, sl_ptr, m_doc)
515
16
            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.85k
            DEF_SLOT_CASE(Py_mod_state_free, freefunc, sl_func, m_free)
521
3.85k
#undef DEF_SLOT_CASE
522
3.85k
        }
523
3.85k
    }
524
976
    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
976
    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
976
    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
976
    else if (multiple_interpreters != (int64_t)(intptr_t)Py_MOD_PER_INTERPRETER_GIL_SUPPORTED
567
16
             && interp->ceval.own_gil
568
16
             && !_Py_IsMainInterpreter(interp)
569
0
             && _PyImport_CheckSubinterpIncompatibleExtensionAllowed(name) < 0)
570
0
    {
571
0
        goto error;
572
0
    }
573
574
976
    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
976
    } else {
594
976
        m = PyModule_NewObject(nameobj);
595
976
        if (m == NULL) {
596
0
            goto error;
597
0
        }
598
976
    }
599
600
976
    if (PyModule_Check(m)) {
601
976
        PyModuleObject *mod = (PyModuleObject*)m;
602
976
        mod->md_state = NULL;
603
976
        module_copy_members_from_deflike(mod, def_like);
604
976
        if (original_def) {
605
960
            assert (!token || token == original_def);
606
960
            mod->md_token = original_def;
607
960
            mod->md_token_is_def = 1;
608
960
        }
609
16
        else {
610
16
            mod->md_token = token;
611
16
        }
612
#ifdef Py_GIL_DISABLED
613
        mod->md_requires_gil = requires_gil;
614
#else
615
976
        (void)requires_gil;
616
976
#endif
617
976
        mod->md_exec = m_exec;
618
976
    } 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
976
    if (def_like->m_methods != NULL) {
647
905
        ret = _add_methods_to_object(m, nameobj, def_like->m_methods);
648
905
        if (ret != 0) {
649
0
            goto error;
650
0
        }
651
905
    }
652
653
976
    if (def_like->m_doc != NULL) {
654
855
        ret = PyModule_SetDocString(m, def_like->m_doc);
655
855
        if (ret != 0) {
656
0
            goto error;
657
0
        }
658
855
    }
659
660
976
    Py_DECREF(nameobj);
661
976
    return m;
662
663
0
error:
664
0
    Py_DECREF(nameobj);
665
0
    Py_XDECREF(m);
666
0
    return NULL;
667
976
}
668
669
PyObject *
670
PyModule_FromDefAndSpec2(PyModuleDef* def, PyObject *spec, int module_api_version)
671
960
{
672
960
    PyModuleDef_Init(def);
673
960
    return module_from_slots_and_spec(NULL, spec, module_api_version, def);
674
960
}
675
676
PyObject *
677
PyModule_FromSlotsAndSpec(const PySlot *slots, PyObject *spec)
678
16
{
679
16
    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
16
    return module_from_slots_and_spec(slots, spec, PYTHON_API_VERSION,
687
16
                                      NULL);
688
16
}
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
989
{
707
989
    int ret = exec(module);
708
989
    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
989
    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
989
    return 0;
725
989
}
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
976
            md->md_state = PyMem_Malloc(md->md_state_size);
741
976
            if (!md->md_state) {
742
0
                PyErr_NoMemory();
743
0
                return -1;
744
0
            }
745
976
            memset(md->md_state, 0, md->md_state_size);
746
976
        }
747
1.93k
    }
748
1.93k
    return 0;
749
1.93k
}
750
751
int
752
PyModule_Exec(PyObject *module)
753
976
{
754
976
    if (alloc_state(module) < 0) {
755
0
        return -1;
756
0
    }
757
976
    PyModuleObject *md = (PyModuleObject*)module;
758
976
    if (md->md_exec) {
759
16
        assert(!md->md_token_is_def);
760
16
        return run_exec_func(module, md->md_exec);
761
16
    }
762
763
960
    PyModuleDef *def = _PyModule_GetDefOrNull(module);
764
960
    if (def) {
765
960
        return PyModule_ExecDef(module, def);
766
960
    }
767
0
    return 0;
768
960
}
769
770
int
771
PyModule_ExecDef(PyObject *module, PyModuleDef *def)
772
960
{
773
960
    if (alloc_state(module) < 0) {
774
0
        return -1;
775
0
    }
776
777
960
    assert(PyModule_Check(module));
778
779
960
    if (def->m_slots == NULL) {
780
0
        return 0;
781
0
    }
782
783
960
    _PySlotIterator it;
784
960
    _PySlotIterator_InitLegacy(&it, def->m_slots, _PySlot_KIND_MOD);
785
4.73k
    while (_PySlotIterator_Next(&it)) {
786
3.77k
        _Py_modexecfunc func;
787
3.77k
        switch (it.current.sl_id) {
788
0
            case Py_slot_invalid:
789
0
                return -1;
790
973
            case Py_mod_exec:
791
973
                func = (_Py_modexecfunc)it.current.sl_func;
792
973
                if (run_exec_func(module, func) < 0) {
793
0
                    return -1;
794
0
                }
795
973
                break;
796
3.77k
        }
797
3.77k
    }
798
960
    return 0;
799
960
}
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
966
{
818
966
    PyObject *v;
819
820
966
    v = PyUnicode_FromString(doc);
821
966
    if (v == NULL || PyObject_SetAttr(m, &_Py_ID(__doc__), v) != 0) {
822
0
        Py_XDECREF(v);
823
0
        return -1;
824
0
    }
825
966
    Py_DECREF(v);
826
966
    return 0;
827
966
}
828
829
PyObject *
830
PyModule_GetDict(PyObject *m)
831
22.1k
{
832
22.1k
    if (!PyModule_Check(m)) {
833
0
        PyErr_BadInternalCall();
834
0
        return NULL;
835
0
    }
836
22.1k
    return _PyModule_GetDict(m);  // borrowed reference
837
22.1k
}
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
204
{
878
204
    if (!PyModule_Check(mod)) {
879
0
        PyErr_BadArgument();
880
0
        return NULL;
881
0
    }
882
204
    PyObject *dict = ((PyModuleObject *)mod)->md_dict;  // borrowed reference
883
204
    if (dict == NULL || !PyDict_Check(dict)) {
884
0
        goto error;
885
0
    }
886
204
    PyObject *name;
887
204
    if (PyDict_GetItemRef(dict, &_Py_ID(__name__), &name) <= 0) {
888
        // error or not found
889
0
        goto error;
890
0
    }
891
204
    if (!PyUnicode_Check(name)) {
892
0
        Py_DECREF(name);
893
0
        goto error;
894
0
    }
895
204
    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
204
}
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
32
{
919
    // We return None to indicate "not found" or "bogus".
920
32
    if (!PyModule_Check(mod)) {
921
0
        PyErr_BadArgument();
922
0
        return NULL;
923
0
    }
924
32
    PyObject *dict = ((PyModuleObject *)mod)->md_dict;  // borrowed reference
925
32
    if (dict == NULL) {
926
        // The module has been tampered with.
927
0
        Py_RETURN_NONE;
928
0
    }
929
32
    PyObject *fileobj;
930
32
    int res = PyDict_GetItemRef(dict, &_Py_ID(__file__), &fileobj);
931
32
    if (res < 0) {
932
0
        return NULL;
933
0
    }
934
32
    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
6
    if (!PyUnicode_Check(fileobj)) {
944
0
        Py_DECREF(fileobj);
945
0
        Py_RETURN_NONE;
946
0
    }
947
6
    return fileobj;
948
6
}
949
950
PyObject*
951
PyModule_GetFilenameObject(PyObject *mod)
952
32
{
953
32
    PyObject *fileobj = _PyModule_GetFilenameObject(mod);
954
32
    if (fileobj == NULL) {
955
0
        return NULL;
956
0
    }
957
32
    if (fileobj == Py_None) {
958
26
        PyErr_SetString(PyExc_SystemError, "module filename missing");
959
26
        return NULL;
960
26
    }
961
6
    return fileobj;
962
32
}
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
43.1M
{
1030
43.1M
    if (!PyModule_Check(m)) {
1031
0
        PyErr_BadArgument();
1032
0
        return NULL;
1033
0
    }
1034
43.1M
    return _PyModule_GetState(m);
1035
43.1M
}
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
6.26k
{
1132
6.26k
    return module_init_dict(self, self->md_dict, name, doc);
1133
6.26k
}
1134
1135
static void
1136
module_dealloc(PyObject *self)
1137
3.64k
{
1138
3.64k
    PyModuleObject *m = _PyModule_CAST(self);
1139
1140
3.64k
    PyObject_GC_UnTrack(m);
1141
1142
3.64k
    int verbose = _Py_GetConfig()->verbose;
1143
3.64k
    if (verbose && m->md_name) {
1144
0
        PySys_FormatStderr("# destroy %U\n", m->md_name);
1145
0
    }
1146
3.64k
    FT_CLEAR_WEAKREFS(self, m->md_weaklist);
1147
1148
3.64k
    assert_def_missing_or_redundant(m);
1149
    /* bpo-39824: Don't call m_free() if m_size > 0 and md_state=NULL */
1150
3.64k
    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
3.64k
    Py_XDECREF(m->md_dict);
1156
3.64k
    Py_XDECREF(m->md_name);
1157
3.64k
    if (m->md_state != NULL) {
1158
0
        PyMem_Free(m->md_state);
1159
0
    }
1160
3.64k
    Py_TYPE(m)->tp_free((PyObject *)m);
1161
3.64k
}
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
3.81M
{
1176
3.81M
    if (spec == NULL) {
1177
0
        return 0;
1178
0
    }
1179
3.81M
    PyObject *value;
1180
3.81M
    int rc = PyObject_GetOptionalAttr(spec, &_Py_ID(_initializing), &value);
1181
3.81M
    if (rc > 0) {
1182
3.59M
        rc = PyObject_IsTrue(value);
1183
3.59M
        Py_DECREF(value);
1184
3.59M
    }
1185
3.81M
    return rc;
1186
3.81M
}
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.52k
{
1194
2.52k
    if (spec == NULL) {
1195
0
         return 0;
1196
0
    }
1197
1198
2.52k
    PyObject *value;
1199
2.52k
    int rc = PyObject_GetOptionalAttr(spec, &_Py_ID(_uninitialized_submodules), &value);
1200
2.52k
    if (rc > 0) {
1201
2.14k
        rc = PySequence_Contains(value, name);
1202
2.14k
        Py_DECREF(value);
1203
2.14k
    }
1204
2.52k
    return rc;
1205
2.52k
}
1206
1207
int
1208
_PyModuleSpec_GetFileOrigin(PyObject *spec, PyObject **p_origin)
1209
2.55k
{
1210
2.55k
    PyObject *has_location = NULL;
1211
2.55k
    int rc = PyObject_GetOptionalAttr(spec, &_Py_ID(has_location), &has_location);
1212
2.55k
    if (rc <= 0) {
1213
382
        return rc;
1214
382
    }
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.17k
    rc = PyObject_IsTrue(has_location);
1219
2.17k
    Py_DECREF(has_location);
1220
2.17k
    if (rc <= 0) {
1221
111
        return rc;
1222
111
    }
1223
    // has_location is true, so origin is a location
1224
2.06k
    PyObject *origin = NULL;
1225
2.06k
    rc = PyObject_GetOptionalAttr(spec, &_Py_ID(origin), &origin);
1226
2.06k
    if (rc <= 0) {
1227
0
        return rc;
1228
0
    }
1229
2.06k
    assert(origin != NULL);
1230
2.06k
    if (!PyUnicode_Check(origin)) {
1231
0
        Py_DECREF(origin);
1232
0
        return 0;
1233
0
    }
1234
2.06k
    *p_origin = origin;
1235
2.06k
    return 1;
1236
2.06k
}
1237
1238
int
1239
_PyModule_IsPossiblyShadowing(PyObject *origin)
1240
2.55k
{
1241
2.55k
    int result = 0;
1242
2.55k
    wchar_t *root = NULL;
1243
2.55k
    wchar_t *sys_path_0_buf = NULL;
1244
1245
    // origin must be a unicode subtype
1246
    // Returns 1 if the module at origin could be shadowing a module of the
1247
    // same name later in the module search path. The condition we check is basically:
1248
    // root = os.path.dirname(origin.removesuffix(os.sep + "__init__.py"))
1249
    // return not sys.flags.safe_path and root == (sys.path[0] or os.getcwd())
1250
    // Returns 0 otherwise (or if we aren't sure)
1251
    // Returns -1 if an error occurred that should be propagated
1252
2.55k
    if (origin == NULL) {
1253
493
        return 0;
1254
493
    }
1255
1256
    // not sys.flags.safe_path
1257
2.06k
    const PyConfig *config = _Py_GetConfig();
1258
2.06k
    if (config->safe_path) {
1259
0
        return 0;
1260
0
    }
1261
1262
    // root = os.path.dirname(origin.removesuffix(os.sep + "__init__.py"))
1263
2.06k
    root = PyUnicode_AsWideCharString(origin, NULL);
1264
2.06k
    if (root == NULL) {
1265
0
        return -1;
1266
0
    }
1267
1268
2.06k
    wchar_t *sep = wcsrchr(root, SEP);
1269
2.06k
    if (sep == NULL) {
1270
0
        goto done;
1271
0
    }
1272
    // If it's a package then we need to look one directory further up
1273
2.06k
    if (wcscmp(sep + 1, L"__init__.py") == 0) {
1274
0
        *sep = L'\0';
1275
0
        sep = wcsrchr(root, SEP);
1276
0
        if (sep == NULL) {
1277
0
            goto done;
1278
0
        }
1279
0
    }
1280
2.06k
    *sep = L'\0';
1281
1282
    // sys.path[0] or os.getcwd()
1283
2.06k
    wchar_t *sys_path_0 = config->sys_path_0;
1284
2.06k
    if (!sys_path_0) {
1285
2.06k
        goto done;
1286
2.06k
    }
1287
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
        sys_path_0_buf = PyMem_Malloc(MAXPATHLEN * sizeof(wchar_t));
1291
0
        if (sys_path_0_buf == NULL) {
1292
0
            PyErr_NoMemory();
1293
0
            result = -1;
1294
0
            goto done;
1295
0
        }
1296
0
        if (!_Py_wgetcwd(sys_path_0_buf, MAXPATHLEN)) {
1297
            // If we failed to getcwd, don't raise an exception and instead
1298
            // let the caller proceed assuming no shadowing
1299
0
            goto done;
1300
0
        }
1301
0
        sys_path_0 = sys_path_0_buf;
1302
0
    }
1303
1304
0
    result = (wcscmp(sys_path_0, root) == 0);
1305
1306
2.06k
done:
1307
2.06k
    PyMem_Free(root);
1308
2.06k
    PyMem_Free(sys_path_0_buf);
1309
2.06k
    return result;
1310
0
}
1311
1312
static int
1313
module_get_resolved_dict_item(PyObject *dict, PyObject *name, PyObject **result)
1314
683k
{
1315
683k
    int rc = PyDict_GetItemRef(dict, name, result);
1316
683k
    if (rc <= 0 || !PyLazyImport_CheckExact(*result)) {
1317
683k
        return rc;
1318
683k
    }
1319
0
    PyThreadState *tstate = PyThreadState_GET();
1320
0
    if (_PyLazyImport_IsResolving(tstate, *result)) {
1321
0
        Py_CLEAR(*result);
1322
0
        return 0;
1323
0
    }
1324
0
    PyObject *value = _PyLazyImport_Reify(tstate, *result, name, dict);
1325
0
    Py_SETREF(*result, value);
1326
0
    return value == NULL ? -1 : 1;
1327
0
}
1328
1329
PyObject*
1330
_Py_module_getattro_impl(PyModuleObject *m, PyObject *name, int suppress)
1331
6.30M
{
1332
    // When suppress=1, this function suppresses AttributeError.
1333
6.30M
    PyObject *attr, *mod_name, *getattr;
1334
6.30M
    attr = _PyObject_GenericGetAttrWithDict((PyObject *)m, name, NULL, suppress);
1335
6.30M
    if (attr == NULL) {
1336
683k
        if (suppress == 1) {
1337
681k
            if (PyErr_Occurred()) {
1338
                // pass up non-AttributeError exception
1339
0
                return NULL;
1340
0
            }
1341
681k
        }
1342
2.52k
        else {
1343
2.52k
            if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
1344
                // pass up non-AttributeError exception
1345
0
                return NULL;
1346
0
            }
1347
2.52k
            PyErr_Clear();
1348
2.52k
        }
1349
683k
        assert(m->md_dict != NULL);
1350
683k
        int recheck_dict;
1351
683k
        attr = _PyImport_TryLoadLazySubmodule((PyObject *)m, name, suppress,
1352
683k
                                             &recheck_dict);
1353
683k
        if (attr != NULL || PyErr_Occurred()) {
1354
0
            return attr;
1355
0
        }
1356
        // A concurrent load may have bound the child and removed its pending
1357
        // registration after our initial dictionary lookup.
1358
683k
        if (recheck_dict) {
1359
83
            if (Py_TYPE(m) != &PyModule_Type) {
1360
0
                PyObject *descr = _PyType_LookupRef(Py_TYPE(m), name);
1361
0
                if (descr != NULL) {
1362
                    // Preserve the fallback after a descriptor raised.
1363
0
                    recheck_dict = Py_TYPE(descr)->tp_descr_get == NULL;
1364
0
                    Py_DECREF(descr);
1365
0
                }
1366
0
            }
1367
83
            if (recheck_dict &&
1368
83
                PyDict_GetItemRef(m->md_dict, name, &attr) < 0) {
1369
0
                return NULL;
1370
0
            }
1371
83
        }
1372
683k
    }
1373
6.30M
    if (attr) {
1374
5.62M
        if (PyLazyImport_CheckExact(attr)) {
1375
0
            PyThreadState *tstate = PyThreadState_GET();
1376
0
            if (suppress && _PyLazyImport_IsResolving(tstate, attr)) {
1377
                // Only direct reentry means this attribute is unavailable.
1378
0
                Py_DECREF(attr);
1379
0
                return NULL;
1380
0
            }
1381
0
            PyObject *new_value = _PyLazyImport_Reify(
1382
0
                tstate, attr, name, m->md_dict);
1383
0
            Py_DECREF(attr);
1384
0
            return new_value;
1385
0
        }
1386
5.62M
        return attr;
1387
5.62M
    }
1388
683k
    if (module_get_resolved_dict_item(
1389
683k
            m->md_dict, &_Py_ID(__getattr__), &getattr) < 0) {
1390
0
        return NULL;
1391
0
    }
1392
683k
    if (getattr) {
1393
832
        PyObject *result = PyObject_CallOneArg(getattr, name);
1394
832
        if (result == NULL && suppress == 1 && PyErr_ExceptionMatches(PyExc_AttributeError)) {
1395
            // suppress AttributeError
1396
828
            PyErr_Clear();
1397
828
        }
1398
832
        Py_DECREF(getattr);
1399
832
        return result;
1400
832
    }
1401
1402
    // The attribute was not found.  We make a best effort attempt at a useful error message,
1403
    // but only if we're not suppressing AttributeError.
1404
682k
    if (suppress == 1) {
1405
680k
        return NULL;
1406
680k
    }
1407
2.52k
    if (PyDict_GetItemRef(m->md_dict, &_Py_ID(__name__), &mod_name) < 0) {
1408
0
        return NULL;
1409
0
    }
1410
2.52k
    if (!mod_name || !PyUnicode_Check(mod_name)) {
1411
0
        Py_XDECREF(mod_name);
1412
0
        PyErr_Format(PyExc_AttributeError,
1413
0
                    "module has no attribute '%U'", name);
1414
0
        return NULL;
1415
0
    }
1416
2.52k
    PyObject *spec;
1417
2.52k
    if (PyDict_GetItemRef(m->md_dict, &_Py_ID(__spec__), &spec) < 0) {
1418
0
        Py_DECREF(mod_name);
1419
0
        return NULL;
1420
0
    }
1421
2.52k
    if (spec == NULL) {
1422
0
        PyErr_Format(PyExc_AttributeError,
1423
0
                     "module '%U' has no attribute '%U'",
1424
0
                     mod_name, name);
1425
0
        Py_DECREF(mod_name);
1426
0
        return NULL;
1427
0
    }
1428
1429
2.52k
    PyObject *origin = NULL;
1430
2.52k
    if (_PyModuleSpec_GetFileOrigin(spec, &origin) < 0) {
1431
0
        goto done;
1432
0
    }
1433
1434
2.52k
    int is_possibly_shadowing = _PyModule_IsPossiblyShadowing(origin);
1435
2.52k
    if (is_possibly_shadowing < 0) {
1436
0
        goto done;
1437
0
    }
1438
2.52k
    int is_possibly_shadowing_stdlib = 0;
1439
2.52k
    if (is_possibly_shadowing) {
1440
0
        PyObject *stdlib_modules;
1441
0
        if (PySys_GetOptionalAttrString("stdlib_module_names", &stdlib_modules) < 0) {
1442
0
            goto done;
1443
0
        }
1444
0
        if (stdlib_modules && PyAnySet_Check(stdlib_modules)) {
1445
0
            is_possibly_shadowing_stdlib = PySet_Contains(stdlib_modules, mod_name);
1446
0
            if (is_possibly_shadowing_stdlib < 0) {
1447
0
                Py_DECREF(stdlib_modules);
1448
0
                goto done;
1449
0
            }
1450
0
        }
1451
0
        Py_XDECREF(stdlib_modules);
1452
0
    }
1453
1454
2.52k
    if (is_possibly_shadowing_stdlib) {
1455
0
        assert(origin);
1456
0
        PyErr_Format(PyExc_AttributeError,
1457
0
                    "module '%U' has no attribute '%U' "
1458
0
                    "(consider renaming '%U' since it has the same "
1459
0
                    "name as the standard library module named '%U' "
1460
0
                    "and prevents importing that standard library module)",
1461
0
                    mod_name, name, origin, mod_name);
1462
0
    }
1463
2.52k
    else {
1464
2.52k
        int rc = _PyModuleSpec_IsInitializing(spec);
1465
2.52k
        if (rc < 0) {
1466
0
            goto done;
1467
0
        }
1468
2.52k
        else if (rc > 0) {
1469
4
            if (is_possibly_shadowing) {
1470
0
                assert(origin);
1471
                // For non-stdlib modules, only mention the possibility of
1472
                // shadowing if the module is being initialized.
1473
0
                PyErr_Format(PyExc_AttributeError,
1474
0
                            "module '%U' has no attribute '%U' "
1475
0
                            "(consider renaming '%U' if it has the same name "
1476
0
                            "as a library you intended to import)",
1477
0
                            mod_name, name, origin);
1478
0
            }
1479
4
            else if (origin) {
1480
4
                PyErr_Format(PyExc_AttributeError,
1481
4
                            "partially initialized "
1482
4
                            "module '%U' from '%U' has no attribute '%U' "
1483
4
                            "(most likely due to a circular import)",
1484
4
                            mod_name, origin, name);
1485
4
            }
1486
0
            else {
1487
0
                PyErr_Format(PyExc_AttributeError,
1488
0
                            "partially initialized "
1489
0
                            "module '%U' has no attribute '%U' "
1490
0
                            "(most likely due to a circular import)",
1491
0
                            mod_name, name);
1492
0
            }
1493
4
        }
1494
2.52k
        else {
1495
2.52k
            assert(rc == 0);
1496
2.52k
            rc = _PyModuleSpec_IsUninitializedSubmodule(spec, name);
1497
2.52k
            if (rc > 0) {
1498
0
                PyErr_Format(PyExc_AttributeError,
1499
0
                            "cannot access submodule '%U' of module '%U' "
1500
0
                            "(most likely due to a circular import)",
1501
0
                            name, mod_name);
1502
0
            }
1503
2.52k
            else if (rc == 0) {
1504
2.52k
                PyErr_Format(PyExc_AttributeError,
1505
2.52k
                            "module '%U' has no attribute '%U'",
1506
2.52k
                            mod_name, name);
1507
2.52k
            }
1508
2.52k
        }
1509
2.52k
    }
1510
1511
2.52k
done:
1512
2.52k
    Py_XDECREF(origin);
1513
2.52k
    Py_DECREF(spec);
1514
2.52k
    Py_DECREF(mod_name);
1515
2.52k
    return NULL;
1516
2.52k
}
1517
1518
1519
PyObject*
1520
_Py_module_getattro(PyObject *self, PyObject *name)
1521
152k
{
1522
152k
    PyModuleObject *m = _PyModule_CAST(self);
1523
152k
    return _Py_module_getattro_impl(m, name, 0);
1524
152k
}
1525
1526
static int
1527
module_traverse(PyObject *self, visitproc visit, void *arg)
1528
145k
{
1529
145k
    PyModuleObject *m = _PyModule_CAST(self);
1530
1531
145k
    assert_def_missing_or_redundant(m);
1532
    /* bpo-39824: Don't call m_traverse() if m_size > 0 and md_state=NULL */
1533
145k
    if (m->md_state_traverse && (m->md_state_size <= 0 || m->md_state != NULL))
1534
22.1k
    {
1535
22.1k
        int res = m->md_state_traverse((PyObject*)m, visit, arg);
1536
22.1k
        if (res)
1537
0
            return res;
1538
22.1k
    }
1539
1540
145k
    Py_VISIT(m->md_dict);
1541
145k
    return 0;
1542
145k
}
1543
1544
static int
1545
module_clear(PyObject *self)
1546
0
{
1547
0
    PyModuleObject *m = _PyModule_CAST(self);
1548
1549
0
    assert_def_missing_or_redundant(m);
1550
    /* bpo-39824: Don't call m_clear() if m_size > 0 and md_state=NULL */
1551
0
    if (m->md_state_clear && (m->md_state_size <= 0 || m->md_state != NULL))
1552
0
    {
1553
0
        int res = m->md_state_clear((PyObject*)m);
1554
0
        if (PyErr_Occurred()) {
1555
0
            PyErr_FormatUnraisable("Exception ignored in m_clear of module%s%V",
1556
0
                                   m->md_name ? " " : "",
1557
0
                                   m->md_name, "");
1558
0
        }
1559
0
        if (res) {
1560
0
            return res;
1561
0
        }
1562
0
    }
1563
0
    Py_CLEAR(m->md_dict);
1564
0
    return 0;
1565
0
}
1566
1567
static PyObject *
1568
module_dir(PyObject *self, PyObject *args)
1569
47
{
1570
47
    PyObject *result = NULL;
1571
47
    PyObject *dict;
1572
47
    if (PyModule_CheckExact(self)) {
1573
47
        dict = Py_NewRef(((PyModuleObject *)self)->md_dict);
1574
47
    } else {
1575
0
        dict = PyObject_GetAttr(self, &_Py_ID(__dict__));
1576
0
    }
1577
1578
47
    if (dict != NULL) {
1579
47
        if (PyDict_Check(dict)) {
1580
47
            PyObject *dirfunc;
1581
47
            int rc = module_get_resolved_dict_item(
1582
47
                dict, &_Py_ID(__dir__), &dirfunc);
1583
47
            if (rc > 0) {
1584
0
                result = _PyObject_CallNoArgs(dirfunc);
1585
0
                Py_DECREF(dirfunc);
1586
0
            }
1587
47
            else if (rc == 0) {
1588
47
                result = PyDict_Keys(dict);
1589
47
            }
1590
47
        }
1591
0
        else {
1592
0
            PyErr_Format(PyExc_TypeError, "<module>.__dict__ is not a dictionary");
1593
0
        }
1594
47
    }
1595
1596
47
    Py_XDECREF(dict);
1597
47
    return result;
1598
47
}
1599
1600
static PyMethodDef module_methods[] = {
1601
    {"__dir__", module_dir, METH_NOARGS,
1602
     PyDoc_STR("__dir__() -> list\nspecialized dir() implementation")},
1603
    {0}
1604
};
1605
1606
static PyObject *
1607
module_load_dict(PyModuleObject *m)
1608
0
{
1609
0
    PyObject *dict = PyObject_GetAttr((PyObject *)m, &_Py_ID(__dict__));
1610
0
    if (dict == NULL) {
1611
0
        return NULL;
1612
0
    }
1613
0
    if (!PyDict_Check(dict)) {
1614
0
        PyErr_Format(PyExc_TypeError, "<module>.__dict__ is not a dictionary");
1615
0
        Py_DECREF(dict);
1616
0
        return NULL;
1617
0
    }
1618
0
    return dict;
1619
0
}
1620
1621
static PyObject *
1622
module_get_annotate(PyObject *self, void *Py_UNUSED(ignored))
1623
0
{
1624
0
    PyModuleObject *m = _PyModule_CAST(self);
1625
1626
0
    PyObject *dict = module_load_dict(m);
1627
0
    if (dict == NULL) {
1628
0
        return NULL;
1629
0
    }
1630
1631
0
    PyObject *annotate;
1632
0
    if (PyDict_GetItemRef(dict, &_Py_ID(__annotate__), &annotate) == 0) {
1633
0
        annotate = Py_None;
1634
0
        if (PyDict_SetItem(dict, &_Py_ID(__annotate__), annotate) == -1) {
1635
0
            Py_CLEAR(annotate);
1636
0
        }
1637
0
    }
1638
0
    Py_DECREF(dict);
1639
0
    return annotate;
1640
0
}
1641
1642
static int
1643
module_set_annotate(PyObject *self, PyObject *value, void *Py_UNUSED(ignored))
1644
0
{
1645
0
    PyModuleObject *m = _PyModule_CAST(self);
1646
0
    if (value == NULL) {
1647
0
        PyErr_SetString(PyExc_TypeError, "cannot delete __annotate__ attribute");
1648
0
        return -1;
1649
0
    }
1650
1651
0
    PyObject *dict = module_load_dict(m);
1652
0
    if (dict == NULL) {
1653
0
        return -1;
1654
0
    }
1655
1656
0
    if (!Py_IsNone(value) && !PyCallable_Check(value)) {
1657
0
        PyErr_SetString(PyExc_TypeError, "__annotate__ must be callable or None");
1658
0
        Py_DECREF(dict);
1659
0
        return -1;
1660
0
    }
1661
1662
0
    if (PyDict_SetItem(dict, &_Py_ID(__annotate__), value) == -1) {
1663
0
        Py_DECREF(dict);
1664
0
        return -1;
1665
0
    }
1666
0
    if (!Py_IsNone(value)) {
1667
0
        if (PyDict_Pop(dict, &_Py_ID(__annotations__), NULL) == -1) {
1668
0
            Py_DECREF(dict);
1669
0
            return -1;
1670
0
        }
1671
0
    }
1672
0
    Py_DECREF(dict);
1673
0
    return 0;
1674
0
}
1675
1676
static PyObject *
1677
module_get_annotations(PyObject *self, void *Py_UNUSED(ignored))
1678
0
{
1679
0
    PyModuleObject *m = _PyModule_CAST(self);
1680
1681
0
    PyObject *dict = module_load_dict(m);
1682
0
    if (dict == NULL) {
1683
0
        return NULL;
1684
0
    }
1685
1686
0
    PyObject *annotations;
1687
0
    if (PyDict_GetItemRef(dict, &_Py_ID(__annotations__), &annotations) == 0) {
1688
0
        PyObject *spec;
1689
0
        if (PyDict_GetItemRef(m->md_dict, &_Py_ID(__spec__), &spec) < 0) {
1690
0
            Py_DECREF(dict);
1691
0
            return NULL;
1692
0
        }
1693
0
        bool is_initializing = false;
1694
0
        if (spec != NULL) {
1695
0
            int rc = _PyModuleSpec_IsInitializing(spec);
1696
0
            if (rc < 0) {
1697
0
                Py_DECREF(spec);
1698
0
                Py_DECREF(dict);
1699
0
                return NULL;
1700
0
            }
1701
0
            Py_DECREF(spec);
1702
0
            if (rc) {
1703
0
                is_initializing = true;
1704
0
            }
1705
0
        }
1706
1707
0
        PyObject *annotate;
1708
0
        int annotate_result = PyDict_GetItemRef(dict, &_Py_ID(__annotate__), &annotate);
1709
0
        if (annotate_result < 0) {
1710
0
            Py_DECREF(dict);
1711
0
            return NULL;
1712
0
        }
1713
0
        if (annotate_result == 1 && PyCallable_Check(annotate)) {
1714
0
            PyObject *one = _PyLong_GetOne();
1715
0
            annotations = _PyObject_CallOneArg(annotate, one);
1716
0
            if (annotations == NULL) {
1717
0
                Py_DECREF(annotate);
1718
0
                Py_DECREF(dict);
1719
0
                return NULL;
1720
0
            }
1721
0
            if (!PyDict_Check(annotations)) {
1722
0
                PyErr_Format(PyExc_TypeError,
1723
0
                             "__annotate__() must return a dict, not %T",
1724
0
                             annotations);
1725
0
                Py_DECREF(annotate);
1726
0
                Py_DECREF(annotations);
1727
0
                Py_DECREF(dict);
1728
0
                return NULL;
1729
0
            }
1730
0
        }
1731
0
        else {
1732
0
            annotations = PyDict_New();
1733
0
        }
1734
0
        Py_XDECREF(annotate);
1735
        // Do not cache annotations if the module is still initializing
1736
0
        if (annotations && !is_initializing) {
1737
0
            int result = PyDict_SetItem(
1738
0
                    dict, &_Py_ID(__annotations__), annotations);
1739
0
            if (result) {
1740
0
                Py_CLEAR(annotations);
1741
0
            }
1742
0
        }
1743
0
    }
1744
0
    Py_DECREF(dict);
1745
0
    return annotations;
1746
0
}
1747
1748
static int
1749
module_set_annotations(PyObject *self, PyObject *value, void *Py_UNUSED(ignored))
1750
0
{
1751
0
    PyModuleObject *m = _PyModule_CAST(self);
1752
1753
0
    PyObject *dict = module_load_dict(m);
1754
0
    if (dict == NULL) {
1755
0
        return -1;
1756
0
    }
1757
1758
0
    int ret = -1;
1759
0
    if (value != NULL) {
1760
        /* set */
1761
0
        ret = PyDict_SetItem(dict, &_Py_ID(__annotations__), value);
1762
0
    }
1763
0
    else {
1764
        /* delete */
1765
0
        ret = PyDict_Pop(dict, &_Py_ID(__annotations__), NULL);
1766
0
        if (ret == 0) {
1767
0
            PyErr_SetObject(PyExc_AttributeError, &_Py_ID(__annotations__));
1768
0
            ret = -1;
1769
0
        }
1770
0
        else if (ret > 0) {
1771
0
            ret = 0;
1772
0
        }
1773
0
    }
1774
0
    if (ret == 0 && PyDict_Pop(dict, &_Py_ID(__annotate__), NULL) < 0) {
1775
0
        ret = -1;
1776
0
    }
1777
1778
0
    Py_DECREF(dict);
1779
0
    return ret;
1780
0
}
1781
1782
static PyGetSetDef module_getsets[] = {
1783
    {"__annotations__", module_get_annotations, module_set_annotations},
1784
    {"__annotate__", module_get_annotate, module_set_annotate},
1785
    {NULL}
1786
};
1787
1788
PyTypeObject PyModule_Type = {
1789
    PyVarObject_HEAD_INIT(&PyType_Type, 0)
1790
    "module",                                   /* tp_name */
1791
    sizeof(PyModuleObject),                     /* tp_basicsize */
1792
    0,                                          /* tp_itemsize */
1793
    module_dealloc,                             /* tp_dealloc */
1794
    0,                                          /* tp_vectorcall_offset */
1795
    0,                                          /* tp_getattr */
1796
    0,                                          /* tp_setattr */
1797
    0,                                          /* tp_as_async */
1798
    module_repr,                                /* tp_repr */
1799
    0,                                          /* tp_as_number */
1800
    0,                                          /* tp_as_sequence */
1801
    0,                                          /* tp_as_mapping */
1802
    0,                                          /* tp_hash */
1803
    0,                                          /* tp_call */
1804
    0,                                          /* tp_str */
1805
    _Py_module_getattro,                        /* tp_getattro */
1806
    PyObject_GenericSetAttr,                    /* tp_setattro */
1807
    0,                                          /* tp_as_buffer */
1808
    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
1809
        Py_TPFLAGS_BASETYPE,                    /* tp_flags */
1810
    module___init____doc__,                     /* tp_doc */
1811
    module_traverse,                            /* tp_traverse */
1812
    module_clear,                               /* tp_clear */
1813
    0,                                          /* tp_richcompare */
1814
    offsetof(PyModuleObject, md_weaklist),      /* tp_weaklistoffset */
1815
    0,                                          /* tp_iter */
1816
    0,                                          /* tp_iternext */
1817
    module_methods,                             /* tp_methods */
1818
    module_members,                             /* tp_members */
1819
    module_getsets,                             /* tp_getset */
1820
    0,                                          /* tp_base */
1821
    0,                                          /* tp_dict */
1822
    0,                                          /* tp_descr_get */
1823
    0,                                          /* tp_descr_set */
1824
    offsetof(PyModuleObject, md_dict),          /* tp_dictoffset */
1825
    module___init__,                            /* tp_init */
1826
    0,                                          /* tp_alloc */
1827
    new_module,                                 /* tp_new */
1828
    PyObject_GC_Del,                            /* tp_free */
1829
};