Coverage Report

Created: 2026-08-13 06:33

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/cpython3/Objects/moduleobject.c
Line
Count
Source
1
/* Module object implementation */
2
3
#include "Python.h"
4
#include "pycore_call.h"          // _PyObject_CallNoArgs()
5
#include "pycore_ceval.h"         // _PyEval_EnableGILTransient()
6
#include "pycore_dict.h"          // _PyDict_EnablePerThreadRefcounting()
7
#include "pycore_fileutils.h"     // _Py_wgetcwd
8
#include "pycore_import.h"        // _PyImport_GetNextModuleIndex()
9
#include "pycore_interp.h"        // PyInterpreterState.importlib
10
#include "pycore_lazyimportobject.h" // _PyLazyImportObject_Check()
11
#include "pycore_long.h"          // _PyLong_GetOne()
12
#include "pycore_modsupport.h"    // _PyModule_CreateInitialized()
13
#include "pycore_moduleobject.h"  // _PyModule_GetDefOrNull()
14
#include "pycore_object.h"        // _PyType_AllocNoTrack
15
#include "pycore_pyerrors.h"      // _PyErr_FormatFromCause()
16
#include "pycore_pystate.h"       // _PyInterpreterState_GET()
17
#include "pycore_slots.h"         // _PySlotIterator_Init
18
#include "pycore_unicodeobject.h" // _PyUnicode_EqualToASCIIString()
19
#include "pycore_weakref.h"       // FT_CLEAR_WEAKREFS()
20
21
#include "osdefs.h"               // MAXPATHLEN
22
23
#define _PyModule_CAST(op) \
24
139k
    (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
26.8k
{
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
26.8k
#ifndef NDEBUG
40
26.8k
    if (m->md_token_is_def) {
41
10.2k
        PyModuleDef *def = (PyModuleDef *)m->md_token;
42
10.2k
        assert(def);
43
40.8k
#define DO_ASSERT(F) assert (def->m_ ## F == m->md_state_ ## F);
44
10.2k
        DO_ASSERT(size);
45
10.2k
        DO_ASSERT(traverse);
46
10.2k
        DO_ASSERT(clear);
47
10.2k
        DO_ASSERT(free);
48
10.2k
#undef DO_ASSERT
49
10.2k
    }
50
26.8k
#endif // NDEBUG
51
26.8k
}
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
728
{
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
728
    assert(PyModuleDef_Type.tp_flags & Py_TPFLAGS_READY);
138
728
    if (def->m_base.m_index == 0) {
139
406
        Py_SET_REFCNT(def, 1);
140
406
        Py_SET_TYPE(def, &PyModuleDef_Type);
141
406
        def->m_base.m_index = _PyImport_GetNextModuleIndex();
142
406
    }
143
728
    return (PyObject*)def;
144
728
}
145
146
static int
147
module_init_dict(PyModuleObject *mod, PyObject *md_dict,
148
                 PyObject *name, PyObject *doc)
149
964
{
150
964
    assert(md_dict != NULL);
151
964
    if (doc == NULL)
152
448
        doc = Py_None;
153
154
964
    if (PyDict_SetItem(md_dict, &_Py_ID(__name__), name) != 0)
155
0
        return -1;
156
964
    if (PyDict_SetItem(md_dict, &_Py_ID(__doc__), doc) != 0)
157
0
        return -1;
158
964
    if (PyDict_SetItem(md_dict, &_Py_ID(__package__), Py_None) != 0)
159
0
        return -1;
160
964
    if (PyDict_SetItem(md_dict, &_Py_ID(__loader__), Py_None) != 0)
161
0
        return -1;
162
964
    if (PyDict_SetItem(md_dict, &_Py_ID(__spec__), Py_None) != 0)
163
0
        return -1;
164
964
    if (PyUnicode_CheckExact(name)) {
165
964
        Py_XSETREF(mod->md_name, Py_NewRef(name));
166
964
    }
167
168
964
    return 0;
169
964
}
170
171
static PyModuleObject *
172
new_module_notrack(PyTypeObject *mt)
173
964
{
174
964
    PyModuleObject *m;
175
964
    m = (PyModuleObject *)_PyType_AllocNoTrack(mt, 0);
176
964
    if (m == NULL)
177
0
        return NULL;
178
964
    m->md_state = NULL;
179
964
    m->md_weaklist = NULL;
180
964
    m->md_name = NULL;
181
964
    m->md_token_is_def = false;
182
#ifdef Py_GIL_DISABLED
183
    m->md_requires_gil = true;
184
#endif
185
964
    m->md_state_size = 0;
186
964
    m->md_state_traverse = NULL;
187
964
    m->md_state_clear = NULL;
188
964
    m->md_state_free = NULL;
189
964
    m->md_exec = NULL;
190
964
    m->md_token = NULL;
191
964
    m->md_dict = PyDict_New();
192
964
    if (m->md_dict == NULL) {
193
0
        Py_DECREF(m);
194
0
        return NULL;
195
0
    }
196
964
    return m;
197
964
}
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
66.3k
{
207
66.3k
    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
66.3k
    if (event == PyDict_EVENT_MODIFIED &&
211
6.68k
        new_value != NULL &&
212
6.68k
        PyLazyImport_CheckExact(new_value)) {
213
0
        _PyDict_ClearKeysVersionLockHeld(dict);
214
0
    }
215
66.3k
    return 0;
216
66.3k
}
217
218
int
219
_PyModule_InitModuleDictWatcher(PyInterpreterState *interp)
220
21
{
221
    // This is a reserved watcher for CPython so there's no need to check for non-NULL.
222
21
    assert(interp->dict_state.watchers[MODULE_WATCHER_ID] == NULL);
223
21
    interp->dict_state.watchers[MODULE_WATCHER_ID] = &module_dict_watcher;
224
21
    return 0;
225
21
}
226
227
static void
228
track_module(PyModuleObject *m)
229
964
{
230
964
    _PyDict_EnablePerThreadRefcounting(m->md_dict);
231
964
    _PyObject_SetDeferredRefcount((PyObject *)m);
232
964
    PyDict_Watch(MODULE_WATCHER_ID, m->md_dict);
233
964
    PyObject_GC_Track(m);
234
964
}
235
236
static PyObject *
237
new_module(PyTypeObject *mt, PyObject *args, PyObject *kws)
238
516
{
239
516
    PyModuleObject *m = new_module_notrack(mt);
240
516
    if (m != NULL) {
241
516
        track_module(m);
242
516
    }
243
516
    return (PyObject *)m;
244
516
}
245
246
PyObject *
247
PyModule_NewObject(PyObject *name)
248
448
{
249
448
    PyModuleObject *m = new_module_notrack(&PyModule_Type);
250
448
    if (m == NULL)
251
0
        return NULL;
252
448
    if (module_init_dict(m, m->md_dict, name, NULL) != 0)
253
0
        goto fail;
254
448
    track_module(m);
255
448
    return (PyObject *)m;
256
257
0
 fail:
258
0
    Py_DECREF(m);
259
0
    return NULL;
260
448
}
261
262
PyObject *
263
PyModule_New(const char *name)
264
84
{
265
84
    PyObject *nameobj, *module;
266
84
    nameobj = PyUnicode_FromString(name);
267
84
    if (nameobj == NULL)
268
0
        return NULL;
269
84
    module = PyModule_NewObject(nameobj);
270
84
    Py_DECREF(nameobj);
271
84
    return module;
272
84
}
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
406
{
281
406
    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
406
    return 1;
292
406
}
293
294
static int
295
_add_methods_to_object(PyObject *module, PyObject *name, PyMethodDef *functions)
296
399
{
297
399
    PyObject *func;
298
399
    PyMethodDef *fdef;
299
300
10.5k
    for (fdef = functions; fdef->ml_name != NULL; fdef++) {
301
10.1k
        if ((fdef->ml_flags & METH_CLASS) ||
302
10.1k
            (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
10.1k
        func = PyCFunction_NewEx(fdef, (PyObject*)module, name);
309
10.1k
        if (func == NULL) {
310
0
            return -1;
311
0
        }
312
10.1k
        _PyObject_SetDeferredRefcount(func);
313
10.1k
        if (PyObject_SetAttrString(module, fdef->ml_name, func) != 0) {
314
0
            Py_DECREF(func);
315
0
            return -1;
316
0
        }
317
10.1k
        Py_DECREF(func);
318
10.1k
    }
319
320
399
    return 0;
321
399
}
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
406
{
339
406
    md->md_state_size = def_like->m_size;
340
406
    md->md_state_traverse = def_like->m_traverse;
341
406
    md->md_state_clear = def_like->m_clear;
342
406
    md->md_state_free = def_like->m_free;
343
406
}
344
345
PyObject *
346
_PyModule_CreateInitialized(PyModuleDef* module, int module_api_version)
347
84
{
348
84
    const char* name;
349
84
    PyModuleObject *m;
350
351
84
    if (!PyModuleDef_Init(module))
352
0
        return NULL;
353
84
    name = module->m_name;
354
84
    if (!check_api_version(name, module_api_version)) {
355
0
        return NULL;
356
0
    }
357
84
    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
84
    name = _PyImport_ResolveNameWithPackageContext(name);
364
365
84
    m = (PyModuleObject*)PyModule_New(name);
366
84
    if (m == NULL)
367
0
        return NULL;
368
369
84
    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
84
    if (module->m_methods != NULL) {
380
84
        if (PyModule_AddFunctions((PyObject *) m, module->m_methods) != 0) {
381
0
            Py_DECREF(m);
382
0
            return NULL;
383
0
        }
384
84
    }
385
84
    if (module->m_doc != NULL) {
386
63
        if (PyModule_SetDocString((PyObject *) m, module->m_doc) != 0) {
387
0
            Py_DECREF(m);
388
0
            return NULL;
389
0
        }
390
63
    }
391
84
    m->md_token = module;
392
84
    m->md_token_is_def = true;
393
84
    module_copy_members_from_deflike(m, module);
394
#ifdef Py_GIL_DISABLED
395
    m->md_requires_gil = true;
396
#endif
397
84
    return (PyObject*)m;
398
84
}
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
322
{
409
322
    createfunc_t create = NULL;
410
322
    PyObject *nameobj;
411
322
    PyObject *m = NULL;
412
322
    uint64_t multiple_interpreters = (uint64_t)Py_MOD_MULTIPLE_INTERPRETERS_SUPPORTED;
413
322
    bool requires_gil = true;
414
322
    const char *name;
415
322
    int ret;
416
322
    void *token = NULL;
417
322
    _Py_modexecfunc m_exec = NULL;
418
322
    PyInterpreterState *interp = _PyInterpreterState_GET();
419
420
322
    nameobj = PyObject_GetAttrString(spec, "name");
421
322
    if (nameobj == NULL) {
422
0
        return NULL;
423
0
    }
424
322
    name = PyUnicode_AsUTF8(nameobj);
425
322
    if (name == NULL) {
426
0
        goto error;
427
0
    }
428
429
322
    if (!check_api_version(name, module_api_version)) {
430
0
        goto error;
431
0
    }
432
433
322
    _PySlotIterator it;
434
435
322
    PyModuleDef _dummy_def = {0};
436
322
    PyModuleDef *def_like;
437
322
    if (slots) {
438
0
        assert(!original_def);
439
0
        def_like = &_dummy_def;
440
0
         _PySlotIterator_Init(&it, slots, _PySlot_KIND_MOD);
441
0
    }
442
322
    else {
443
322
        assert(original_def);
444
322
        def_like = original_def;
445
322
         _PySlotIterator_InitLegacy(&it, def_like->m_slots, _PySlot_KIND_MOD);
446
322
    }
447
322
    it.name = name;
448
449
1.54k
    while (_PySlotIterator_Next(&it)) {
450
1.22k
        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
301
            case Py_mod_exec:
457
301
                if (!original_def) {
458
0
                    if (m_exec) {
459
0
                        PyErr_Format(
460
0
                            PyExc_SystemError,
461
0
                            "module %s has multiple Py_mod_exec slots",
462
0
                            name);
463
0
                        goto error;
464
0
                    }
465
0
                    m_exec = (_Py_modexecfunc)it.current.sl_func;
466
0
                }
467
301
                break;
468
322
            case Py_mod_multiple_interpreters:
469
322
                multiple_interpreters = it.current.sl_uint64;
470
322
                break;
471
322
            case Py_mod_gil:
472
322
                {
473
322
                    uint64_t val = it.current.sl_uint64;
474
322
                    requires_gil = (val != (uint64_t)Py_MOD_GIL_NOT_USED);
475
322
                }
476
322
                break;
477
280
            case Py_mod_abi:
478
280
                if (PyABIInfo_Check(it.current.sl_ptr, name) < 0) {
479
0
                    goto error;
480
0
                }
481
280
                break;
482
280
            case Py_mod_token:
483
0
                if (original_def && original_def != it.current.sl_ptr) {
484
0
                    PyErr_Format(
485
0
                        PyExc_SystemError,
486
0
                        "module %s: arbitrary Py_mod_token not "
487
0
                        "allowed with PyModuleDef",
488
0
                        name);
489
0
                    goto error;
490
0
                }
491
0
                token = it.current.sl_ptr;
492
0
                break;
493
            // Common case: Copy a PEP 793 slot to def_like
494
0
#define DEF_SLOT_CASE(SLOT, TYPE, SL_MEMBER, MEMBER)                        \
495
0
            case SLOT:                                                      \
496
0
                do {                                                        \
497
0
                    if (original_def) {                                     \
498
0
                        TYPE orig_value = (TYPE)original_def->MEMBER;       \
499
0
                        TYPE new_value = (TYPE)it.current.SL_MEMBER;        \
500
0
                        if (orig_value != new_value) {                      \
501
0
                            PyErr_Format(                                   \
502
0
                                PyExc_SystemError,                          \
503
0
                                "module %s: %s conflicts with "             \
504
0
                                "PyModuleDef." #MEMBER,                     \
505
0
                                name, _PySlot_GetName(it.current.sl_id));   \
506
0
                            goto error;                                     \
507
0
                        }                                                   \
508
0
                    }                                                       \
509
0
                    (def_like->MEMBER) = (TYPE)it.current.SL_MEMBER;        \
510
0
                } while (0);                                                \
511
0
                break;                                                      \
512
            /////////////////////////////////////////////////////////////////
513
0
            DEF_SLOT_CASE(Py_mod_name, char*, sl_ptr, m_name)
514
0
            DEF_SLOT_CASE(Py_mod_doc, char*, sl_ptr, m_doc)
515
0
            DEF_SLOT_CASE(Py_mod_state_size, Py_ssize_t, sl_size, m_size)
516
0
            DEF_SLOT_CASE(Py_mod_methods, PyMethodDef*, sl_ptr, m_methods)
517
0
            DEF_SLOT_CASE(Py_mod_state_traverse,
518
0
                          traverseproc, sl_func, m_traverse)
519
0
            DEF_SLOT_CASE(Py_mod_state_clear, inquiry, sl_func, m_clear)
520
1.22k
            DEF_SLOT_CASE(Py_mod_state_free, freefunc, sl_func, m_free)
521
1.22k
#undef DEF_SLOT_CASE
522
1.22k
        }
523
1.22k
    }
524
322
    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
322
    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
322
    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
322
    else if (multiple_interpreters != (int64_t)(intptr_t)Py_MOD_PER_INTERPRETER_GIL_SUPPORTED
567
0
             && interp->ceval.own_gil
568
0
             && !_Py_IsMainInterpreter(interp)
569
0
             && _PyImport_CheckSubinterpIncompatibleExtensionAllowed(name) < 0)
570
0
    {
571
0
        goto error;
572
0
    }
573
574
322
    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
322
    } else {
594
322
        m = PyModule_NewObject(nameobj);
595
322
        if (m == NULL) {
596
0
            goto error;
597
0
        }
598
322
    }
599
600
322
    if (PyModule_Check(m)) {
601
322
        PyModuleObject *mod = (PyModuleObject*)m;
602
322
        mod->md_state = NULL;
603
322
        module_copy_members_from_deflike(mod, def_like);
604
322
        if (original_def) {
605
322
            assert (!token || token == original_def);
606
322
            mod->md_token = original_def;
607
322
            mod->md_token_is_def = 1;
608
322
        }
609
0
        else {
610
0
            mod->md_token = token;
611
0
        }
612
#ifdef Py_GIL_DISABLED
613
        mod->md_requires_gil = requires_gil;
614
#else
615
322
        (void)requires_gil;
616
322
#endif
617
322
        mod->md_exec = m_exec;
618
322
    } 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
322
    if (def_like->m_methods != NULL) {
647
315
        ret = _add_methods_to_object(m, nameobj, def_like->m_methods);
648
315
        if (ret != 0) {
649
0
            goto error;
650
0
        }
651
315
    }
652
653
322
    if (def_like->m_doc != NULL) {
654
286
        ret = PyModule_SetDocString(m, def_like->m_doc);
655
286
        if (ret != 0) {
656
0
            goto error;
657
0
        }
658
286
    }
659
660
322
    Py_DECREF(nameobj);
661
322
    return m;
662
663
0
error:
664
0
    Py_DECREF(nameobj);
665
0
    Py_XDECREF(m);
666
0
    return NULL;
667
322
}
668
669
PyObject *
670
PyModule_FromDefAndSpec2(PyModuleDef* def, PyObject *spec, int module_api_version)
671
322
{
672
322
    PyModuleDef_Init(def);
673
322
    return module_from_slots_and_spec(NULL, spec, module_api_version, def);
674
322
}
675
676
PyObject *
677
PyModule_FromSlotsAndSpec(const PySlot *slots, PyObject *spec)
678
0
{
679
0
    if (!slots) {
680
0
        PyErr_SetString(
681
0
            PyExc_SystemError,
682
0
            "PyModule_FromSlotsAndSpec called with NULL slots");
683
0
        return NULL;
684
0
    }
685
686
0
    return module_from_slots_and_spec(slots, spec, PYTHON_API_VERSION,
687
0
                                      NULL);
688
0
}
689
690
#ifdef Py_GIL_DISABLED
691
int
692
PyUnstable_Module_SetGIL(PyObject *module, void *gil)
693
{
694
    bool requires_gil = (gil != Py_MOD_GIL_NOT_USED);
695
    if (!PyModule_Check(module)) {
696
        PyErr_BadInternalCall();
697
        return -1;
698
    }
699
    ((PyModuleObject *)module)->md_requires_gil = requires_gil;
700
    return 0;
701
}
702
#endif
703
704
static int
705
run_exec_func(PyObject *module, int (*exec)(PyObject *))
706
301
{
707
301
    int ret = exec(module);
708
301
    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
301
    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
301
    return 0;
725
301
}
726
727
static int
728
alloc_state(PyObject *module)
729
644
{
730
644
    if (!PyModule_Check(module)) {
731
0
        PyErr_Format(PyExc_TypeError, "expected module, got %T", module);
732
0
        return -1;
733
0
    }
734
644
    PyModuleObject *md = (PyModuleObject*)module;
735
736
644
    if (md->md_state_size >= 0) {
737
644
        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
322
            md->md_state = PyMem_Malloc(md->md_state_size);
741
322
            if (!md->md_state) {
742
0
                PyErr_NoMemory();
743
0
                return -1;
744
0
            }
745
322
            memset(md->md_state, 0, md->md_state_size);
746
322
        }
747
644
    }
748
644
    return 0;
749
644
}
750
751
int
752
PyModule_Exec(PyObject *module)
753
322
{
754
322
    if (alloc_state(module) < 0) {
755
0
        return -1;
756
0
    }
757
322
    PyModuleObject *md = (PyModuleObject*)module;
758
322
    if (md->md_exec) {
759
0
        assert(!md->md_token_is_def);
760
0
        return run_exec_func(module, md->md_exec);
761
0
    }
762
763
322
    PyModuleDef *def = _PyModule_GetDefOrNull(module);
764
322
    if (def) {
765
322
        return PyModule_ExecDef(module, def);
766
322
    }
767
0
    return 0;
768
322
}
769
770
int
771
PyModule_ExecDef(PyObject *module, PyModuleDef *def)
772
322
{
773
322
    if (alloc_state(module) < 0) {
774
0
        return -1;
775
0
    }
776
777
322
    assert(PyModule_Check(module));
778
779
322
    if (def->m_slots == NULL) {
780
0
        return 0;
781
0
    }
782
783
322
    _PySlotIterator it;
784
322
    _PySlotIterator_InitLegacy(&it, def->m_slots, _PySlot_KIND_MOD);
785
1.54k
    while (_PySlotIterator_Next(&it)) {
786
1.22k
        _Py_modexecfunc func;
787
1.22k
        switch (it.current.sl_id) {
788
0
            case Py_slot_invalid:
789
0
                return -1;
790
301
            case Py_mod_exec:
791
301
                func = (_Py_modexecfunc)it.current.sl_func;
792
301
                if (run_exec_func(module, func) < 0) {
793
0
                    return -1;
794
0
                }
795
301
                break;
796
1.22k
        }
797
1.22k
    }
798
322
    return 0;
799
322
}
800
801
int
802
PyModule_AddFunctions(PyObject *m, PyMethodDef *functions)
803
84
{
804
84
    int res;
805
84
    PyObject *name = PyModule_GetNameObject(m);
806
84
    if (name == NULL) {
807
0
        return -1;
808
0
    }
809
810
84
    res = _add_methods_to_object(m, name, functions);
811
84
    Py_DECREF(name);
812
84
    return res;
813
84
}
814
815
int
816
PyModule_SetDocString(PyObject *m, const char *doc)
817
349
{
818
349
    PyObject *v;
819
820
349
    v = PyUnicode_FromString(doc);
821
349
    if (v == NULL || PyObject_SetAttr(m, &_Py_ID(__doc__), v) != 0) {
822
0
        Py_XDECREF(v);
823
0
        return -1;
824
0
    }
825
349
    Py_DECREF(v);
826
349
    return 0;
827
349
}
828
829
PyObject *
830
PyModule_GetDict(PyObject *m)
831
7.30k
{
832
7.30k
    if (!PyModule_Check(m)) {
833
0
        PyErr_BadInternalCall();
834
0
        return NULL;
835
0
    }
836
7.30k
    return _PyModule_GetDict(m);  // borrowed reference
837
7.30k
}
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
84
{
878
84
    if (!PyModule_Check(mod)) {
879
0
        PyErr_BadArgument();
880
0
        return NULL;
881
0
    }
882
84
    PyObject *dict = ((PyModuleObject *)mod)->md_dict;  // borrowed reference
883
84
    if (dict == NULL || !PyDict_Check(dict)) {
884
0
        goto error;
885
0
    }
886
84
    PyObject *name;
887
84
    if (PyDict_GetItemRef(dict, &_Py_ID(__name__), &name) <= 0) {
888
        // error or not found
889
0
        goto error;
890
0
    }
891
84
    if (!PyUnicode_Check(name)) {
892
0
        Py_DECREF(name);
893
0
        goto error;
894
0
    }
895
84
    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
84
}
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
4
{
919
    // We return None to indicate "not found" or "bogus".
920
4
    if (!PyModule_Check(mod)) {
921
0
        PyErr_BadArgument();
922
0
        return NULL;
923
0
    }
924
4
    PyObject *dict = ((PyModuleObject *)mod)->md_dict;  // borrowed reference
925
4
    if (dict == NULL) {
926
        // The module has been tampered with.
927
0
        Py_RETURN_NONE;
928
0
    }
929
4
    PyObject *fileobj;
930
4
    int res = PyDict_GetItemRef(dict, &_Py_ID(__file__), &fileobj);
931
4
    if (res < 0) {
932
0
        return NULL;
933
0
    }
934
4
    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
4
        Py_RETURN_NONE;
942
4
    }
