Coverage Report

Created: 2026-10-31 06:21

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
305k
    (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
153k
{
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
153k
}
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.05k
{
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.05k
    assert(PyModuleDef_Type.tp_flags & Py_TPFLAGS_READY);
138
2.05k
    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.05k
    return (PyObject*)def;
144
2.05k
}
145
146
static int
147
module_init_dict(PyModuleObject *mod, PyObject *md_dict,
148
                 PyObject *name, PyObject *doc)
149
7.29k
{
150
7.29k
    assert(md_dict != NULL);
151
7.29k
    if (doc == NULL)
152
1.27k
        doc = Py_None;
153
154
7.29k
    if (PyDict_SetItem(md_dict, &_Py_ID(__name__), name) != 0)
155
0
        return -1;
156
7.29k
    if (PyDict_SetItem(md_dict, &_Py_ID(__doc__), doc) != 0)
157
0
        return -1;
158
7.29k
    if (PyDict_SetItem(md_dict, &_Py_ID(__package__), Py_None) != 0)
159
0
        return -1;
160
7.29k
    if (PyDict_SetItem(md_dict, &_Py_ID(__loader__), Py_None) != 0)
161
0
        return -1;
162
7.29k
    if (PyDict_SetItem(md_dict, &_Py_ID(__spec__), Py_None) != 0)
163
0
        return -1;
164
7.29k
    if (PyUnicode_CheckExact(name)) {
165
7.29k
        Py_XSETREF(mod->md_name, Py_NewRef(name));
166
7.29k
    }
167
168
7.29k
    return 0;
169
7.29k
}
170
171
static PyModuleObject *
172
new_module_notrack(PyTypeObject *mt)
173
7.29k
{
174
7.29k
    PyModuleObject *m;
175
7.29k
    m = (PyModuleObject *)_PyType_AllocNoTrack(mt, 0);
176
7.29k
    if (m == NULL)
177
0
        return NULL;
178
7.29k
    m->md_state = NULL;
179
7.29k
    m->md_weaklist = NULL;
180
7.29k
    m->md_name = NULL;
181
7.29k
    m->md_token_is_def = false;
182
#ifdef Py_GIL_DISABLED
183
    m->md_requires_gil = true;
184
#endif
185
7.29k
    m->md_state_size = 0;
186
7.29k
    m->md_state_traverse = NULL;
187
7.29k
    m->md_state_clear = NULL;
188
7.29k
    m->md_state_free = NULL;
189
7.29k
    m->md_exec = NULL;
190
7.29k
    m->md_token = NULL;
191
7.29k
    m->md_dict = PyDict_New();
192
7.29k
    if (m->md_dict == NULL) {
193
0
        Py_DECREF(m);
194
0
        return NULL;
195
0
    }
196
7.29k
    return m;
197
7.29k
}
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
300k
{
207
300k
    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
300k
    if (event == PyDict_EVENT_MODIFIED &&
211
79.8k
        new_value != NULL &&
212
79.8k
        PyLazyImport_CheckExact(new_value)) {
213
0
        _PyDict_ClearKeysVersionLockHeld(dict);
214
0
    }
215
300k
    return 0;
216
300k
}
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.29k
{
230
7.29k
    _PyDict_EnablePerThreadRefcounting(m->md_dict);
231
7.29k
    _PyObject_SetDeferredRefcount((PyObject *)m);
232
7.29k
    PyDict_Watch(MODULE_WATCHER_ID, m->md_dict);
233
7.29k
    PyObject_GC_Track(m);
234
7.29k
}
235
236
static PyObject *
237
new_module(PyTypeObject *mt, PyObject *args, PyObject *kws)
238
6.02k
{
239
6.02k
    PyModuleObject *m = new_module_notrack(mt);
240
6.02k
    if (m != NULL) {
241
6.02k
        track_module(m);
242
6.02k
    }
243
6.02k
    return (PyObject *)m;
244
6.02k
}
245
246
PyObject *
247
PyModule_NewObject(PyObject *name)
248
1.27k
{
249
1.27k
    PyModuleObject *m = new_module_notrack(&PyModule_Type);
250
1.27k
    if (m == NULL)
251
0
        return NULL;
252
1.27k
    if (module_init_dict(m, m->md_dict, name, NULL) != 0)
253
0
        goto fail;
254
1.27k
    track_module(m);
255
1.27k
    return (PyObject *)m;
256
257
0
 fail:
258
0
    Py_DECREF(m);
259
0
    return NULL;
260
1.27k
}
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.04k
{
297
1.04k
    PyObject *func;
298
1.04k
    PyMethodDef *fdef;
299
300
22.2k
    for (fdef = functions; fdef->ml_name != NULL; fdef++) {
301
21.2k
        if ((fdef->ml_flags & METH_CLASS) ||
302
21.2k
            (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.2k
        func = PyCFunction_NewEx(fdef, (PyObject*)module, name);
309
21.2k
        if (func == NULL) {
310
0
            return -1;
311
0
        }
312
21.2k
        _PyObject_SetDeferredRefcount(func);
313
21.2k
        if (PyObject_SetAttrString(module, fdef->ml_name, func) != 0) {
314
0
            Py_DECREF(func);
315
0
            return -1;
316
0
        }
317
21.2k
        Py_DECREF(func);
318
21.2k
    }
319
320
1.04k
    return 0;
321
1.04k
}
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
968
{
409
968
    createfunc_t create = NULL;
410
968
    PyObject *nameobj;
411
968
    PyObject *m = NULL;
412
968
    uint64_t multiple_interpreters = (uint64_t)Py_MOD_MULTIPLE_INTERPRETERS_SUPPORTED;
413
968
    bool requires_gil = true;
414
968
    const char *name;
415
968
    int ret;
416
968
    void *token = NULL;
417
968
    _Py_modexecfunc m_exec = NULL;
418
968
    PyInterpreterState *interp = _PyInterpreterState_GET();
419
420
968
    nameobj = PyObject_GetAttrString(spec, "name");
421
968
    if (nameobj == NULL) {
422
0
        return NULL;
423
0
    }
424
968
    name = PyUnicode_AsUTF8(nameobj);
425
968
    if (name == NULL) {
426
0
        goto error;
427
0
    }
428
429
968
    if (!check_api_version(name, module_api_version)) {
430
0
        goto error;
431
0
    }
432
433
968
    _PySlotIterator it;
434
435
968
    PyModuleDef _dummy_def = {0};
436
968
    PyModuleDef *def_like;
437
968
    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
952
    else {
443
952
        assert(original_def);
444
952
        def_like = original_def;
445
952
         _PySlotIterator_InitLegacy(&it, def_like->m_slots, _PySlot_KIND_MOD);
446
952
    }
447
968
    it.name = name;
448
449
4.76k
    while (_PySlotIterator_Next(&it)) {
450
3.79k
        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
953
            case Py_mod_exec:
457
953
                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
953
                break;
468
953
            case Py_mod_multiple_interpreters:
469
952
                multiple_interpreters = it.current.sl_uint64;
470
952
                break;
471
968
            case Py_mod_gil:
472
968
                {
473
968
                    uint64_t val = it.current.sl_uint64;
474
968
                    requires_gil = (val != (uint64_t)Py_MOD_GIL_NOT_USED);
475
968
                }
476
968
                break;
477
890
            case Py_mod_abi:
478
890
                if (PyABIInfo_Check(it.current.sl_ptr, name) < 0) {
479
0
                    goto error;
480
0
                }
481
890
                break;
482
890
            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.79k
            DEF_SLOT_CASE(Py_mod_state_free, freefunc, sl_func, m_free)
521
3.79k
#undef DEF_SLOT_CASE
522
3.79k
        }
523
3.79k
    }
524
968
    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
968
    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
968
    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
968
    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
968
    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
968
    } else {
594
968
        m = PyModule_NewObject(nameobj);
595
968
        if (m == NULL) {
596
0
            goto error;
597
0
        }
598
968
    }
599
600
968
    if (PyModule_Check(m)) {
601
968
        PyModuleObject *mod = (PyModuleObject*)m;
602
968
        mod->md_state = NULL;
603
968
        module_copy_members_from_deflike(mod, def_like);
604
968
        if (original_def) {
605
952
            assert (!token || token == original_def);
606
952
            mod->md_token = original_def;
607
952
            mod->md_token_is_def = 1;
608
952
        }
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
968
        (void)requires_gil;
616
968
#endif
617
968
        mod->md_exec = m_exec;
618
968
    } 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
968
    if (def_like->m_methods != NULL) {
647
897
        ret = _add_methods_to_object(m, nameobj, def_like->m_methods);
648
897
        if (ret != 0) {
649
0
            goto error;
650
0
        }
651
897
    }
652
653
968
    if (def_like->m_doc != NULL) {
654
847
        ret = PyModule_SetDocString(m, def_like->m_doc);
655
847
        if (ret != 0) {
656
0
            goto error;
657
0
        }
658
847
    }
659
660
968
    Py_DECREF(nameobj);
661
968
    return m;
662
663
0
error:
664
0
    Py_DECREF(nameobj);
665
0
    Py_XDECREF(m);
666
0
    return NULL;
667
968
}
668
669
PyObject *
670
PyModule_FromDefAndSpec2(PyModuleDef* def, PyObject *spec, int module_api_version)
671
952
{
672
952
    PyModuleDef_Init(def);
673
952
    return module_from_slots_and_spec(NULL, spec, module_api_version, def);
674
952
}
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
953
{
707
953
    int ret = exec(module);
708
953
    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
953
    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
953
    return 0;
725
953
}
726
727
static int
728
alloc_state(PyObject *module)
729
1.92k
{
730
1.92k
    if (!PyModule_Check(module)) {
731
0
        PyErr_Format(PyExc_TypeError, "expected module, got %T", module);
732
0
        return -1;
733
0
    }
734
1.92k
    PyModuleObject *md = (PyModuleObject*)module;
735
736
1.92k
    if (md->md_state_size >= 0) {
737
1.92k
        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
968
            md->md_state = PyMem_Malloc(md->md_state_size);
741
968
            if (!md->md_state) {
742
0
                PyErr_NoMemory();
743
0
                return -1;
744
0
            }
745
968
            memset(md->md_state, 0, md->md_state_size);
746
968
        }
747
1.92k
    }
748
1.92k
    return 0;
749
1.92k
}
750
751
int
752
PyModule_Exec(PyObject *module)
753
968
{
754
968
    if (alloc_state(module) < 0) {
755
0
        return -1;
756
0
    }
757
968
    PyModuleObject *md = (PyModuleObject*)module;
758
968
    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
952
    PyModuleDef *def = _PyModule_GetDefOrNull(module);
764
952
    if (def) {
765
952
        return PyModule_ExecDef(module, def);
766
952
    }
767
0
    return 0;
768
952
}
769
770
int
771
PyModule_ExecDef(PyObject *module, PyModuleDef *def)
772
952
{
773
952
    if (alloc_state(module) < 0) {
774
0
        return -1;
775
0
    }
776
777
952
    assert(PyModule_Check(module));
778
779
952
    if (def->m_slots == NULL) {
780
0
        return 0;
781
0
    }
782
783
952
    _PySlotIterator it;
784
952
    _PySlotIterator_InitLegacy(&it, def->m_slots, _PySlot_KIND_MOD);
785
4.66k
    while (_PySlotIterator_Next(&it)) {
786
3.71k
        _Py_modexecfunc func;
787
3.71k
        switch (it.current.sl_id) {
788
0
            case Py_slot_invalid:
789
0
                return -1;
790
937
            case Py_mod_exec:
791
937
                func = (_Py_modexecfunc)it.current.sl_func;
792
937
                if (run_exec_func(module, func) < 0) {
793
0
                    return -1;
794
0
                }
795
937
                break;
796
3.71k
        }
797
3.71k
    }
798
952
    return 0;
799
952
}
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
958
{
818
958
    PyObject *v;
819
820
958
    v = PyUnicode_FromString(doc);
821
958
    if (v == NULL || PyObject_SetAttr(m, &_Py_ID(__doc__), v) != 0) {
822
0
        Py_XDECREF(v);
823
0
        return -1;
824
0
    }
825
958
    Py_DECREF(v);
826
958
    return 0;
827
958
}
828
829
PyObject *
830
PyModule_GetDict(PyObject *m)
831
20.2k
{
832
20.2k
    if (!PyModule_Check(m)) {
833
0
        PyErr_BadInternalCall();
834
0
        return NULL;
835
0
    }
836
20.2k
    return _PyModule_GetDict(m);  // borrowed reference
837
20.2k
}
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
33
{
919
    // We return None to indicate "not found" or "bogus".
920
33
    if (!PyModule_Check(mod)) {
921
0
        PyErr_BadArgument();
922
0
        return NULL;
923
0
    }
924
33
    PyObject *dict = ((PyModuleObject *)mod)->md_dict;  // borrowed reference
925
33
    if (dict == NULL) {
926
        // The module has been tampered with.
927
0
        Py_RETURN_NONE;
928
0
    }
929
33
    PyObject *fileobj;
930
33
    int res = PyDict_GetItemRef(dict, &_Py_ID(__file__), &fileobj);
931
33
    if (res < 0) {
932
0
        return NULL;
933
0
    }
934
33
    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
7
    if (!PyUnicode_Check(fileobj)) {
944
0
        Py_DECREF(fileobj);
945
0
        Py_RETURN_NONE;
946
0
    }
947
7
    return fileobj;
948
7
}
949
950
PyObject*
951
PyModule_GetFilenameObject(PyObject *mod)
952
33
{
953
33
    PyObject *fileobj = _PyModule_GetFilenameObject(mod);
954
33
    if (fileobj == NULL) {
955
0
        return NULL;
956
0
    }
957
33
    if (fileobj == Py_None) {
958
26
        PyErr_SetString(PyExc_SystemError, "module filename missing");
959
26
        return NULL;
960
26
    }
961
7
    return fileobj;
962
33
}
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
        if (filename == NULL) {
996
0
            Py_DECREF(filenameobj);
997
0
            return -1;
998
0
        }
