1 
2 /* Module object implementation */
3 
4 #include "Python.h"
5 #include "pycore_call.h"          // _PyObject_CallNoArgs()
6 #include "pycore_interp.h"        // PyInterpreterState.importlib
7 #include "pycore_object.h"        // _PyType_AllocNoTrack
8 #include "pycore_pystate.h"       // _PyInterpreterState_GET()
9 #include "pycore_moduleobject.h"  // _PyModule_GetDef()
10 #include "structmember.h"         // PyMemberDef
11 
12 static Py_ssize_t max_module_number;
13 
14 static PyMemberDef module_members[] = {
15     {"__dict__", T_OBJECT, offsetof(PyModuleObject, md_dict), READONLY},
16     {0}
17 };
18 
19 
20 PyTypeObject PyModuleDef_Type = {
21     PyVarObject_HEAD_INIT(&PyType_Type, 0)
22     "moduledef",                                /* tp_name */
23     sizeof(PyModuleDef),                        /* tp_basicsize */
24     0,                                          /* tp_itemsize */
25 };
26 
27 
28 int
_PyModule_IsExtension(PyObject * obj)29 _PyModule_IsExtension(PyObject *obj)
30 {
31     if (!PyModule_Check(obj)) {
32         return 0;
33     }
34     PyModuleObject *module = (PyModuleObject*)obj;
35 
36     PyModuleDef *def = module->md_def;
37     return (def != NULL && def->m_methods != NULL);
38 }
39 
40 
41 PyObject*
PyModuleDef_Init(PyModuleDef * def)42 PyModuleDef_Init(PyModuleDef* def)
43 {
44     assert(PyModuleDef_Type.tp_flags & Py_TPFLAGS_READY);
45     if (def->m_base.m_index == 0) {
46         max_module_number++;
47         Py_SET_REFCNT(def, 1);
48         Py_SET_TYPE(def, &PyModuleDef_Type);
49         def->m_base.m_index = max_module_number;
50     }
51     return (PyObject*)def;
52 }
53 
54 static int
module_init_dict(PyModuleObject * mod,PyObject * md_dict,PyObject * name,PyObject * doc)55 module_init_dict(PyModuleObject *mod, PyObject *md_dict,
56                  PyObject *name, PyObject *doc)
57 {
58     assert(md_dict != NULL);
59     if (doc == NULL)
60         doc = Py_None;
61 
62     if (PyDict_SetItem(md_dict, &_Py_ID(__name__), name) != 0)
63         return -1;
64     if (PyDict_SetItem(md_dict, &_Py_ID(__doc__), doc) != 0)
65         return -1;
66     if (PyDict_SetItem(md_dict, &_Py_ID(__package__), Py_None) != 0)
67         return -1;
68     if (PyDict_SetItem(md_dict, &_Py_ID(__loader__), Py_None) != 0)
69         return -1;
70     if (PyDict_SetItem(md_dict, &_Py_ID(__spec__), Py_None) != 0)
71         return -1;
72     if (PyUnicode_CheckExact(name)) {
73         Py_INCREF(name);
74         Py_XSETREF(mod->md_name, name);
75     }
76 
77     return 0;
78 }
79 
80 static PyModuleObject *
new_module_notrack(PyTypeObject * mt)81 new_module_notrack(PyTypeObject *mt)
82 {
83     PyModuleObject *m;
84     m = (PyModuleObject *)_PyType_AllocNoTrack(mt, 0);
85     if (m == NULL)
86         return NULL;
87     m->md_def = NULL;
88     m->md_state = NULL;
89     m->md_weaklist = NULL;
90     m->md_name = NULL;
91     m->md_dict = PyDict_New();
92     if (m->md_dict != NULL) {
93         return m;
94     }
95     Py_DECREF(m);
96     return NULL;
97 }
98 
99 static PyObject *
new_module(PyTypeObject * mt,PyObject * args,PyObject * kws)100 new_module(PyTypeObject *mt, PyObject *args, PyObject *kws)
101 {
102     PyObject *m = (PyObject *)new_module_notrack(mt);
103     if (m != NULL) {
104         PyObject_GC_Track(m);
105     }
106     return m;
107 }
108 
109 PyObject *
PyModule_NewObject(PyObject * name)110 PyModule_NewObject(PyObject *name)
111 {
112     PyModuleObject *m = new_module_notrack(&PyModule_Type);
113     if (m == NULL)
114         return NULL;
115     if (module_init_dict(m, m->md_dict, name, NULL) != 0)
116         goto fail;
117     PyObject_GC_Track(m);
118     return (PyObject *)m;
119 
120  fail:
121     Py_DECREF(m);
122     return NULL;
123 }
124 
125 PyObject *
PyModule_New(const char * name)126 PyModule_New(const char *name)
127 {
128     PyObject *nameobj, *module;
129     nameobj = PyUnicode_FromString(name);
130     if (nameobj == NULL)
131         return NULL;
132     module = PyModule_NewObject(nameobj);
133     Py_DECREF(nameobj);
134     return module;
135 }
136 
137 /* Check API/ABI version
138  * Issues a warning on mismatch, which is usually not fatal.
139  * Returns 0 if an exception is raised.
140  */
141 static int
check_api_version(const char * name,int module_api_version)142 check_api_version(const char *name, int module_api_version)
143 {
144     if (module_api_version != PYTHON_API_VERSION && module_api_version != PYTHON_ABI_VERSION) {
145         int err;
146         err = PyErr_WarnFormat(PyExc_RuntimeWarning, 1,
147             "Python C API version mismatch for module %.100s: "
148             "This Python has API version %d, module %.100s has version %d.",
149              name,
150              PYTHON_API_VERSION, name, module_api_version);
151         if (err)
152             return 0;
153     }
154     return 1;
155 }
156 
157 static int
_add_methods_to_object(PyObject * module,PyObject * name,PyMethodDef * functions)158 _add_methods_to_object(PyObject *module, PyObject *name, PyMethodDef *functions)
159 {
160     PyObject *func;
161     PyMethodDef *fdef;
162 
163     for (fdef = functions; fdef->ml_name != NULL; fdef++) {
164         if ((fdef->ml_flags & METH_CLASS) ||
165             (fdef->ml_flags & METH_STATIC)) {
166             PyErr_SetString(PyExc_ValueError,
167                             "module functions cannot set"
168                             " METH_CLASS or METH_STATIC");
169             return -1;
170         }
171         func = PyCFunction_NewEx(fdef, (PyObject*)module, name);
172         if (func == NULL) {
173             return -1;
174         }
175         if (PyObject_SetAttrString(module, fdef->ml_name, func) != 0) {
176             Py_DECREF(func);
177             return -1;
178         }
179         Py_DECREF(func);
180     }
181 
182     return 0;
183 }
184 
185 PyObject *
PyModule_Create2(PyModuleDef * module,int module_api_version)186 PyModule_Create2(PyModuleDef* module, int module_api_version)
187 {
188     if (!_PyImport_IsInitialized(_PyInterpreterState_GET())) {
189         PyErr_SetString(PyExc_SystemError,
190                         "Python import machinery not initialized");
191         return NULL;
192     }
193     return _PyModule_CreateInitialized(module, module_api_version);
194 }
195 
196 PyObject *
_PyModule_CreateInitialized(PyModuleDef * module,int module_api_version)197 _PyModule_CreateInitialized(PyModuleDef* module, int module_api_version)
198 {
199     const char* name;
200     PyModuleObject *m;
201 
202     if (!PyModuleDef_Init(module))
203         return NULL;
204     name = module->m_name;
205     if (!check_api_version(name, module_api_version)) {
206         return NULL;
207     }
208     if (module->m_slots) {
209         PyErr_Format(
210             PyExc_SystemError,
211             "module %s: PyModule_Create is incompatible with m_slots", name);
212         return NULL;
213     }
214     /* Make sure name is fully qualified.
215 
216        This is a bit of a hack: when the shared library is loaded,
217        the module name is "package.module", but the module calls
218        PyModule_Create*() with just "module" for the name.  The shared
219        library loader squirrels away the true name of the module in
220        _Py_PackageContext, and PyModule_Create*() will substitute this
221        (if the name actually matches).
222     */
223     if (_Py_PackageContext != NULL) {
224         const char *p = strrchr(_Py_PackageContext, '.');
225         if (p != NULL && strcmp(module->m_name, p+1) == 0) {
226             name = _Py_PackageContext;
227             _Py_PackageContext = NULL;
228         }
229     }
230     if ((m = (PyModuleObject*)PyModule_New(name)) == NULL)
231         return NULL;
232 
233     if (module->m_size > 0) {
234         m->md_state = PyMem_Malloc(module->m_size);
235         if (!m->md_state) {
236             PyErr_NoMemory();
237             Py_DECREF(m);
238             return NULL;
239         }
240         memset(m->md_state, 0, module->m_size);
241     }
242 
243     if (module->m_methods != NULL) {
244         if (PyModule_AddFunctions((PyObject *) m, module->m_methods) != 0) {
245             Py_DECREF(m);
246             return NULL;
247         }
248     }
249     if (module->m_doc != NULL) {
250         if (PyModule_SetDocString((PyObject *) m, module->m_doc) != 0) {
251             Py_DECREF(m);
252             return NULL;
253         }
254     }
255     m->md_def = module;
256     return (PyObject*)m;
257 }
258 
259 PyObject *
PyModule_FromDefAndSpec2(PyModuleDef * def,PyObject * spec,int module_api_version)260 PyModule_FromDefAndSpec2(PyModuleDef* def, PyObject *spec, int module_api_version)
261 {
262     PyModuleDef_Slot* cur_slot;
263     PyObject *(*create)(PyObject *, PyModuleDef*) = NULL;
264     PyObject *nameobj;
265     PyObject *m = NULL;
266     int has_execution_slots = 0;
267     const char *name;
268     int ret;
269 
270     PyModuleDef_Init(def);
271 
272     nameobj = PyObject_GetAttrString(spec, "name");
273     if (nameobj == NULL) {
274         return NULL;
275     }
276     name = PyUnicode_AsUTF8(nameobj);
277     if (name == NULL) {
278         goto error;
279     }
280 
281     if (!check_api_version(name, module_api_version)) {
282         goto error;
283     }
284 
285     if (def->m_size < 0) {
286         PyErr_Format(
287             PyExc_SystemError,
288             "module %s: m_size may not be negative for multi-phase initialization",
289             name);
290         goto error;
291     }
292 
293     for (cur_slot = def->m_slots; cur_slot && cur_slot->slot; cur_slot++) {
294         if (cur_slot->slot == Py_mod_create) {
295             if (create) {
296                 PyErr_Format(
297                     PyExc_SystemError,
298                     "module %s has multiple create slots",
299                     name);
300                 goto error;
301             }
302             create = cur_slot->value;
303         } else if (cur_slot->slot < 0 || cur_slot->slot > _Py_mod_LAST_SLOT) {
304             PyErr_Format(
305                 PyExc_SystemError,
306                 "module %s uses unknown slot ID %i",
307                 name, cur_slot->slot);
308             goto error;
309         } else {
310             has_execution_slots = 1;
311         }
312     }
313 
314     if (create) {
315         m = create(spec, def);
316         if (m == NULL) {
317             if (!PyErr_Occurred()) {
318                 PyErr_Format(
319                     PyExc_SystemError,
320                     "creation of module %s failed without setting an exception",
321                     name);
322             }
323             goto error;
324         } else {
325             if (PyErr_Occurred()) {
326                 PyErr_Format(PyExc_SystemError,
327                             "creation of module %s raised unreported exception",
328                             name);
329                 goto error;
330             }
331         }
332     } else {
333         m = PyModule_NewObject(nameobj);
334         if (m == NULL) {
335             goto error;
336         }
337     }
338 
339     if (PyModule_Check(m)) {
340         ((PyModuleObject*)m)->md_state = NULL;
341         ((PyModuleObject*)m)->md_def = def;
342     } else {
343         if (def->m_size > 0 || def->m_traverse || def->m_clear || def->m_free) {
344             PyErr_Format(
345                 PyExc_SystemError,
346                 "module %s is not a module object, but requests module state",
347                 name);
348             goto error;
349         }
350         if (has_execution_slots) {
351             PyErr_Format(
352                 PyExc_SystemError,
353                 "module %s specifies execution slots, but did not create "
354                     "a ModuleType instance",
355                 name);
356             goto error;
357         }
358     }
359 
360     if (def->m_methods != NULL) {
361         ret = _add_methods_to_object(m, nameobj, def->m_methods);
362         if (ret != 0) {
363             goto error;
364         }
365     }
366 
367     if (def->m_doc != NULL) {
368         ret = PyModule_SetDocString(m, def->m_doc);
369         if (ret != 0) {
370             goto error;
371         }
372     }
373 
374     Py_DECREF(nameobj);
375     return m;
376 
377 error:
378     Py_DECREF(nameobj);
379     Py_XDECREF(m);
380     return NULL;
381 }
382 
383 int
PyModule_ExecDef(PyObject * module,PyModuleDef * def)384 PyModule_ExecDef(PyObject *module, PyModuleDef *def)
385 {
386     PyModuleDef_Slot *cur_slot;
387     const char *name;
388     int ret;
389 
390     name = PyModule_GetName(module);
391     if (name == NULL) {
392         return -1;
393     }
394 
395     if (def->m_size >= 0) {
396         PyModuleObject *md = (PyModuleObject*)module;
397         if (md->md_state == NULL) {
398             /* Always set a state pointer; this serves as a marker to skip
399              * multiple initialization (importlib.reload() is no-op) */
400             md->md_state = PyMem_Malloc(def->m_size);
401             if (!md->md_state) {
402                 PyErr_NoMemory();
403                 return -1;
404             }
405             memset(md->md_state, 0, def->m_size);
406         }
407     }
408 
409     if (def->m_slots == NULL) {
410         return 0;
411     }
412 
413     for (cur_slot = def->m_slots; cur_slot && cur_slot->slot; cur_slot++) {
414         switch (cur_slot->slot) {
415             case Py_mod_create:
416                 /* handled in PyModule_FromDefAndSpec2 */
417                 break;
418             case Py_mod_exec:
419                 ret = ((int (*)(PyObject *))cur_slot->value)(module);
420                 if (ret != 0) {
421                     if (!PyErr_Occurred()) {
422                         PyErr_Format(
423                             PyExc_SystemError,
424                             "execution of module %s failed without setting an exception",
425                             name);
426                     }
427                     return -1;
428                 }
429                 if (PyErr_Occurred()) {
430                     PyErr_Format(
431                         PyExc_SystemError,
432                         "execution of module %s raised unreported exception",
433                         name);
434                     return -1;
435                 }
436                 break;
437             default:
438                 PyErr_Format(
439                     PyExc_SystemError,
440                     "module %s initialized with unknown slot %i",
441                     name, cur_slot->slot);
442                 return -1;
443         }
444     }
445     return 0;
446 }
447 
448 int
PyModule_AddFunctions(PyObject * m,PyMethodDef * functions)449 PyModule_AddFunctions(PyObject *m, PyMethodDef *functions)
450 {
451     int res;
452     PyObject *name = PyModule_GetNameObject(m);
453     if (name == NULL) {
454         return -1;
455     }
456 
457     res = _add_methods_to_object(m, name, functions);
458     Py_DECREF(name);
459     return res;
460 }
461 
462 int
PyModule_SetDocString(PyObject * m,const char * doc)463 PyModule_SetDocString(PyObject *m, const char *doc)
464 {
465     PyObject *v;
466 
467     v = PyUnicode_FromString(doc);
468     if (v == NULL || PyObject_SetAttr(m, &_Py_ID(__doc__), v) != 0) {
469         Py_XDECREF(v);
470         return -1;
471     }
472     Py_DECREF(v);
473     return 0;
474 }
475 
476 PyObject *
PyModule_GetDict(PyObject * m)477 PyModule_GetDict(PyObject *m)
478 {
479     if (!PyModule_Check(m)) {
480         PyErr_BadInternalCall();
481         return NULL;
482     }
483     return _PyModule_GetDict(m);
484 }
485 
486 PyObject*
PyModule_GetNameObject(PyObject * m)487 PyModule_GetNameObject(PyObject *m)
488 {
489     PyObject *d;
490     PyObject *name;
491     if (!PyModule_Check(m)) {
492         PyErr_BadArgument();
493         return NULL;
494     }
495     d = ((PyModuleObject *)m)->md_dict;
496     if (d == NULL || !PyDict_Check(d) ||
497         (name = PyDict_GetItemWithError(d, &_Py_ID(__name__))) == NULL ||
498         !PyUnicode_Check(name))
499     {
500         if (!PyErr_Occurred()) {
501             PyErr_SetString(PyExc_SystemError, "nameless module");
502         }
503         return NULL;
504     }
505     Py_INCREF(name);
506     return name;
507 }
508 
509 const char *
PyModule_GetName(PyObject * m)510 PyModule_GetName(PyObject *m)
511 {
512     PyObject *name = PyModule_GetNameObject(m);
513     if (name == NULL) {
514         return NULL;
515     }
516     assert(Py_REFCNT(name) >= 2);
517     Py_DECREF(name);   /* module dict has still a reference */
518     return PyUnicode_AsUTF8(name);
519 }
520 
521 PyObject*
PyModule_GetFilenameObject(PyObject * m)522 PyModule_GetFilenameObject(PyObject *m)
523 {
524     PyObject *d;
525     PyObject *fileobj;
526     if (!PyModule_Check(m)) {
527         PyErr_BadArgument();
528         return NULL;
529     }
530     d = ((PyModuleObject *)m)->md_dict;
531     if (d == NULL ||
532         (fileobj = PyDict_GetItemWithError(d, &_Py_ID(__file__))) == NULL ||
533         !PyUnicode_Check(fileobj))
534     {
535         if (!PyErr_Occurred()) {
536             PyErr_SetString(PyExc_SystemError, "module filename missing");
537         }
538         return NULL;
539     }
540     Py_INCREF(fileobj);
541     return fileobj;
542 }
543 
544 const char *
PyModule_GetFilename(PyObject * m)545 PyModule_GetFilename(PyObject *m)
546 {
547     PyObject *fileobj;
548     const char *utf8;
549     fileobj = PyModule_GetFilenameObject(m);
550     if (fileobj == NULL)
551         return NULL;
552     utf8 = PyUnicode_AsUTF8(fileobj);
553     Py_DECREF(fileobj);   /* module dict has still a reference */
554     return utf8;
555 }
556 
557 PyModuleDef*
PyModule_GetDef(PyObject * m)558 PyModule_GetDef(PyObject* m)
559 {
560     if (!PyModule_Check(m)) {
561         PyErr_BadArgument();
562         return NULL;
563     }
564     return _PyModule_GetDef(m);
565 }
566 
567 void*
PyModule_GetState(PyObject * m)568 PyModule_GetState(PyObject* m)
569 {
570     if (!PyModule_Check(m)) {
571         PyErr_BadArgument();
572         return NULL;
573     }
574     return _PyModule_GetState(m);
575 }
576 
577 void
_PyModule_Clear(PyObject * m)578 _PyModule_Clear(PyObject *m)
579 {
580     PyObject *d = ((PyModuleObject *)m)->md_dict;
581     if (d != NULL)
582         _PyModule_ClearDict(d);
583 }
584 
585 void
_PyModule_ClearDict(PyObject * d)586 _PyModule_ClearDict(PyObject *d)
587 {
588     /* To make the execution order of destructors for global
589        objects a bit more predictable, we first zap all objects
590        whose name starts with a single underscore, before we clear
591        the entire dictionary.  We zap them by replacing them with
592        None, rather than deleting them from the dictionary, to
593        avoid rehashing the dictionary (to some extent). */
594 
595     Py_ssize_t pos;
596     PyObject *key, *value;
597 
598     int verbose = _Py_GetConfig()->verbose;
599 
600     /* First, clear only names starting with a single underscore */
601     pos = 0;
602     while (PyDict_Next(d, &pos, &key, &value)) {
603         if (value != Py_None && PyUnicode_Check(key)) {
604             if (PyUnicode_READ_CHAR(key, 0) == '_' &&
605                 PyUnicode_READ_CHAR(key, 1) != '_') {
606                 if (verbose > 1) {
607                     const char *s = PyUnicode_AsUTF8(key);
608                     if (s != NULL)
609                         PySys_WriteStderr("#   clear[1] %s\n", s);
610                     else
611                         PyErr_Clear();
612                 }
613                 if (PyDict_SetItem(d, key, Py_None) != 0) {
614                     PyErr_WriteUnraisable(NULL);
615                 }
616             }
617         }
618     }
619 
620     /* Next, clear all names except for __builtins__ */
621     pos = 0;
622     while (PyDict_Next(d, &pos, &key, &value)) {
623         if (value != Py_None && PyUnicode_Check(key)) {
624             if (PyUnicode_READ_CHAR(key, 0) != '_' ||
625                 !_PyUnicode_EqualToASCIIString(key, "__builtins__"))
626             {
627                 if (verbose > 1) {
628                     const char *s = PyUnicode_AsUTF8(key);
629                     if (s != NULL)
630                         PySys_WriteStderr("#   clear[2] %s\n", s);
631                     else
632                         PyErr_Clear();
633                 }
634                 if (PyDict_SetItem(d, key, Py_None) != 0) {
635                     PyErr_WriteUnraisable(NULL);
636                 }
637             }
638         }
639     }
640 
641     /* Note: we leave __builtins__ in place, so that destructors
642        of non-global objects defined in this module can still use
643        builtins, in particularly 'None'. */
644 
645 }
646 
647 /*[clinic input]
648 class module "PyModuleObject *" "&PyModule_Type"
649 [clinic start generated code]*/
650 /*[clinic end generated code: output=da39a3ee5e6b4b0d input=3e35d4f708ecb6af]*/
651 
652 #include "clinic/moduleobject.c.h"
653 
654 /* Methods */
655 
656 /*[clinic input]
657 module.__init__
658     name: unicode
659     doc: object = None
660 
661 Create a module object.
662 
663 The name must be a string; the optional doc argument can have any type.
664 [clinic start generated code]*/
665 
666 static int
module___init___impl(PyModuleObject * self,PyObject * name,PyObject * doc)667 module___init___impl(PyModuleObject *self, PyObject *name, PyObject *doc)
668 /*[clinic end generated code: output=e7e721c26ce7aad7 input=57f9e177401e5e1e]*/
669 {
670     PyObject *dict = self->md_dict;
671     if (dict == NULL) {
672         dict = PyDict_New();
673         if (dict == NULL)
674             return -1;
675         self->md_dict = dict;
676     }
677     if (module_init_dict(self, dict, name, doc) < 0)
678         return -1;
679     return 0;
680 }
681 
682 static void
module_dealloc(PyModuleObject * m)683 module_dealloc(PyModuleObject *m)
684 {
685     int verbose = _Py_GetConfig()->verbose;
686 
687     PyObject_GC_UnTrack(m);
688     if (verbose && m->md_name) {
689         PySys_FormatStderr("# destroy %U\n", m->md_name);
690     }
691     if (m->md_weaklist != NULL)
692         PyObject_ClearWeakRefs((PyObject *) m);
693     /* bpo-39824: Don't call m_free() if m_size > 0 and md_state=NULL */
694     if (m->md_def && m->md_def->m_free
695         && (m->md_def->m_size <= 0 || m->md_state != NULL))
696     {
697         m->md_def->m_free(m);
698     }
699     Py_XDECREF(m->md_dict);
700     Py_XDECREF(m->md_name);
701     if (m->md_state != NULL)
702         PyMem_Free(m->md_state);
703     Py_TYPE(m)->tp_free((PyObject *)m);
704 }
705 
706 static PyObject *
module_repr(PyModuleObject * m)707 module_repr(PyModuleObject *m)
708 {
709     PyInterpreterState *interp = _PyInterpreterState_GET();
710 
711     return PyObject_CallMethod(interp->importlib, "_module_repr", "O", m);
712 }
713 
714 /* Check if the "_initializing" attribute of the module spec is set to true.
715    Clear the exception and return 0 if spec is NULL.
716  */
717 int
_PyModuleSpec_IsInitializing(PyObject * spec)718 _PyModuleSpec_IsInitializing(PyObject *spec)
719 {
720     if (spec != NULL) {
721         PyObject *value = PyObject_GetAttr(spec, &_Py_ID(_initializing));
722         if (value != NULL) {
723             int initializing = PyObject_IsTrue(value);
724             Py_DECREF(value);
725             if (initializing >= 0) {
726                 return initializing;
727             }
728         }
729     }
730     PyErr_Clear();
731     return 0;
732 }
733 
734 /* Check if the submodule name is in the "_uninitialized_submodules" attribute
735    of the module spec.
736  */
737 int
_PyModuleSpec_IsUninitializedSubmodule(PyObject * spec,PyObject * name)738 _PyModuleSpec_IsUninitializedSubmodule(PyObject *spec, PyObject *name)
739 {
740     if (spec == NULL) {
741          return 0;
742     }
743 
744     PyObject *value = PyObject_GetAttr(spec, &_Py_ID(_uninitialized_submodules));
745     if (value == NULL) {
746         return 0;
747     }
748 
749     int is_uninitialized = PySequence_Contains(value, name);
750     Py_DECREF(value);
751     if (is_uninitialized == -1) {
752         return 0;
753     }
754     return is_uninitialized;
755 }
756 
757 static PyObject*
module_getattro(PyModuleObject * m,PyObject * name)758 module_getattro(PyModuleObject *m, PyObject *name)
759 {
760     PyObject *attr, *mod_name, *getattr;
761     attr = PyObject_GenericGetAttr((PyObject *)m, name);
762     if (attr || !PyErr_ExceptionMatches(PyExc_AttributeError)) {
763         return attr;
764     }
765     PyErr_Clear();
766     assert(m->md_dict != NULL);
767     getattr = PyDict_GetItemWithError(m->md_dict, &_Py_ID(__getattr__));
768     if (getattr) {
769         return PyObject_CallOneArg(getattr, name);
770     }
771     if (PyErr_Occurred()) {
772         return NULL;
773     }
774     mod_name = PyDict_GetItemWithError(m->md_dict, &_Py_ID(__name__));
775     if (mod_name && PyUnicode_Check(mod_name)) {
776         Py_INCREF(mod_name);
777         PyObject *spec = PyDict_GetItemWithError(m->md_dict, &_Py_ID(__spec__));
778         if (spec == NULL && PyErr_Occurred()) {
779             Py_DECREF(mod_name);
780             return NULL;
781         }
782         Py_XINCREF(spec);
783         if (_PyModuleSpec_IsInitializing(spec)) {
784             PyErr_Format(PyExc_AttributeError,
785                             "partially initialized "
786                             "module '%U' has no attribute '%U' "
787                             "(most likely due to a circular import)",
788                             mod_name, name);
789         }
790         else if (_PyModuleSpec_IsUninitializedSubmodule(spec, name)) {
791             PyErr_Format(PyExc_AttributeError,
792                             "cannot access submodule '%U' of module '%U' "
793                             "(most likely due to a circular import)",
794                             name, mod_name);
795         }
796         else {
797             PyErr_Format(PyExc_AttributeError,
798                             "module '%U' has no attribute '%U'",
799                             mod_name, name);
800         }
801         Py_XDECREF(spec);
802         Py_DECREF(mod_name);
803         return NULL;
804     }
805     else if (PyErr_Occurred()) {
806         return NULL;
807     }
808     PyErr_Format(PyExc_AttributeError,
809                 "module has no attribute '%U'", name);
810     return NULL;
811 }
812 
813 static int
module_traverse(PyModuleObject * m,visitproc visit,void * arg)814 module_traverse(PyModuleObject *m, visitproc visit, void *arg)
815 {
816     /* bpo-39824: Don't call m_traverse() if m_size > 0 and md_state=NULL */
817     if (m->md_def && m->md_def->m_traverse
818         && (m->md_def->m_size <= 0 || m->md_state != NULL))
819     {
820         int res = m->md_def->m_traverse((PyObject*)m, visit, arg);
821         if (res)
822             return res;
823     }
824     Py_VISIT(m->md_dict);
825     return 0;
826 }
827 
828 static int
module_clear(PyModuleObject * m)829 module_clear(PyModuleObject *m)
830 {
831     /* bpo-39824: Don't call m_clear() if m_size > 0 and md_state=NULL */
832     if (m->md_def && m->md_def->m_clear
833         && (m->md_def->m_size <= 0 || m->md_state != NULL))
834     {
835         int res = m->md_def->m_clear((PyObject*)m);
836         if (PyErr_Occurred()) {
837             PySys_FormatStderr("Exception ignored in m_clear of module%s%V\n",
838                                m->md_name ? " " : "",
839                                m->md_name, "");
840             PyErr_WriteUnraisable(NULL);
841         }
842         if (res)
843             return res;
844     }
845     Py_CLEAR(m->md_dict);
846     return 0;
847 }
848 
849 static PyObject *
module_dir(PyObject * self,PyObject * args)850 module_dir(PyObject *self, PyObject *args)
851 {
852     PyObject *result = NULL;
853     PyObject *dict = PyObject_GetAttr(self, &_Py_ID(__dict__));
854 
855     if (dict != NULL) {
856         if (PyDict_Check(dict)) {
857             PyObject *dirfunc = PyDict_GetItemWithError(dict, &_Py_ID(__dir__));
858             if (dirfunc) {
859                 result = _PyObject_CallNoArgs(dirfunc);
860             }
861             else if (!PyErr_Occurred()) {
862                 result = PyDict_Keys(dict);
863             }
864         }
865         else {
866             PyErr_Format(PyExc_TypeError, "<module>.__dict__ is not a dictionary");
867         }
868     }
869 
870     Py_XDECREF(dict);
871     return result;
872 }
873 
874 static PyMethodDef module_methods[] = {
875     {"__dir__", module_dir, METH_NOARGS,
876      PyDoc_STR("__dir__() -> list\nspecialized dir() implementation")},
877     {0}
878 };
879 
880 static PyObject *
module_get_annotations(PyModuleObject * m,void * Py_UNUSED (ignored))881 module_get_annotations(PyModuleObject *m, void *Py_UNUSED(ignored))
882 {
883     PyObject *dict = PyObject_GetAttr((PyObject *)m, &_Py_ID(__dict__));
884 
885     if ((dict == NULL) || !PyDict_Check(dict)) {
886         PyErr_Format(PyExc_TypeError, "<module>.__dict__ is not a dictionary");
887         Py_XDECREF(dict);
888         return NULL;
889     }
890 
891     PyObject *annotations;
892     /* there's no _PyDict_GetItemId without WithError, so let's LBYL. */
893     if (PyDict_Contains(dict, &_Py_ID(__annotations__))) {
894         annotations = PyDict_GetItemWithError(dict, &_Py_ID(__annotations__));
895         /*
896         ** _PyDict_GetItemIdWithError could still fail,
897         ** for instance with a well-timed Ctrl-C or a MemoryError.
898         ** so let's be totally safe.
899         */
900         if (annotations) {
901             Py_INCREF(annotations);
902         }
903     } else {
904         annotations = PyDict_New();
905         if (annotations) {
906             int result = PyDict_SetItem(
907                     dict, &_Py_ID(__annotations__), annotations);
908             if (result) {
909                 Py_CLEAR(annotations);
910             }
911         }
912     }
913     Py_DECREF(dict);
914     return annotations;
915 }
916 
917 static int
module_set_annotations(PyModuleObject * m,PyObject * value,void * Py_UNUSED (ignored))918 module_set_annotations(PyModuleObject *m, PyObject *value, void *Py_UNUSED(ignored))
919 {
920     int ret = -1;
921     PyObject *dict = PyObject_GetAttr((PyObject *)m, &_Py_ID(__dict__));
922 
923     if ((dict == NULL) || !PyDict_Check(dict)) {
924         PyErr_Format(PyExc_TypeError, "<module>.__dict__ is not a dictionary");
925         goto exit;
926     }
927 
928     if (value != NULL) {
929         /* set */
930         ret = PyDict_SetItem(dict, &_Py_ID(__annotations__), value);
931         goto exit;
932     }
933 
934     /* delete */
935     if (!PyDict_Contains(dict, &_Py_ID(__annotations__))) {
936         PyErr_Format(PyExc_AttributeError, "__annotations__");
937         goto exit;
938     }
939 
940     ret = PyDict_DelItem(dict, &_Py_ID(__annotations__));
941 
942 exit:
943     Py_XDECREF(dict);
944     return ret;
945 }
946 
947 
948 static PyGetSetDef module_getsets[] = {
949     {"__annotations__", (getter)module_get_annotations, (setter)module_set_annotations},
950     {NULL}
951 };
952 
953 PyTypeObject PyModule_Type = {
954     PyVarObject_HEAD_INIT(&PyType_Type, 0)
955     "module",                                   /* tp_name */
956     sizeof(PyModuleObject),                     /* tp_basicsize */
957     0,                                          /* tp_itemsize */
958     (destructor)module_dealloc,                 /* tp_dealloc */
959     0,                                          /* tp_vectorcall_offset */
960     0,                                          /* tp_getattr */
961     0,                                          /* tp_setattr */
962     0,                                          /* tp_as_async */
963     (reprfunc)module_repr,                      /* tp_repr */
964     0,                                          /* tp_as_number */
965     0,                                          /* tp_as_sequence */
966     0,                                          /* tp_as_mapping */
967     0,                                          /* tp_hash */
968     0,                                          /* tp_call */
969     0,                                          /* tp_str */
970     (getattrofunc)module_getattro,              /* tp_getattro */
971     PyObject_GenericSetAttr,                    /* tp_setattro */
972     0,                                          /* tp_as_buffer */
973     Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
974         Py_TPFLAGS_BASETYPE,                    /* tp_flags */
975     module___init____doc__,                     /* tp_doc */
976     (traverseproc)module_traverse,              /* tp_traverse */
977     (inquiry)module_clear,                      /* tp_clear */
978     0,                                          /* tp_richcompare */
979     offsetof(PyModuleObject, md_weaklist),      /* tp_weaklistoffset */
980     0,                                          /* tp_iter */
981     0,                                          /* tp_iternext */
982     module_methods,                             /* tp_methods */
983     module_members,                             /* tp_members */
984     module_getsets,                             /* tp_getset */
985     0,                                          /* tp_base */
986     0,                                          /* tp_dict */
987     0,                                          /* tp_descr_get */
988     0,                                          /* tp_descr_set */
989     offsetof(PyModuleObject, md_dict),          /* tp_dictoffset */
990     module___init__,                            /* tp_init */
991     0,                                          /* tp_alloc */
992     new_module,                                 /* tp_new */
993     PyObject_GC_Del,                            /* tp_free */
994 };
995