943
0
    if (!PyUnicode_Check(fileobj)) {
944
0
        Py_DECREF(fileobj);
945
0
        Py_RETURN_NONE;
946
0
    }
947
0
    return fileobj;
948
0
}
949
950
PyObject*
951
PyModule_GetFilenameObject(PyObject *mod)
952
4
{
953
4
    PyObject *fileobj = _PyModule_GetFilenameObject(mod);
954
4
    if (fileobj == NULL) {
955
0
        return NULL;
956
0
    }
957
4
    if (fileobj == Py_None) {
958
4
        PyErr_SetString(PyExc_SystemError, "module filename missing");
959
4
        return NULL;
960
4
    }
961
0
    return fileobj;
962
4
}
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
0
{
1011
0
    if (!PyModule_Check(m)) {
1012
0
        PyErr_BadArgument();
1013
0
        return NULL;
1014
0
    }
1015
0
    return _PyModule_GetDefOrNull(m);
1016
0
}
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
29.6M
{
1030
29.6M
    if (!PyModule_Check(m)) {
1031
0
        PyErr_BadArgument();
1032
0
        return NULL;
1033
0
    }
1034
29.6M
    return _PyModule_GetState(m);
1035
29.6M
}
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
516
{
1132
516
    return module_init_dict(self, self->md_dict, name, doc);
1133
516
}
1134
1135
static void
1136
module_dealloc(PyObject *self)
1137
4
{
1138
4
    PyModuleObject *m = _PyModule_CAST(self);
1139
1140
0
    PyObject_GC_UnTrack(m);
1141
1142
4
    int verbose = _Py_GetConfig()->verbose;
1143
4
    if (verbose && m->md_name) {
1144
0
        PySys_FormatStderr("# destroy %U\n", m->md_name);
1145
0
    }
1146
4
    FT_CLEAR_WEAKREFS(self, m->md_weaklist);
1147
1148
4
    assert_def_missing_or_redundant(m);
1149
    /* bpo-39824: Don't call m_free() if m_size > 0 and md_state=NULL */
1150
4
    if (m->md_state_free && (m->md_state_size <= 0 || m->md_state != NULL))
1151
0
    {
1152
0
        m->md_state_free(m);
1153
0
    }
1154
1155
4
    Py_XDECREF(m->md_dict);
1156
4
    Py_XDECREF(m->md_name);
1157
4
    if (m->md_state != NULL) {
1158
0
        PyMem_Free(m->md_state);
1159
0
    }
1160
4
    Py_TYPE(m)->tp_free((PyObject *)m);
1161
4
}
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.42M
{
1176
3.42M
    if (spec == NULL) {
1177
0
        return 0;
1178
0
    }
1179
3.42M
    PyObject *value;
1180
3.42M
    int rc = PyObject_GetOptionalAttr(spec, &_Py_ID(_initializing), &value);
1181
3.42M
    if (rc > 0) {
1182
3.25M
        rc = PyObject_IsTrue(value);
1183
3.25M
        Py_DECREF(value);
1184
3.25M
    }
1185
3.42M
    return rc;
1186
3.42M
}
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
346
{
1194
346
    if (spec == NULL) {
1195
0
         return 0;
1196
0
    }
1197
1198
346
    PyObject *value;
1199
346
    int rc = PyObject_GetOptionalAttr(spec, &_Py_ID(_uninitialized_submodules), &value);
1200
346
    if (rc > 0) {
1201
178
        rc = PySequence_Contains(value, name);
1202
178
        Py_DECREF(value);
1203
178
    }
1204
346
    return rc;
1205
346
}
1206
1207
int
1208
_PyModuleSpec_GetFileOrigin(PyObject *spec, PyObject **p_origin)
1209
350
{
1210
350
    PyObject *has_location = NULL;
1211
350
    int rc = PyObject_GetOptionalAttr(spec, &_Py_ID(has_location), &has_location);
1212
350
    if (rc <= 0) {
1213
168
        return rc;
1214
168
    }
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
182
    rc = PyObject_IsTrue(has_location);
1219
182
    Py_DECREF(has_location);
1220
182
    if (rc <= 0) {
1221
49
        return rc;
1222
49
    }
1223
    // has_location is true, so origin is a location
1224
133
    PyObject *origin = NULL;
1225
133
    rc = PyObject_GetOptionalAttr(spec, &_Py_ID(origin), &origin);
1226
133
    if (rc <= 0) {
1227
0
        return rc;
1228
0
    }
1229
133
    assert(origin != NULL);
1230
133
    if (!PyUnicode_Check(origin)) {
1231
0
        Py_DECREF(origin);
1232
0
        return 0;
1233
0
    }
1234
133
    *p_origin = origin;
1235
133
    return 1;
1236
133
}
1237
1238
int
1239
_PyModule_IsPossiblyShadowing(PyObject *origin)
1240
350
{
1241
    // origin must be a unicode subtype
1242
    // Returns 1 if the module at origin could be shadowing a module of the
1243
    // same name later in the module search path. The condition we check is basically:
1244
    // root = os.path.dirname(origin.removesuffix(os.sep + "__init__.py"))
1245
    // return not sys.flags.safe_path and root == (sys.path[0] or os.getcwd())
1246
    // Returns 0 otherwise (or if we aren't sure)
1247
    // Returns -1 if an error occurred that should be propagated
1248
350
    if (origin == NULL) {
1249
217
        return 0;
1250
217
    }
1251
1252
    // not sys.flags.safe_path
1253
133
    const PyConfig *config = _Py_GetConfig();
1254
133
    if (config->safe_path) {
1255
0
        return 0;
1256
0
    }
1257
1258
    // root = os.path.dirname(origin.removesuffix(os.sep + "__init__.py"))
1259
133
    wchar_t root[MAXPATHLEN + 1];
1260
133
    Py_ssize_t size = PyUnicode_AsWideChar(origin, root, MAXPATHLEN);
1261
133
    if (size < 0) {
1262
0
        return -1;
1263
0
    }
1264
133
    assert(size <= MAXPATHLEN);
1265
133
    root[size] = L'\0';
1266
1267
133
    wchar_t *sep = wcsrchr(root, SEP);
1268
133
    if (sep == NULL) {
1269
0
        return 0;
1270
0
    }
1271
    // If it's a package then we need to look one directory further up
1272
133
    if (wcscmp(sep + 1, L"__init__.py") == 0) {
1273
0
        *sep = L'\0';
1274
0
        sep = wcsrchr(root, SEP);
1275
0
        if (sep == NULL) {
1276
0
            return 0;
1277
0
        }
1278
0
    }
1279
133
    *sep = L'\0';
1280
1281
    // sys.path[0] or os.getcwd()
1282
133
    wchar_t *sys_path_0 = config->sys_path_0;
1283
133
    if (!sys_path_0) {
1284
133
        return 0;
1285
133
    }
1286
1287
0
    wchar_t sys_path_0_buf[MAXPATHLEN];
1288
0
    if (sys_path_0[0] == L'\0') {
1289
        // if sys.path[0] == "", treat it as if it were the current directory
1290
0
        if (!_Py_wgetcwd(sys_path_0_buf, MAXPATHLEN)) {
1291
            // If we failed to getcwd, don't raise an exception and instead
1292
            // let the caller proceed assuming no shadowing
1293
0
            return 0;
1294
0
        }
1295
0
        sys_path_0 = sys_path_0_buf;
1296
0
    }
1297
1298
0
    int result = wcscmp(sys_path_0, root) == 0;
1299
0
    return result;
1300
0
}
1301
1302
static PyObject *
1303
try_load_lazy_submodule(PyModuleObject *m, PyObject *name)
1304
2.52k
{
1305
2.52k
    PyObject *mod_name;
1306
2.52k
    int rc = PyDict_GetItemRef(m->md_dict, &_Py_ID(__name__), &mod_name);
1307
2.52k
    if (rc <= 0) {
1308
0
        return NULL;
1309
0
    }
1310
2.52k
    if (!PyUnicode_Check(mod_name)) {
1311
0
        Py_DECREF(mod_name);
1312
0
        return NULL;
1313
0
    }
1314
2.52k
    PyObject *result = NULL;
1315
2.52k
    _PyLazySubmoduleImportResult status =
1316
2.52k
        _PyImport_TryLoadLazySubmodule(mod_name, name, &result);
1317
2.52k
    Py_DECREF(mod_name);
1318
2.52k
    if (status != _Py_LAZY_SUBMODULE_LOADED) {
1319
2.52k
        assert(status == _Py_LAZY_SUBMODULE_ERROR ||
1320
2.52k
               status == _Py_LAZY_SUBMODULE_NOT_FOUND);
1321
2.52k
        return NULL;
1322
2.52k
    }
1323
0
    if (PyDict_SetItem(m->md_dict, name, result) < 0) {
1324
0
        Py_DECREF(result);
1325
0
        return NULL;
1326
0
    }
1327
0
    return result;
1328
0
}
1329
1330
PyObject*
1331
_Py_module_getattro_impl(PyModuleObject *m, PyObject *name, int suppress)
1332
4.93M
{
1333
    // When suppress=1, this function suppresses AttributeError.
1334
4.93M
    PyObject *attr, *mod_name, *getattr;
1335
4.93M
    attr = _PyObject_GenericGetAttrWithDict((PyObject *)m, name, NULL, suppress);
1336
4.93M
    if (attr) {
1337
4.93M
        if (PyLazyImport_CheckExact(attr)) {
1338
            // gh-144957: Module __getattr__ should get a chance to provide
1339
            // the attribute before resolving a lazy import placeholder.
1340
0
            if (PyDict_GetItemRef(m->md_dict, &_Py_ID(__getattr__), &getattr) < 0) {
1341
0
                Py_DECREF(attr);
1342
0
                return NULL;
1343
0
            }
1344
0
            if (getattr) {
1345
0
                PyObject *result = PyObject_CallOneArg(getattr, name);
1346
0
                Py_DECREF(getattr);
1347
0
                if (result != NULL) {
1348
0
                    Py_DECREF(attr);
1349
0
                    return result;
1350
0
                }
1351
0
                if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
1352
0
                    Py_DECREF(attr);
1353
0
                    return NULL;
1354
0
                }
1355
0
                PyErr_Clear();
1356
0
            }
1357
0
            PyObject *new_value = _PyImport_LoadLazyImportTstate(
1358
0
                PyThreadState_GET(), attr);
1359
0
            if (new_value == NULL) {
1360
0
                if (suppress &&
1361
0
                    PyErr_ExceptionMatches(PyExc_ImportCycleError)) {
1362
                    // ImportCycleError is raised when a lazy object tries
1363
                    // to import itself. In this case, the error should not
1364
                    // propagate to the caller and instead treated as if the
1365
                    // attribute doesn't exist.
1366
0
                    PyErr_Clear();
1367
0
                }
1368
0
                Py_DECREF(attr);
1369
0
                return NULL;
1370
0
            }
1371
1372
0
            if (PyDict_SetItem(m->md_dict, name, new_value) < 0) {
1373
0
                Py_CLEAR(new_value);
1374
0
            }
1375
0
            Py_DECREF(attr);
1376
0
            return new_value;
1377
0
        }
1378
4.93M
        return attr;
1379
4.93M
    }