999
0
        assert(size >= 0);
1000
0
        if (size > maxlen) {
1001
0
            size = -1;
1002
0
            PyErr_SetString(PyExc_ValueError, "__file__ too long");
1003
0
        }
1004
0
        else {
1005
0
            (void)strcpy(buffer, filename);
1006
0
        }
1007
0
    }
1008
0
    Py_DECREF(filenameobj);
1009
0
    return size;
1010
0
}
1011
1012
PyModuleDef*
1013
PyModule_GetDef(PyObject* m)
1014
4
{
1015
4
    if (!PyModule_Check(m)) {
1016
0
        PyErr_BadArgument();
1017
0
        return NULL;
1018
0
    }
1019
4
    return _PyModule_GetDefOrNull(m);
1020
4
}
1021
1022
void*
1023
PyModule_GetState_DuringGC(PyObject* m)
1024
0
{
1025
0
    if (!PyModule_Check(m)) {
1026
0
        return NULL;
1027
0
    }
1028
0
    return _PyModule_GetState(m);
1029
0
}
1030
1031
void*
1032
PyModule_GetState(PyObject* m)
1033
43.1M
{
1034
43.1M
    if (!PyModule_Check(m)) {
1035
0
        PyErr_BadArgument();
1036
0
        return NULL;
1037
0
    }
1038
43.1M
    return _PyModule_GetState(m);
1039
43.1M
}
1040
1041
void
1042
_PyModule_Clear(PyObject *m)
1043
0
{
1044
0
    PyObject *d = ((PyModuleObject *)m)->md_dict;
1045
0
    if (d != NULL)
1046
0
        _PyModule_ClearDict(d);
1047
0
}
1048
1049
void
1050
_PyModule_ClearDict(PyObject *d)
1051
0
{
1052
    /* To make the execution order of destructors for global
1053
       objects a bit more predictable, we first zap all objects
1054
       whose name starts with a single underscore, before we clear
1055
       the entire dictionary.  We zap them by replacing them with
1056
       None, rather than deleting them from the dictionary, to
1057
       avoid rehashing the dictionary (to some extent). */
1058
1059
0
    Py_ssize_t pos;
1060
0
    PyObject *key, *value;
1061
1062
0
    int verbose = _Py_GetConfig()->verbose;
1063
1064
    /* First, clear only names starting with a single underscore */
1065
0
    pos = 0;
1066
0
    while (PyDict_Next(d, &pos, &key, &value)) {
1067
0
        if (value != Py_None && PyUnicode_Check(key)) {
1068
0
            if (PyUnicode_READ_CHAR(key, 0) == '_' &&
1069
0
                PyUnicode_READ_CHAR(key, 1) != '_') {
1070
0
                if (verbose > 1) {
1071
0
                    const char *s = PyUnicode_AsUTF8(key);
1072
0
                    if (s != NULL)
1073
0
                        PySys_WriteStderr("#   clear[1] %s\n", s);
1074
0
                    else
1075
0
                        PyErr_Clear();
1076
0
                }
1077
0
                if (PyDict_SetItem(d, key, Py_None) != 0) {
1078
0
                    PyErr_FormatUnraisable("Exception ignored while "
1079
0
                                           "clearing module dict");
1080
0
                }
1081
0
            }
1082
0
        }
1083
0
    }
1084
1085
    /* Next, clear all names except for __builtins__ */
1086
0
    pos = 0;
1087
0
    while (PyDict_Next(d, &pos, &key, &value)) {
1088
0
        if (value != Py_None && PyUnicode_Check(key)) {
1089
0
            if (PyUnicode_READ_CHAR(key, 0) != '_' ||
1090
0
                !_PyUnicode_EqualToASCIIString(key, "__builtins__"))
1091
0
            {
1092
0
                if (verbose > 1) {
1093
0
                    const char *s = PyUnicode_AsUTF8(key);
1094
0
                    if (s != NULL)
1095
0
                        PySys_WriteStderr("#   clear[2] %s\n", s);
1096
0
                    else
1097
0
                        PyErr_Clear();
1098
0
                }
1099
0
                if (PyDict_SetItem(d, key, Py_None) != 0) {
1100
0
                    PyErr_FormatUnraisable("Exception ignored while "
1101
0
                                           "clearing module dict");
1102
0
                }
1103
0
            }
1104
0
        }
1105
0
    }
1106
1107
    /* Note: we leave __builtins__ in place, so that destructors
1108
       of non-global objects defined in this module can still use
1109
       builtins, in particularly 'None'. */
1110
1111
0
}
1112
1113
/*[clinic input]
1114
class module "PyModuleObject *" "&PyModule_Type"
1115
[clinic start generated code]*/
1116
/*[clinic end generated code: output=da39a3ee5e6b4b0d input=3e35d4f708ecb6af]*/
1117
1118
#include "clinic/moduleobject.c.h"
1119
1120
/* Methods */
1121
1122
/*[clinic input]
1123
module.__init__
1124
    name: unicode
1125
    doc: object = None
1126
1127
Create a module object.
1128
1129
The name must be a string; the optional doc argument can have any type.
1130
[clinic start generated code]*/
1131
1132
static int
1133
module___init___impl(PyModuleObject *self, PyObject *name, PyObject *doc)
1134
/*[clinic end generated code: output=e7e721c26ce7aad7 input=57f9e177401e5e1e]*/
1135
6.02k
{
1136
6.02k
    return module_init_dict(self, self->md_dict, name, doc);
1137
6.02k
}
1138
1139
static void
1140
module_dealloc(PyObject *self)
1141
3.49k
{
1142
3.49k
    PyModuleObject *m = _PyModule_CAST(self);
1143
1144
3.49k
    PyObject_GC_UnTrack(m);
1145
1146
3.49k
    int verbose = _Py_GetConfig()->verbose;
1147
3.49k
    if (verbose && m->md_name) {
1148
0
        PySys_FormatStderr("# destroy %U\n", m->md_name);
1149
0
    }
1150
3.49k
    FT_CLEAR_WEAKREFS(self, m->md_weaklist);
1151
1152
3.49k
    assert_def_missing_or_redundant(m);
1153
    /* bpo-39824: Don't call m_free() if m_size > 0 and md_state=NULL */
1154
3.49k
    if (m->md_state_free && (m->md_state_size <= 0 || m->md_state != NULL))
1155
0
    {
1156
0
        m->md_state_free(m);
1157
0
    }
1158
1159
3.49k
    Py_XDECREF(m->md_dict);
1160
3.49k
    Py_XDECREF(m->md_name);
1161
3.49k
    if (m->md_state != NULL) {
1162
0
        PyMem_Free(m->md_state);
1163
0
    }
1164
3.49k
    Py_TYPE(m)->tp_free((PyObject *)m);
1165
3.49k
}
1166
1167
static PyObject *
1168
module_repr(PyObject *self)
1169
0
{
1170
0
    PyModuleObject *m = _PyModule_CAST(self);
1171
0
    PyInterpreterState *interp = _PyInterpreterState_GET();
1172
0
    return _PyImport_ImportlibModuleRepr(interp, (PyObject *)m);
1173
0
}
1174
1175
/* Check if the "_initializing" attribute of the module spec is set to true.
1176
 */