1380
2.52k
    if (suppress == 1) {
1381
2.17k
        if (PyErr_Occurred()) {
1382
            // pass up non-AttributeError exception
1383
0
            return NULL;
1384
0
        }
1385
2.17k
    }
1386
346
    else {
1387
346
        if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
1388
            // pass up non-AttributeError exception
1389
0
            return NULL;
1390
0
        }
1391
346
        PyErr_Clear();
1392
346
    }
1393
2.52k
    assert(m->md_dict != NULL);
1394
2.52k
    attr = try_load_lazy_submodule(m, name);
1395
2.52k
    if (attr != NULL) {
1396
0
        return attr;
1397
0
    }
1398
2.52k
    if (PyErr_Occurred()) {
1399
0
        return NULL;
1400
0
    }
1401
2.52k
    if (PyDict_GetItemRef(m->md_dict, &_Py_ID(__getattr__), &getattr) < 0) {
1402
0
        return NULL;
1403
0
    }
1404
2.52k
    if (getattr) {
1405
48
        PyObject *result = PyObject_CallOneArg(getattr, name);
1406
48
        if (result == NULL && suppress == 1 && PyErr_ExceptionMatches(PyExc_AttributeError)) {
1407
            // suppress AttributeError
1408
48
            PyErr_Clear();
1409
48
        }
1410
48
        Py_DECREF(getattr);
1411
48
        return result;
1412
48
    }
1413
1414
    // The attribute was not found.  We make a best effort attempt at a useful error message,
1415
    // but only if we're not suppressing AttributeError.
1416
2.47k
    if (suppress == 1) {
1417
2.13k
        return NULL;
1418
2.13k
    }
1419
346
    if (PyDict_GetItemRef(m->md_dict, &_Py_ID(__name__), &mod_name) < 0) {
1420
0
        return NULL;
1421
0
    }
1422
346
    if (!mod_name || !PyUnicode_Check(mod_name)) {
1423
0
        Py_XDECREF(mod_name);
1424
0
        PyErr_Format(PyExc_AttributeError,
1425
0
                    "module has no attribute '%U'", name);
1426
0
        return NULL;
1427
0
    }
1428
346
    PyObject *spec;
1429
346
    if (PyDict_GetItemRef(m->md_dict, &_Py_ID(__spec__), &spec) < 0) {
1430
0
        Py_DECREF(mod_name);
1431
0
        return NULL;
1432
0
    }
1433
346
    if (spec == NULL) {
1434
0
        PyErr_Format(PyExc_AttributeError,
1435
0
                     "module '%U' has no attribute '%U'",
1436
0
                     mod_name, name);
1437
0
        Py_DECREF(mod_name);
1438
0
        return NULL;
1439
0
    }