1177
int
1178
_PyModuleSpec_IsInitializing(PyObject *spec)
1179
2.91M
{
1180
2.91M
    if (spec == NULL) {
1181
0
        return 0;
1182
0
    }
1183
2.91M
    PyObject *value;
1184
2.91M
    int rc = PyObject_GetOptionalAttr(spec, &_Py_ID(_initializing), &value);
1185
2.91M
    if (rc > 0) {
1186
2.77M
        rc = PyObject_IsTrue(value);
1187
2.77M
        Py_DECREF(value);
1188
2.77M
    }
1189
2.91M
    return rc;
1190
2.91M
}
1191
1192
/* Check if the submodule name is in the "_uninitialized_submodules" attribute
1193
   of the module spec.
1194
 */
1195
int
1196
_PyModuleSpec_IsUninitializedSubmodule(PyObject *spec, PyObject *name)
1197
2.60k
{
1198
2.60k
    if (spec == NULL) {
1199
0
         return 0;
1200
0
    }
1201
1202
2.60k
    PyObject *value;
1203
2.60k
    int rc = PyObject_GetOptionalAttr(spec, &_Py_ID(_uninitialized_submodules), &value);
1204
2.60k
    if (rc > 0) {
1205
2.21k
        rc = PySequence_Contains(value, name);
1206
2.21k
        Py_DECREF(value);
1207
2.21k
    }
1208
2.60k
    return rc;
1209
2.60k
}
1210
1211
int
1212
_PyModuleSpec_GetFileOrigin(PyObject *spec, PyObject **p_origin)
1213
2.63k
{
1214
2.63k
    PyObject *has_location = NULL;
1215
2.63k
    int rc = PyObject_GetOptionalAttr(spec, &_Py_ID(has_location), &has_location);
1216
2.63k
    if (rc <= 0) {
1217
382
        return rc;
1218
382
    }
1219
    // If origin is not a location, or doesn't exist, or is not a str, we could consider falling
1220
    // back to module.__file__. But the cases in which module.__file__ is not __spec__.origin
1221
    // are cases in which we probably shouldn't be guessing.
1222
2.25k
    rc = PyObject_IsTrue(has_location);
1223
2.25k
    Py_DECREF(has_location);
1224
2.25k
    if (rc <= 0) {
1225
112
        return rc;
1226
112
    }
1227
    // has_location is true, so origin is a location
1228
2.14k
    PyObject *origin = NULL;
1229
2.14k
    rc = PyObject_GetOptionalAttr(spec, &_Py_ID(origin), &origin);
1230
2.14k
    if (rc <= 0) {
1231
0
        return rc;
1232
0
    }
1233
2.14k
    assert(origin != NULL);
1234
2.14k
    if (!PyUnicode_Check(origin)) {
1235
0
        Py_DECREF(origin);
1236
0
        return 0;
1237
0
    }
1238
2.14k
    *p_origin = origin;
1239
2.14k
    return 1;
1240
2.14k
}
1241
1242
int
1243
_PyModule_IsPossiblyShadowing(PyObject *origin)
1244
2.63k
{
1245
2.63k
    int result = 0;
1246
2.63k
    wchar_t *root = NULL;
1247
2.63k
    wchar_t *sys_path_0_buf = NULL;
1248
1249
    // origin must be a unicode subtype
1250
    // Returns 1 if the module at origin could be shadowing a module of the
1251
    // same name later in the module search path. The condition we check is basically:
1252
    // root = os.path.dirname(origin.removesuffix(os.sep + "__init__.py"))
1253
    // return not sys.flags.safe_path and root == (sys.path[0] or os.getcwd())
1254
    // Returns 0 otherwise (or if we aren't sure)
1255
    // Returns -1 if an error occurred that should be propagated
1256
2.63k
    if (origin == NULL) {
1257
494
        return 0;
1258
494
    }
1259
1260
    // not sys.flags.safe_path
1261
2.14k
    const PyConfig *config = _Py_GetConfig();
1262
2.14k
    if (config->safe_path) {
1263
0
        return 0;
1264
0
    }
1265
1266
    // root = os.path.dirname(origin.removesuffix(os.sep + "__init__.py"))
1267
2.14k
    root = PyUnicode_AsWideCharString(origin, NULL);
1268
2.14k
    if (root == NULL) {
1269
0
        return -1;
1270
0
    }
1271
1272
2.14k
    wchar_t *sep = wcsrchr(root, SEP);
1273
2.14k
    if (sep == NULL) {
1274
0
        goto done;
1275
0
    }
1276
    // If it's a package then we need to look one directory further up
1277
2.14k
    if (wcscmp(sep + 1, L"__init__.py") == 0) {
1278
0
        *sep = L'\0';
1279
0
        sep = wcsrchr(root, SEP);
1280
0
        if (sep == NULL) {
1281
0
            goto done;
1282
0
        }
1283
0
    }
1284
2.14k
    *sep = L'\0';
1285
1286
    // sys.path[0] or os.getcwd()
1287
2.14k
    wchar_t *sys_path_0 = config->sys_path_0;
1288
2.14k
    if (!sys_path_0) {
1289
2.14k
        goto done;
1290
2.14k
    }
1291
1292
0
    if (sys_path_0[0] == L'\0') {
1293
        // if sys.path[0] == "", treat it as if it were the current directory
1294
0
        sys_path_0_buf = PyMem_Malloc(MAXPATHLEN * sizeof(wchar_t));
1295
0
        if (sys_path_0_buf == NULL) {
1296
0
            PyErr_NoMemory();
1297
0
            result = -1;
1298
0
            goto done;
1299
0
        }
1300
0
        if (!_Py_wgetcwd(sys_path_0_buf, MAXPATHLEN)) {
1301
            // If we failed to getcwd, don't raise an exception and instead
1302
            // let the caller proceed assuming no shadowing
1303
0
            goto done;
1304
0
        }
1305
0
        sys_path_0 = sys_path_0_buf;
1306
0
    }
1307
1308
0
    result = (wcscmp(sys_path_0, root) == 0);
1309
1310
2.14k
done:
1311
2.14k
    PyMem_Free(root);
1312
2.14k
    PyMem_Free(sys_path_0_buf);
1313
2.14k
    return result;
1314
0
}
1315
1316
static int
1317
module_get_resolved_dict_item(PyObject *dict, PyObject *name, PyObject **result)
1318
665k
{
1319
665k
    int rc = PyDict_GetItemRef(dict, name, result);
1320
665k
    if (rc <= 0 || !PyLazyImport_CheckExact(*result)) {
1321
665k
        return rc;
1322
665k
    }
1323
0
    PyThreadState *tstate = PyThreadState_GET();
1324
0
    if (_PyLazyImport_IsResolving(tstate, *result)) {
1325
0
        Py_CLEAR(*result);
1326
0
        return 0;
1327
0
    }
1328
0
    PyObject *value = _PyLazyImport_Reify(tstate, *result, name, dict);
1329
0
    Py_SETREF(*result, value);
1330
0
    return value == NULL ? -1 : 1;
1331
0
}
1332
1333
PyObject*
1334
_Py_module_getattro_impl(PyModuleObject *m, PyObject *name, int suppress)
1335
5.06M
{
1336
    // When suppress=1, this function suppresses AttributeError.
1337
5.06M
    PyObject *attr, *mod_name, *getattr;
1338
5.06M
    attr = _PyObject_GenericGetAttrWithDict((PyObject *)m, name, NULL, suppress);
1339
5.06M
    if (attr == NULL) {
1340
665k
        if (suppress == 1) {
1341
662k
            if (PyErr_Occurred()) {
1342
                // pass up non-AttributeError exception
1343
0
                return NULL;
1344
0
            }
1345
662k
        }
1346
2.60k
        else {
1347
2.60k
            if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
1348
                // pass up non-AttributeError exception
1349
0
                return NULL;
1350
0
            }
1351
2.60k
            PyErr_Clear();
1352
2.60k
        }
1353
665k
        assert(m->md_dict != NULL);
1354
665k
        int recheck_dict;
1355
665k
        attr = _PyImport_TryLoadLazySubmodule((PyObject *)m, name, suppress,
1356
665k
                                             &recheck_dict);
1357
665k
        if (attr != NULL || PyErr_Occurred()) {
1358
0
            return attr;
1359
0
        }
1360
        // A concurrent load may have bound the child and removed its pending
1361
        // registration after our initial dictionary lookup.
1362
665k
        if (recheck_dict) {
1363
79
            if (Py_TYPE(m) != &PyModule_Type) {
1364
0
                PyObject *descr = _PyType_LookupRef(Py_TYPE(m), name);
1365
0
                if (descr != NULL) {
1366
                    // Preserve the fallback after a descriptor raised.
1367
0
                    recheck_dict = Py_TYPE(descr)->tp_descr_get == NULL;
1368
0
                    Py_DECREF(descr);
1369
0
                }
1370
0
            }
1371
79
            if (recheck_dict &&
1372
79
                PyDict_GetItemRef(m->md_dict, name, &attr) < 0) {
1373
0
                return NULL;
1374
0
            }
1375
79
        }
1376
665k
    }