1440
1441
346
    PyObject *origin = NULL;
1442
346
    if (_PyModuleSpec_GetFileOrigin(spec, &origin) < 0) {
1443
0
        goto done;
1444
0
    }
1445
1446
346
    int is_possibly_shadowing = _PyModule_IsPossiblyShadowing(origin);
1447
346
    if (is_possibly_shadowing < 0) {
1448
0
        goto done;
1449
0
    }
1450
346
    int is_possibly_shadowing_stdlib = 0;
1451
346
    if (is_possibly_shadowing) {
1452
0
        PyObject *stdlib_modules;
1453
0
        if (PySys_GetOptionalAttrString("stdlib_module_names", &stdlib_modules) < 0) {
1454
0
            goto done;
1455
0
        }
1456
0
        if (stdlib_modules && PyAnySet_Check(stdlib_modules)) {
1457
0
            is_possibly_shadowing_stdlib = PySet_Contains(stdlib_modules, mod_name);
1458
0
            if (is_possibly_shadowing_stdlib < 0) {
1459
0
                Py_DECREF(stdlib_modules);
1460
0
                goto done;
1461
0
            }
1462
0
        }
1463
0
        Py_XDECREF(stdlib_modules);
1464
0
    }
1465
1466
346
    if (is_possibly_shadowing_stdlib) {
1467
0
        assert(origin);
1468
0
        PyErr_Format(PyExc_AttributeError,
1469
0
                    "module '%U' has no attribute '%U' "
1470
0
                    "(consider renaming '%U' since it has the same "
1471
0
                    "name as the standard library module named '%U' "
1472
0
                    "and prevents importing that standard library module)",
1473
0
                    mod_name, name, origin, mod_name);
1474
0
    }
1475
346
    else {
1476
346
        int rc = _PyModuleSpec_IsInitializing(spec);
1477
346
        if (rc < 0) {
1478
0
            goto done;
1479
0
        }
1480
346
        else if (rc > 0) {
1481
0
            if (is_possibly_shadowing) {
1482
0
                assert(origin);
1483
                // For non-stdlib modules, only mention the possibility of
1484
                // shadowing if the module is being initialized.
1485
0
                PyErr_Format(PyExc_AttributeError,
1486
0
                            "module '%U' has no attribute '%U' "
1487
0
                            "(consider renaming '%U' if it has the same name "
1488
0
                            "as a library you intended to import)",
1489
0
                            mod_name, name, origin);
1490
0
            }
1491
0
            else if (origin) {
1492
0
                PyErr_Format(PyExc_AttributeError,
1493
0
                            "partially initialized "
1494
0
                            "module '%U' from '%U' has no attribute '%U' "
1495
0
                            "(most likely due to a circular import)",
1496
0
                            mod_name, origin, name);
1497
0
            }
1498
0
            else {
1499
0
                PyErr_Format(PyExc_AttributeError,
1500
0
                            "partially initialized "
1501
0
                            "module '%U' has no attribute '%U' "
1502
0
                            "(most likely due to a circular import)",
1503
0
                            mod_name, name);
1504
0
            }
1505
0
        }
1506
346
        else {
1507
346
            assert(rc == 0);
1508
346
            rc = _PyModuleSpec_IsUninitializedSubmodule(spec, name);
1509
346
            if (rc > 0) {
1510
0
                PyErr_Format(PyExc_AttributeError,
1511
0
                            "cannot access submodule '%U' of module '%U' "
1512
0
                            "(most likely due to a circular import)",
1513
0
                            name, mod_name);
1514
0
            }
1515
346
            else if (rc == 0) {
1516
346
                PyErr_Format(PyExc_AttributeError,
1517
346
                            "module '%U' has no attribute '%U'",
1518
346
                            mod_name, name);
1519
346
            }
1520
346
        }
1521
346
    }