1377
5.06M
    if (attr) {
1378
4.40M
        if (PyLazyImport_CheckExact(attr)) {
1379
0
            PyThreadState *tstate = PyThreadState_GET();
1380
0
            if (suppress && _PyLazyImport_IsResolving(tstate, attr)) {
1381
                // Only direct reentry means this attribute is unavailable.
1382
0
                Py_DECREF(attr);
1383
0
                return NULL;
1384
0
            }
1385
0
            PyObject *new_value = _PyLazyImport_Reify(
1386
0
                tstate, attr, name, m->md_dict);
1387
0
            Py_DECREF(attr);
1388
0
            return new_value;
1389
0
        }
1390
4.40M
        return attr;
1391
4.40M
    }
1392
665k
    if (module_get_resolved_dict_item(
1393
665k
            m->md_dict, &_Py_ID(__getattr__), &getattr) < 0) {
1394
0
        return NULL;
1395
0
    }
1396
665k
    if (getattr) {
1397
1.96k
        PyObject *result = PyObject_CallOneArg(getattr, name);
1398
1.96k
        if (result == NULL && suppress == 1 && PyErr_ExceptionMatches(PyExc_AttributeError)) {
1399
            // suppress AttributeError
1400
1.95k
            PyErr_Clear();
1401
1.95k
        }
1402
1.96k
        Py_DECREF(getattr);
1403
1.96k
        return result;
1404
1.96k
    }