1522
1523
346
done:
1524
346
    Py_XDECREF(origin);
1525
346
    Py_DECREF(spec);
1526
346
    Py_DECREF(mod_name);
1527
346
    return NULL;
1528
346
}
1529
1530
1531
PyObject*
1532
_Py_module_getattro(PyObject *self, PyObject *name)
1533
112k
{
1534
112k
    PyModuleObject *m = _PyModule_CAST(self);
1535
0
    return _Py_module_getattro_impl(m, name, 0);
1536
112k
}
1537
1538
static int
1539
module_traverse(PyObject *self, visitproc visit, void *arg)
1540
26.8k
{
1541
26.8k
    PyModuleObject *m = _PyModule_CAST(self);
1542
1543
0
    assert_def_missing_or_redundant(m);
1544
    /* bpo-39824: Don't call m_traverse() if m_size > 0 and md_state=NULL */
1545
26.8k
    if (m->md_state_traverse && (m->md_state_size <= 0 || m->md_state != NULL))
1546
4.43k
    {
1547
4.43k
        int res = m->md_state_traverse((PyObject*)m, visit, arg);
1548
4.43k
        if (res)
1549
0
            return res;
1550
4.43k
    }
1551
1552
26.8k
    Py_VISIT(m->md_dict);
1553
26.8k
    return 0;
1554
26.8k
}
1555
1556
static int
1557
module_clear(PyObject *self)
1558
0
{
1559
0
    PyModuleObject *m = _PyModule_CAST(self);
1560
1561
0
    assert_def_missing_or_redundant(m);
1562
    /* bpo-39824: Don't call m_clear() if m_size > 0 and md_state=NULL */
1563
0
    if (m->md_state_clear && (m->md_state_size <= 0 || m->md_state != NULL))
1564
0
    {
1565
0
        int res = m->md_state_clear((PyObject*)m);
1566
0
        if (PyErr_Occurred()) {
1567
0
            PyErr_FormatUnraisable("Exception ignored in m_clear of module%s%V",
1568
0
                                   m->md_name ? " " : "",
1569
0
                                   m->md_name, "");
1570
0
        }
1571
0
        if (res) {
1572
0
            return res;
1573
0
        }
1574
0
    }
1575
0
    Py_CLEAR(m->md_dict);
1576
0
    return 0;
1577
0
}
1578
1579
static PyObject *
1580
module_dir(PyObject *self, PyObject *args)
1581
21
{
1582
21
    PyObject *result = NULL;
1583
21
    PyObject *dict;
1584
21
    if (PyModule_CheckExact(self)) {
1585
21
        dict = Py_NewRef(((PyModuleObject *)self)->md_dict);
1586
21
    } else {
1587
0
        dict = PyObject_GetAttr(self, &_Py_ID(__dict__));
1588
0
    }
1589
1590
21
    if (dict != NULL) {
1591
21
        if (PyDict_Check(dict)) {
1592
21
            PyObject *dirfunc = PyDict_GetItemWithError(dict, &_Py_ID(__dir__));
1593
21
            if (dirfunc) {
1594
0
                result = _PyObject_CallNoArgs(dirfunc);
1595
0
            }
1596
21
            else if (!PyErr_Occurred()) {
1597
21
                result = PyDict_Keys(dict);
1598
21
            }
1599
21
        }
1600
0
        else {
1601
0
            PyErr_Format(PyExc_TypeError, "<module>.__dict__ is not a dictionary");
1602
0
        }
1603
21
    }
1604
1605
21
    Py_XDECREF(dict);
1606
21
    return result;
1607
21
}
1608
1609
static PyMethodDef module_methods[] = {
1610
    {"__dir__", module_dir, METH_NOARGS,
1611
     PyDoc_STR("__dir__() -> list\nspecialized dir() implementation")},
1612
    {0}
1613
};
1614
1615
static PyObject *
1616
module_load_dict(PyModuleObject *m)
1617
0
{
1618
0
    PyObject *dict = PyObject_GetAttr((PyObject *)m, &_Py_ID(__dict__));
1619
0
    if (dict == NULL) {
1620
0
        return NULL;
1621
0
    }
1622
0
    if (!PyDict_Check(dict)) {
1623
0
        PyErr_Format(PyExc_TypeError, "<module>.__dict__ is not a dictionary");
1624
0
        Py_DECREF(dict);
1625
0
        return NULL;
1626
0
    }
1627
0
    return dict;
1628
0
}
1629
1630
static PyObject *
1631
module_get_annotate(PyObject *self, void *Py_UNUSED(ignored))
1632
0
{
1633
0
    PyModuleObject *m = _PyModule_CAST(self);
1634
1635
0
    PyObject *dict = module_load_dict(m);
1636
0
    if (dict == NULL) {
1637
0
        return NULL;
1638
0
    }
1639
1640
0
    PyObject *annotate;
1641
0
    if (PyDict_GetItemRef(dict, &_Py_ID(__annotate__), &annotate) == 0) {
1642
0
        annotate = Py_None;
1643
0
        if (PyDict_SetItem(dict, &_Py_ID(__annotate__), annotate) == -1) {
1644
0
            Py_CLEAR(annotate);
1645
0
        }
1646
0
    }
1647
0
    Py_DECREF(dict);
1648
0
    return annotate;
1649
0
}
1650
1651
static int
1652
module_set_annotate(PyObject *self, PyObject *value, void *Py_UNUSED(ignored))
1653
0
{
1654
0
    PyModuleObject *m = _PyModule_CAST(self);
1655
0
    if (value == NULL) {
1656
0
        PyErr_SetString(PyExc_TypeError, "cannot delete __annotate__ attribute");
1657
0
        return -1;
1658
0
    }
1659
1660
0
    PyObject *dict = module_load_dict(m);
1661
0
    if (dict == NULL) {
1662
0
        return -1;
1663
0
    }
1664
1665
0
    if (!Py_IsNone(value) && !PyCallable_Check(value)) {
1666
0
        PyErr_SetString(PyExc_TypeError, "__annotate__ must be callable or None");
1667
0
        Py_DECREF(dict);
1668
0
        return -1;
1669
0
    }
1670
1671
0
    if (PyDict_SetItem(dict, &_Py_ID(__annotate__), value) == -1) {
1672
0
        Py_DECREF(dict);
1673
0
        return -1;
1674
0
    }
1675
0
    if (!Py_IsNone(value)) {
1676
0
        if (PyDict_Pop(dict, &_Py_ID(__annotations__), NULL) == -1) {
1677
0
            Py_DECREF(dict);
1678
0
            return -1;
1679
0
        }
1680
0
    }
1681
0
    Py_DECREF(dict);
1682
0
    return 0;
1683
0
}
1684
1685
static PyObject *
1686
module_get_annotations(PyObject *self, void *Py_UNUSED(ignored))
1687
0
{
1688
0
    PyModuleObject *m = _PyModule_CAST(self);
1689
1690
0
    PyObject *dict = module_load_dict(m);
1691
0
    if (dict == NULL) {
1692
0
        return NULL;
1693
0
    }
1694
1695
0
    PyObject *annotations;
1696
0
    if (PyDict_GetItemRef(dict, &_Py_ID(__annotations__), &annotations) == 0) {
1697
0
        PyObject *spec;
1698
0
        if (PyDict_GetItemRef(m->md_dict, &_Py_ID(__spec__), &spec) < 0) {
1699
0
            Py_DECREF(dict);
1700
0
            return NULL;
1701
0
        }
1702
0
        bool is_initializing = false;
1703
0
        if (spec != NULL) {
1704
0
            int rc = _PyModuleSpec_IsInitializing(spec);
1705
0
            if (rc < 0) {
1706
0
                Py_DECREF(spec);
1707
0
                Py_DECREF(dict);
1708
0
                return NULL;
1709
0
            }
1710
0
            Py_DECREF(spec);
1711
0
            if (rc) {
1712
0
                is_initializing = true;
1713
0
            }
1714
0
        }
1715
1716
0
        PyObject *annotate;
1717
0
        int annotate_result = PyDict_GetItemRef(dict, &_Py_ID(__annotate__), &annotate);
1718
0
        if (annotate_result < 0) {
1719
0
            Py_DECREF(dict);
1720
0
            return NULL;
1721
0
        }
1722
0
        if (annotate_result == 1 && PyCallable_Check(annotate)) {
1723
0
            PyObject *one = _PyLong_GetOne();
1724
0
            annotations = _PyObject_CallOneArg(annotate, one);
1725
0
            if (annotations == NULL) {
1726
0
                Py_DECREF(annotate);
1727
0
                Py_DECREF(dict);
1728
0
                return NULL;
1729
0
            }
1730
0
            if (!PyDict_Check(annotations)) {
1731
0
                PyErr_Format(PyExc_TypeError,
1732
0
                             "__annotate__() must return a dict, not %T",
1733
0
                             annotations);
1734
0
                Py_DECREF(annotate);
1735
0
                Py_DECREF(annotations);
1736
0
                Py_DECREF(dict);
1737
0
                return NULL;
1738
0
            }
1739
0
        }
1740
0
        else {
1741
0
            annotations = PyDict_New();
1742
0
        }
1743
0
        Py_XDECREF(annotate);
1744
        // Do not cache annotations if the module is still initializing
1745
0
        if (annotations && !is_initializing) {
1746
0
            int result = PyDict_SetItem(
1747
0
                    dict, &_Py_ID(__annotations__), annotations);
1748
0
            if (result) {
1749
0
                Py_CLEAR(annotations);
1750
0
            }
1751
0
        }
1752
0
    }
1753
0
    Py_DECREF(dict);
1754
0
    return annotations;
1755
0
}
1756
1757
static int
1758
module_set_annotations(PyObject *self, PyObject *value, void *Py_UNUSED(ignored))
1759
0
{
1760
0
    PyModuleObject *m = _PyModule_CAST(self);
1761
1762
0
    PyObject *dict = module_load_dict(m);
1763
0
    if (dict == NULL) {
1764
0
        return -1;
1765
0
    }
1766
1767
0
    int ret = -1;
1768
0
    if (value != NULL) {
1769
        /* set */
1770
0
        ret = PyDict_SetItem(dict, &_Py_ID(__annotations__), value);
1771
0
    }
1772
0
    else {
1773
        /* delete */
1774
0
        ret = PyDict_Pop(dict, &_Py_ID(__annotations__), NULL);
1775
0
        if (ret == 0) {
1776
0
            PyErr_SetObject(PyExc_AttributeError, &_Py_ID(__annotations__));
1777
0
            ret = -1;
1778
0
        }
1779
0
        else if (ret > 0) {
1780
0
            ret = 0;
1781
0
        }
1782
0
    }
1783
0
    if (ret == 0 && PyDict_Pop(dict, &_Py_ID(__annotate__), NULL) < 0) {
1784
0
        ret = -1;
1785
0
    }
1786
1787
0
    Py_DECREF(dict);
1788
0
    return ret;
1789
0
}
1790
1791
static PyGetSetDef module_getsets[] = {
1792
    {"__annotations__", module_get_annotations, module_set_annotations},
1793
    {"__annotate__", module_get_annotate, module_set_annotate},
1794
    {NULL}
1795
};
1796
1797
PyTypeObject PyModule_Type = {
1798
    PyVarObject_HEAD_INIT(&PyType_Type, 0)
1799
    "module",                                   /* tp_name */
1800
    sizeof(PyModuleObject),                     /* tp_basicsize */
1801
    0,                                          /* tp_itemsize */
1802
    module_dealloc,                             /* tp_dealloc */
1803
    0,                                          /* tp_vectorcall_offset */
1804
    0,                                          /* tp_getattr */
1805
    0,                                          /* tp_setattr */
1806
    0,                                          /* tp_as_async */
1807
    module_repr,                                /* tp_repr */
1808
    0,                                          /* tp_as_number */
1809
    0,                                          /* tp_as_sequence */
1810
    0,                                          /* tp_as_mapping */
1811
    0,                                          /* tp_hash */
1812
    0,                                          /* tp_call */
1813
    0,                                          /* tp_str */
1814
    _Py_module_getattro,                        /* tp_getattro */
1815
    PyObject_GenericSetAttr,                    /* tp_setattro */
1816
    0,                                          /* tp_as_buffer */
1817
    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
1818
        Py_TPFLAGS_BASETYPE,                    /* tp_flags */
1819
    module___init____doc__,                     /* tp_doc */
1820
    module_traverse,                            /* tp_traverse */
1821
    module_clear,                               /* tp_clear */
1822
    0,                                          /* tp_richcompare */
1823
    offsetof(PyModuleObject, md_weaklist),      /* tp_weaklistoffset */
1824
    0,                                          /* tp_iter */
1825
    0,                                          /* tp_iternext */
1826
    module_methods,                             /* tp_methods */
1827
    module_members,                             /* tp_members */
1828
    module_getsets,                             /* tp_getset */
1829
    0,                                          /* tp_base */
1830
    0,                                          /* tp_dict */
1831
    0,                                          /* tp_descr_get */
1832
    0,                                          /* tp_descr_set */
1833
    offsetof(PyModuleObject, md_dict),          /* tp_dictoffset */
1834
    module___init__,                            /* tp_init */
1835
    0,                                          /* tp_alloc */
1836
    new_module,                                 /* tp_new */
1837
    PyObject_GC_Del,                            /* tp_free */
1838
};