1405
1406
    // The attribute was not found.  We make a best effort attempt at a useful error message,
1407
    // but only if we're not suppressing AttributeError.
1408
663k
    if (suppress == 1) {
1409
660k
        return NULL;
1410
660k
    }
1411
2.60k
    if (PyDict_GetItemRef(m->md_dict, &_Py_ID(__name__), &mod_name) < 0) {
1412
0
        return NULL;
1413
0
    }
1414
2.60k
    if (!mod_name || !PyUnicode_Check(mod_name)) {
1415
0
        Py_XDECREF(mod_name);
1416
0
        PyErr_Format(PyExc_AttributeError,
1417
0
                    "module has no attribute '%U'", name);
1418
0
        return NULL;
1419
0
    }
1420
2.60k
    PyObject *spec;
1421
2.60k
    if (PyDict_GetItemRef(m->md_dict, &_Py_ID(__spec__), &spec) < 0) {
1422
0
        Py_DECREF(mod_name);
1423
0
        return NULL;
1424
0
    }
1425
2.60k
    if (spec == NULL) {
1426
0
        PyErr_Format(PyExc_AttributeError,
1427
0
                     "module '%U' has no attribute '%U'",
1428
0
                     mod_name, name);
1429
0
        Py_DECREF(mod_name);
1430
0
        return NULL;
1431
0
    }
1432
1433
2.60k
    PyObject *origin = NULL;
1434
2.60k
    if (_PyModuleSpec_GetFileOrigin(spec, &origin) < 0) {
1435
0
        goto done;
1436
0
    }
1437
1438
2.60k
    int is_possibly_shadowing = _PyModule_IsPossiblyShadowing(origin);
1439
2.60k
    if (is_possibly_shadowing < 0) {
1440
0
        goto done;
1441
0
    }
1442
2.60k
    int is_possibly_shadowing_stdlib = 0;
1443
2.60k
    if (is_possibly_shadowing) {
1444
0
        PyObject *stdlib_modules;
1445
0
        if (PySys_GetOptionalAttrString("stdlib_module_names", &stdlib_modules) < 0) {
1446
0
            goto done;
1447
0
        }
1448
0
        if (stdlib_modules && PyAnySet_Check(stdlib_modules)) {
1449
0
            is_possibly_shadowing_stdlib = PySet_Contains(stdlib_modules, mod_name);
1450
0
            if (is_possibly_shadowing_stdlib < 0) {
1451
0
                Py_DECREF(stdlib_modules);
1452
0
                goto done;
1453
0
            }
1454
0
        }
1455
0
        Py_XDECREF(stdlib_modules);
1456
0
    }
1457
1458
2.60k
    if (is_possibly_shadowing_stdlib) {
1459
0
        assert(origin);
1460
0
        PyErr_Format(PyExc_AttributeError,
1461
0
                    "module '%U' has no attribute '%U' "
1462
0
                    "(consider renaming '%U' since it has the same "
1463
0
                    "name as the standard library module named '%U' "
1464
0
                    "and prevents importing that standard library module)",
1465
0
                    mod_name, name, origin, mod_name);
1466
0
    }
1467
2.60k
    else {
1468
2.60k
        int rc = _PyModuleSpec_IsInitializing(spec);
1469
2.60k
        if (rc < 0) {
1470
0
            goto done;
1471
0
        }
1472
2.60k
        else if (rc > 0) {
1473
4
            if (is_possibly_shadowing) {
1474
0
                assert(origin);
1475
                // For non-stdlib modules, only mention the possibility of
1476
                // shadowing if the module is being initialized.
1477
0
                PyErr_Format(PyExc_AttributeError,
1478
0
                            "module '%U' has no attribute '%U' "
1479
0
                            "(consider renaming '%U' if it has the same name "
1480
0
                            "as a library you intended to import)",
1481
0
                            mod_name, name, origin);
1482
0
            }
1483
4
            else if (origin) {
1484
4
                PyErr_Format(PyExc_AttributeError,
1485
4
                            "partially initialized "
1486
4
                            "module '%U' from '%U' has no attribute '%U' "
1487
4
                            "(most likely due to a circular import)",
1488
4
                            mod_name, origin, name);
1489
4
            }
1490
0
            else {
1491
0
                PyErr_Format(PyExc_AttributeError,
1492
0
                            "partially initialized "
1493
0
                            "module '%U' has no attribute '%U' "
1494
0
                            "(most likely due to a circular import)",
1495
0
                            mod_name, name);
1496
0
            }
1497
4
        }
1498
2.60k
        else {
1499
2.60k
            assert(rc == 0);
1500
2.60k
            rc = _PyModuleSpec_IsUninitializedSubmodule(spec, name);
1501
2.60k
            if (rc > 0) {
1502
0
                PyErr_Format(PyExc_AttributeError,
1503
0
                            "cannot access submodule '%U' of module '%U' "
1504
0
                            "(most likely due to a circular import)",
1505
0
                            name, mod_name);
1506
0
            }
1507
2.60k
            else if (rc == 0) {
1508
2.60k
                PyErr_Format(PyExc_AttributeError,
1509
2.60k
                            "module '%U' has no attribute '%U'",
1510
2.60k
                            mod_name, name);
1511
2.60k
            }
1512
2.60k
        }
1513
2.60k
    }
1514
1515
2.60k
done:
1516
2.60k
    Py_XDECREF(origin);
1517
2.60k
    Py_DECREF(spec);
1518
2.60k
    Py_DECREF(mod_name);
1519
2.60k
    return NULL;
1520
2.60k
}
1521
1522
1523
PyObject*
1524
_Py_module_getattro(PyObject *self, PyObject *name)
1525
151k
{
1526
151k
    PyModuleObject *m = _PyModule_CAST(self);
1527
151k
    return _Py_module_getattro_impl(m, name, 0);
1528
151k
}
1529
1530
static int
1531
module_traverse(PyObject *self, visitproc visit, void *arg)
1532
150k
{
1533
150k
    PyModuleObject *m = _PyModule_CAST(self);
1534
1535
150k
    assert_def_missing_or_redundant(m);
1536
    /* bpo-39824: Don't call m_traverse() if m_size > 0 and md_state=NULL */
1537
150k
    if (m->md_state_traverse && (m->md_state_size <= 0 || m->md_state != NULL))
1538
22.6k
    {
1539
22.6k
        int res = m->md_state_traverse((PyObject*)m, visit, arg);
1540
22.6k
        if (res)
1541
0
            return res;
1542
22.6k
    }
1543
1544
150k
    Py_VISIT(m->md_dict);
1545
150k
    return 0;
1546
150k
}
1547
1548
static int
1549
module_clear(PyObject *self)
1550
0
{
1551
0
    PyModuleObject *m = _PyModule_CAST(self);
1552
1553
0
    assert_def_missing_or_redundant(m);
1554
    /* bpo-39824: Don't call m_clear() if m_size > 0 and md_state=NULL */
1555
0
    if (m->md_state_clear && (m->md_state_size <= 0 || m->md_state != NULL))
1556
0
    {
1557
0
        int res = m->md_state_clear((PyObject*)m);
1558
0
        if (PyErr_Occurred()) {
1559
0
            PyErr_FormatUnraisable("Exception ignored in m_clear of module%s%V",
1560
0
                                   m->md_name ? " " : "",
1561
0
                                   m->md_name, "");
1562
0
        }
1563
0
        if (res) {
1564
0
            return res;
1565
0
        }
1566
0
    }
1567
0
    Py_CLEAR(m->md_dict);
1568
0
    return 0;
1569
0
}
1570
1571
static PyObject *
1572
module_dir(PyObject *self, PyObject *args)
1573
39
{
1574
39
    PyObject *result = NULL;
1575
39
    PyObject *dict;
1576
39
    if (PyModule_CheckExact(self)) {
1577
39
        dict = Py_NewRef(((PyModuleObject *)self)->md_dict);
1578
39
    } else {
1579
0
        dict = PyObject_GetAttr(self, &_Py_ID(__dict__));
1580
0
    }
1581
1582
39
    if (dict != NULL) {
1583
39
        if (PyDict_Check(dict)) {
1584
39
            PyObject *dirfunc;
1585
39
            int rc = module_get_resolved_dict_item(
1586
39
                dict, &_Py_ID(__dir__), &dirfunc);
1587
39
            if (rc > 0) {
1588
0
                result = _PyObject_CallNoArgs(dirfunc);
1589
0
                Py_DECREF(dirfunc);
1590
0
            }
1591
39
            else if (rc == 0) {
1592
39
                result = PyDict_Keys(dict);
1593
39
            }
1594
39
        }
1595
0
        else {
1596
0
            PyErr_Format(PyExc_TypeError, "<module>.__dict__ is not a dictionary");
1597
0
        }
1598
39
    }
1599
1600
39
    Py_XDECREF(dict);
1601
39
    return result;
1602
39
}
1603
1604
static PyMethodDef module_methods[] = {
1605
    {"__dir__", module_dir, METH_NOARGS,
1606
     PyDoc_STR("__dir__() -> list\nspecialized dir() implementation")},
1607
    {0}
1608
};
1609
1610
static PyObject *
1611
module_load_dict(PyModuleObject *m)
1612
0
{
1613
0
    PyObject *dict = PyObject_GetAttr((PyObject *)m, &_Py_ID(__dict__));
1614
0
    if (dict == NULL) {
1615
0
        return NULL;
1616
0
    }
1617
0
    if (!PyDict_Check(dict)) {
1618
0
        PyErr_Format(PyExc_TypeError, "<module>.__dict__ is not a dictionary");
1619
0
        Py_DECREF(dict);
1620
0
        return NULL;
1621
0
    }
1622
0
    return dict;
1623
0
}
1624
1625
static PyObject *
1626
module_get_annotate(PyObject *self, void *Py_UNUSED(ignored))
1627
0
{
1628
0
    PyModuleObject *m = _PyModule_CAST(self);
1629
1630
0
    PyObject *dict = module_load_dict(m);
1631
0
    if (dict == NULL) {
1632
0
        return NULL;
1633
0
    }
1634
1635
0
    PyObject *annotate;
1636
0
    if (PyDict_GetItemRef(dict, &_Py_ID(__annotate__), &annotate) == 0) {
1637
0
        annotate = Py_None;
1638
0
        if (PyDict_SetItem(dict, &_Py_ID(__annotate__), annotate) == -1) {
1639
0
            Py_CLEAR(annotate);
1640
0
        }
1641
0
    }
1642
0
    Py_DECREF(dict);
1643
0
    return annotate;
1644
0
}
1645
1646
static int
1647
module_set_annotate(PyObject *self, PyObject *value, void *Py_UNUSED(ignored))
1648
0
{
1649
0
    PyModuleObject *m = _PyModule_CAST(self);
1650
0
    if (value == NULL) {
1651
0
        PyErr_SetString(PyExc_TypeError, "cannot delete __annotate__ attribute");
1652
0
        return -1;
1653
0
    }
1654
1655
0
    PyObject *dict = module_load_dict(m);
1656
0
    if (dict == NULL) {
1657
0
        return -1;
1658
0
    }
1659
1660
0
    if (!Py_IsNone(value) && !PyCallable_Check(value)) {
1661
0
        PyErr_SetString(PyExc_TypeError, "__annotate__ must be callable or None");
1662
0
        Py_DECREF(dict);
1663
0
        return -1;
1664
0
    }
1665
1666
0
    if (PyDict_SetItem(dict, &_Py_ID(__annotate__), value) == -1) {
1667
0
        Py_DECREF(dict);
1668
0
        return -1;
1669
0
    }
1670
0
    if (!Py_IsNone(value)) {
1671
0
        if (PyDict_Pop(dict, &_Py_ID(__annotations__), NULL) == -1) {
1672
0
            Py_DECREF(dict);
1673
0
            return -1;
1674
0
        }
1675
0
    }
1676
0
    Py_DECREF(dict);
1677
0
    return 0;
1678
0
}
1679
1680
static PyObject *
1681
module_get_annotations(PyObject *self, void *Py_UNUSED(ignored))
1682
0
{
1683
0
    PyModuleObject *m = _PyModule_CAST(self);
1684
1685
0
    PyObject *dict = module_load_dict(m);
1686
0
    if (dict == NULL) {
1687
0
        return NULL;
1688
0
    }
1689
1690
0
    PyObject *annotations;
1691
0
    if (PyDict_GetItemRef(dict, &_Py_ID(__annotations__), &annotations) == 0) {
1692
0
        PyObject *spec;
1693
0
        if (PyDict_GetItemRef(m->md_dict, &_Py_ID(__spec__), &spec) < 0) {
1694
0
            Py_DECREF(dict);
1695
0
            return NULL;
1696
0
        }
1697
0
        bool is_initializing = false;
1698
0
        if (spec != NULL) {
1699
0
            int rc = _PyModuleSpec_IsInitializing(spec);
1700
0
            if (rc < 0) {
1701
0
                Py_DECREF(spec);
1702
0
                Py_DECREF(dict);
1703
0
                return NULL;
1704
0
            }
1705
0
            Py_DECREF(spec);
1706
0
            if (rc) {
1707
0
                is_initializing = true;
1708
0
            }
1709
0
        }
1710
1711
0
        PyObject *annotate;
1712
0
        int annotate_result = PyDict_GetItemRef(dict, &_Py_ID(__annotate__), &annotate);
1713
0
        if (annotate_result < 0) {
1714
0
            Py_DECREF(dict);
1715
0
            return NULL;
1716
0
        }
1717
0
        if (annotate_result == 1 && PyCallable_Check(annotate)) {
1718
0
            PyObject *one = _PyLong_GetOne();
1719
0
            annotations = _PyObject_CallOneArg(annotate, one);
1720
0
            if (annotations == NULL) {
1721
0
                Py_DECREF(annotate);
1722
0
                Py_DECREF(dict);
1723
0
                return NULL;
1724
0
            }
1725
0
            if (!PyDict_Check(annotations)) {
1726
0
                PyErr_Format(PyExc_TypeError,
1727
0
                             "__annotate__() must return a dict, not %T",
1728
0
                             annotations);
1729
0
                Py_DECREF(annotate);
1730
0
                Py_DECREF(annotations);
1731
0
                Py_DECREF(dict);
1732
0
                return NULL;
1733
0
            }
1734
0
        }
1735
0
        else {
1736
0
            annotations = PyDict_New();
1737
0
        }
1738
0
        Py_XDECREF(annotate);
1739
        // Do not cache annotations if the module is still initializing
1740
0
        if (annotations && !is_initializing) {
1741
0
            int result = PyDict_SetItem(
1742
0
                    dict, &_Py_ID(__annotations__), annotations);
1743
0
            if (result) {
1744
0
                Py_CLEAR(annotations);
1745
0
            }
1746
0
        }
1747
0
    }
1748
0
    Py_DECREF(dict);
1749
0
    return annotations;
1750
0
}
1751
1752
static int
1753
module_set_annotations(PyObject *self, PyObject *value, void *Py_UNUSED(ignored))
1754
0
{
1755
0
    PyModuleObject *m = _PyModule_CAST(self);
1756
1757
0
    PyObject *dict = module_load_dict(m);
1758
0
    if (dict == NULL) {
1759
0
        return -1;
1760
0
    }
1761
1762
0
    int ret = -1;
1763
0
    if (value != NULL) {
1764
        /* set */
1765
0
        ret = PyDict_SetItem(dict, &_Py_ID(__annotations__), value);
1766
0
    }
1767
0
    else {
1768
        /* delete */
1769
0
        ret = PyDict_Pop(dict, &_Py_ID(__annotations__), NULL);
1770
0
        if (ret == 0) {
1771
0
            PyErr_SetObject(PyExc_AttributeError, &_Py_ID(__annotations__));
1772
0
            ret = -1;
1773
0
        }
1774
0
        else if (ret > 0) {
1775
0
            ret = 0;
1776
0
        }
1777
0
    }
1778
0
    if (ret == 0 && PyDict_Pop(dict, &_Py_ID(__annotate__), NULL) < 0) {
1779
0
        ret = -1;
1780
0
    }
1781
1782
0
    Py_DECREF(dict);
1783
0
    return ret;
1784
0
}
1785
1786
static PyGetSetDef module_getsets[] = {
1787
    {"__annotations__", module_get_annotations, module_set_annotations},
1788
    {"__annotate__", module_get_annotate, module_set_annotate},
1789
    {NULL}
1790
};
1791
1792
PyTypeObject PyModule_Type = {
1793
    PyVarObject_HEAD_INIT(&PyType_Type, 0)
1794
    "module",                                   /* tp_name */
1795
    sizeof(PyModuleObject),                     /* tp_basicsize */
1796
    0,                                          /* tp_itemsize */
1797
    module_dealloc,                             /* tp_dealloc */
1798
    0,                                          /* tp_vectorcall_offset */
1799
    0,                                          /* tp_getattr */
1800
    0,                                          /* tp_setattr */
1801
    0,                                          /* tp_as_async */
1802
    module_repr,                                /* tp_repr */
1803
    0,                                          /* tp_as_number */
1804
    0,                                          /* tp_as_sequence */
1805
    0,                                          /* tp_as_mapping */
1806
    0,                                          /* tp_hash */
1807
    0,                                          /* tp_call */
1808
    0,                                          /* tp_str */
1809
    _Py_module_getattro,                        /* tp_getattro */
1810
    PyObject_GenericSetAttr,                    /* tp_setattro */
1811
    0,                                          /* tp_as_buffer */
1812
    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
1813
        Py_TPFLAGS_BASETYPE,                    /* tp_flags */
1814
    module___init____doc__,                     /* tp_doc */
1815
    module_traverse,                            /* tp_traverse */
1816
    module_clear,                               /* tp_clear */
1817
    0,                                          /* tp_richcompare */
1818
    offsetof(PyModuleObject, md_weaklist),      /* tp_weaklistoffset */
1819
    0,                                          /* tp_iter */
1820
    0,                                          /* tp_iternext */
1821
    module_methods,                             /* tp_methods */
1822
    module_members,                             /* tp_members */
1823
    module_getsets,                             /* tp_getset */
1824
    0,                                          /* tp_base */
1825
    0,                                          /* tp_dict */
1826
    0,                                          /* tp_descr_get */
1827
    0,                                          /* tp_descr_set */
1828
    offsetof(PyModuleObject, md_dict),          /* tp_dictoffset */
1829
    module___init__,                            /* tp_init */
1830
    0,                                          /* tp_alloc */
1831
    new_module,                                 /* tp_new */
1832
    PyObject_GC_Del,                            /* tp_free */
1833
};