blob: 912c2584015861c94db12863853849d281e65541 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002/* Module object implementation */
3
Guido van Rossumc0b618a1997-05-02 03:12:38 +00004#include "Python.h"
Victor Stinner621cebe2018-11-12 16:53:38 +01005#include "pycore_pystate.h"
Tim Peters6d6c1a32001-08-02 04:15:00 +00006#include "structmember.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00007
Martin v. Löwis1a214512008-06-11 05:26:20 +00008static Py_ssize_t max_module_number;
9
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000010typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000011 PyObject_HEAD
12 PyObject *md_dict;
13 struct PyModuleDef *md_def;
14 void *md_state;
Antoine Pitroudcedaf62013-07-31 23:14:08 +020015 PyObject *md_weaklist;
16 PyObject *md_name; /* for logging purposes after md_dict is cleared */
Guido van Rossumc0b618a1997-05-02 03:12:38 +000017} PyModuleObject;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000018
Neil Schemenauerf23473f2001-10-21 22:28:58 +000019static PyMemberDef module_members[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000020 {"__dict__", T_OBJECT, offsetof(PyModuleObject, md_dict), READONLY},
21 {0}
Tim Peters6d6c1a32001-08-02 04:15:00 +000022};
23
Marcel Plchc2b0b122018-03-17 06:41:20 +010024
25/* Helper for sanity check for traverse not handling m_state == NULL
26 * Issue #32374 */
27#ifdef Py_DEBUG
28static int
29bad_traverse_test(PyObject *self, void *arg) {
30 assert(self != NULL);
31 return 0;
32}
33#endif
34
Nick Coghland5cacbb2015-05-23 22:24:10 +100035PyTypeObject PyModuleDef_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000036 PyVarObject_HEAD_INIT(&PyType_Type, 0)
37 "moduledef", /* tp_name */
Peter Eisentraut0e0bc4e2018-09-10 18:46:08 +020038 sizeof(struct PyModuleDef), /* tp_basicsize */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000039 0, /* tp_itemsize */
Martin v. Löwis1a214512008-06-11 05:26:20 +000040};
41
42
Nick Coghland5cacbb2015-05-23 22:24:10 +100043PyObject*
44PyModuleDef_Init(struct PyModuleDef* def)
45{
46 if (PyType_Ready(&PyModuleDef_Type) < 0)
47 return NULL;
48 if (def->m_base.m_index == 0) {
49 max_module_number++;
50 Py_REFCNT(def) = 1;
51 Py_TYPE(def) = &PyModuleDef_Type;
52 def->m_base.m_index = max_module_number;
53 }
54 return (PyObject*)def;
55}
56
Brett Cannon4c14b5d2013-05-04 13:56:58 -040057static int
Antoine Pitroudcedaf62013-07-31 23:14:08 +020058module_init_dict(PyModuleObject *mod, PyObject *md_dict,
59 PyObject *name, PyObject *doc)
Brett Cannon4c14b5d2013-05-04 13:56:58 -040060{
Benjamin Peterson027ce162014-04-24 19:39:18 -040061 _Py_IDENTIFIER(__name__);
62 _Py_IDENTIFIER(__doc__);
63 _Py_IDENTIFIER(__package__);
64 _Py_IDENTIFIER(__loader__);
65 _Py_IDENTIFIER(__spec__);
Serhiy Storchaka009b8112015-03-18 21:53:15 +020066
Brett Cannon4c14b5d2013-05-04 13:56:58 -040067 if (md_dict == NULL)
68 return -1;
69 if (doc == NULL)
70 doc = Py_None;
71
Benjamin Peterson027ce162014-04-24 19:39:18 -040072 if (_PyDict_SetItemId(md_dict, &PyId___name__, name) != 0)
Brett Cannon4c14b5d2013-05-04 13:56:58 -040073 return -1;
Benjamin Peterson027ce162014-04-24 19:39:18 -040074 if (_PyDict_SetItemId(md_dict, &PyId___doc__, doc) != 0)
Brett Cannon4c14b5d2013-05-04 13:56:58 -040075 return -1;
Benjamin Peterson027ce162014-04-24 19:39:18 -040076 if (_PyDict_SetItemId(md_dict, &PyId___package__, Py_None) != 0)
Brett Cannon4c14b5d2013-05-04 13:56:58 -040077 return -1;
Benjamin Peterson027ce162014-04-24 19:39:18 -040078 if (_PyDict_SetItemId(md_dict, &PyId___loader__, Py_None) != 0)
Brett Cannon4c14b5d2013-05-04 13:56:58 -040079 return -1;
Benjamin Peterson027ce162014-04-24 19:39:18 -040080 if (_PyDict_SetItemId(md_dict, &PyId___spec__, Py_None) != 0)
Eric Snowb523f842013-11-22 09:05:39 -070081 return -1;
Antoine Pitroudcedaf62013-07-31 23:14:08 +020082 if (PyUnicode_CheckExact(name)) {
83 Py_INCREF(name);
Serhiy Storchaka48842712016-04-06 09:45:48 +030084 Py_XSETREF(mod->md_name, name);
Antoine Pitroudcedaf62013-07-31 23:14:08 +020085 }
Brett Cannon4c14b5d2013-05-04 13:56:58 -040086
87 return 0;
88}
89
90
Guido van Rossumc0b618a1997-05-02 03:12:38 +000091PyObject *
Victor Stinner0639b562011-03-04 12:57:07 +000092PyModule_NewObject(PyObject *name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000093{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000094 PyModuleObject *m;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000095 m = PyObject_GC_New(PyModuleObject, &PyModule_Type);
96 if (m == NULL)
97 return NULL;
98 m->md_def = NULL;
99 m->md_state = NULL;
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200100 m->md_weaklist = NULL;
101 m->md_name = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000102 m->md_dict = PyDict_New();
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200103 if (module_init_dict(m, m->md_dict, name, NULL) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000104 goto fail;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000105 PyObject_GC_Track(m);
106 return (PyObject *)m;
Guido van Rossumc45611d1993-11-17 22:58:56 +0000107
108 fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000109 Py_DECREF(m);
110 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000111}
112
Martin v. Löwis1a214512008-06-11 05:26:20 +0000113PyObject *
Victor Stinner0639b562011-03-04 12:57:07 +0000114PyModule_New(const char *name)
115{
116 PyObject *nameobj, *module;
117 nameobj = PyUnicode_FromString(name);
118 if (nameobj == NULL)
119 return NULL;
120 module = PyModule_NewObject(nameobj);
121 Py_DECREF(nameobj);
122 return module;
123}
124
Nick Coghland5cacbb2015-05-23 22:24:10 +1000125/* Check API/ABI version
126 * Issues a warning on mismatch, which is usually not fatal.
127 * Returns 0 if an exception is raised.
128 */
129static int
130check_api_version(const char *name, int module_api_version)
Martin v. Löwis1a214512008-06-11 05:26:20 +0000131{
Martin v. Löwis4d0d4712010-12-03 20:14:31 +0000132 if (module_api_version != PYTHON_API_VERSION && module_api_version != PYTHON_ABI_VERSION) {
Victor Stinner4a2b7a12010-08-13 14:03:48 +0000133 int err;
134 err = PyErr_WarnFormat(PyExc_RuntimeWarning, 1,
135 "Python C API version mismatch for module %.100s: "
136 "This Python has API version %d, module %.100s has version %d.",
137 name,
138 PYTHON_API_VERSION, name, module_api_version);
139 if (err)
Nick Coghland5cacbb2015-05-23 22:24:10 +1000140 return 0;
141 }
142 return 1;
143}
144
Nick Coghlan8682f572016-08-21 17:41:56 +1000145static int
146_add_methods_to_object(PyObject *module, PyObject *name, PyMethodDef *functions)
147{
148 PyObject *func;
149 PyMethodDef *fdef;
150
151 for (fdef = functions; fdef->ml_name != NULL; fdef++) {
152 if ((fdef->ml_flags & METH_CLASS) ||
153 (fdef->ml_flags & METH_STATIC)) {
154 PyErr_SetString(PyExc_ValueError,
155 "module functions cannot set"
156 " METH_CLASS or METH_STATIC");
157 return -1;
158 }
159 func = PyCFunction_NewEx(fdef, (PyObject*)module, name);
160 if (func == NULL) {
161 return -1;
162 }
163 if (PyObject_SetAttrString(module, fdef->ml_name, func) != 0) {
164 Py_DECREF(func);
165 return -1;
166 }
167 Py_DECREF(func);
168 }
169
170 return 0;
171}
172
Nick Coghland5cacbb2015-05-23 22:24:10 +1000173PyObject *
174PyModule_Create2(struct PyModuleDef* module, int module_api_version)
175{
Victor Stinnera94c6b62020-01-27 22:37:05 +0100176 if (!_PyImport_IsInitialized(_PyInterpreterState_Get())) {
177 PyErr_SetString(PyExc_SystemError,
178 "Python import machinery not initialized");
179 return NULL;
180 }
Eric Snowd393c1b2017-09-14 12:18:12 -0600181 return _PyModule_CreateInitialized(module, module_api_version);
182}
183
184PyObject *
185_PyModule_CreateInitialized(struct PyModuleDef* module, int module_api_version)
186{
Nick Coghland5cacbb2015-05-23 22:24:10 +1000187 const char* name;
188 PyModuleObject *m;
Eric Snowd393c1b2017-09-14 12:18:12 -0600189
Nick Coghland5cacbb2015-05-23 22:24:10 +1000190 if (!PyModuleDef_Init(module))
191 return NULL;
192 name = module->m_name;
193 if (!check_api_version(name, module_api_version)) {
194 return NULL;
195 }
196 if (module->m_slots) {
197 PyErr_Format(
198 PyExc_SystemError,
199 "module %s: PyModule_Create is incompatible with m_slots", name);
200 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000201 }
202 /* Make sure name is fully qualified.
Martin v. Löwis1a214512008-06-11 05:26:20 +0000203
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000204 This is a bit of a hack: when the shared library is loaded,
205 the module name is "package.module", but the module calls
206 PyModule_Create*() with just "module" for the name. The shared
207 library loader squirrels away the true name of the module in
208 _Py_PackageContext, and PyModule_Create*() will substitute this
209 (if the name actually matches).
210 */
211 if (_Py_PackageContext != NULL) {
Serhiy Storchakab57d9ea2016-11-21 10:25:54 +0200212 const char *p = strrchr(_Py_PackageContext, '.');
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000213 if (p != NULL && strcmp(module->m_name, p+1) == 0) {
214 name = _Py_PackageContext;
215 _Py_PackageContext = NULL;
216 }
217 }
218 if ((m = (PyModuleObject*)PyModule_New(name)) == NULL)
219 return NULL;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000220
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000221 if (module->m_size > 0) {
222 m->md_state = PyMem_MALLOC(module->m_size);
223 if (!m->md_state) {
224 PyErr_NoMemory();
225 Py_DECREF(m);
226 return NULL;
227 }
228 memset(m->md_state, 0, module->m_size);
229 }
230
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000231 if (module->m_methods != NULL) {
Nick Coghland5cacbb2015-05-23 22:24:10 +1000232 if (PyModule_AddFunctions((PyObject *) m, module->m_methods) != 0) {
Meador Inge29e49d62012-07-19 13:45:43 -0500233 Py_DECREF(m);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000234 return NULL;
Meador Inge29e49d62012-07-19 13:45:43 -0500235 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000236 }
237 if (module->m_doc != NULL) {
Nick Coghland5cacbb2015-05-23 22:24:10 +1000238 if (PyModule_SetDocString((PyObject *) m, module->m_doc) != 0) {
Meador Inge29e49d62012-07-19 13:45:43 -0500239 Py_DECREF(m);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000240 return NULL;
241 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000242 }
243 m->md_def = module;
244 return (PyObject*)m;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000245}
246
Nick Coghland5cacbb2015-05-23 22:24:10 +1000247PyObject *
248PyModule_FromDefAndSpec2(struct PyModuleDef* def, PyObject *spec, int module_api_version)
249{
250 PyModuleDef_Slot* cur_slot;
251 PyObject *(*create)(PyObject *, PyModuleDef*) = NULL;
252 PyObject *nameobj;
253 PyObject *m = NULL;
254 int has_execution_slots = 0;
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +0200255 const char *name;
Nick Coghland5cacbb2015-05-23 22:24:10 +1000256 int ret;
257
258 PyModuleDef_Init(def);
259
260 nameobj = PyObject_GetAttrString(spec, "name");
261 if (nameobj == NULL) {
262 return NULL;
263 }
264 name = PyUnicode_AsUTF8(nameobj);
265 if (name == NULL) {
266 goto error;
267 }
268
269 if (!check_api_version(name, module_api_version)) {
270 goto error;
271 }
272
273 if (def->m_size < 0) {
274 PyErr_Format(
275 PyExc_SystemError,
276 "module %s: m_size may not be negative for multi-phase initialization",
277 name);
278 goto error;
279 }
280
281 for (cur_slot = def->m_slots; cur_slot && cur_slot->slot; cur_slot++) {
282 if (cur_slot->slot == Py_mod_create) {
283 if (create) {
284 PyErr_Format(
285 PyExc_SystemError,
286 "module %s has multiple create slots",
287 name);
288 goto error;
289 }
290 create = cur_slot->value;
291 } else if (cur_slot->slot < 0 || cur_slot->slot > _Py_mod_LAST_SLOT) {
292 PyErr_Format(
293 PyExc_SystemError,
294 "module %s uses unknown slot ID %i",
295 name, cur_slot->slot);
296 goto error;
297 } else {
298 has_execution_slots = 1;
299 }
300 }
301
302 if (create) {
303 m = create(spec, def);
304 if (m == NULL) {
305 if (!PyErr_Occurred()) {
306 PyErr_Format(
307 PyExc_SystemError,
308 "creation of module %s failed without setting an exception",
309 name);
310 }
311 goto error;
312 } else {
313 if (PyErr_Occurred()) {
314 PyErr_Format(PyExc_SystemError,
315 "creation of module %s raised unreported exception",
316 name);
317 goto error;
318 }
319 }
320 } else {
Nick Coghlan8682f572016-08-21 17:41:56 +1000321 m = PyModule_NewObject(nameobj);
Nick Coghland5cacbb2015-05-23 22:24:10 +1000322 if (m == NULL) {
323 goto error;
324 }
325 }
326
327 if (PyModule_Check(m)) {
328 ((PyModuleObject*)m)->md_state = NULL;
329 ((PyModuleObject*)m)->md_def = def;
330 } else {
331 if (def->m_size > 0 || def->m_traverse || def->m_clear || def->m_free) {
332 PyErr_Format(
333 PyExc_SystemError,
334 "module %s is not a module object, but requests module state",
335 name);
336 goto error;
337 }
338 if (has_execution_slots) {
339 PyErr_Format(
340 PyExc_SystemError,
341 "module %s specifies execution slots, but did not create "
342 "a ModuleType instance",
343 name);
344 goto error;
345 }
346 }
347
348 if (def->m_methods != NULL) {
Nick Coghlan8682f572016-08-21 17:41:56 +1000349 ret = _add_methods_to_object(m, nameobj, def->m_methods);
Nick Coghland5cacbb2015-05-23 22:24:10 +1000350 if (ret != 0) {
351 goto error;
352 }
353 }
354
355 if (def->m_doc != NULL) {
356 ret = PyModule_SetDocString(m, def->m_doc);
357 if (ret != 0) {
358 goto error;
359 }
360 }
361
Marcel Plchc2b0b122018-03-17 06:41:20 +0100362 /* Sanity check for traverse not handling m_state == NULL
363 * This doesn't catch all possible cases, but in many cases it should
364 * make many cases of invalid code crash or raise Valgrind issues
365 * sooner than they would otherwise.
366 * Issue #32374 */
367#ifdef Py_DEBUG
368 if (def->m_traverse != NULL) {
369 def->m_traverse(m, bad_traverse_test, NULL);
370 }
371#endif
Nick Coghlana48db2b2015-05-24 01:03:46 +1000372 Py_DECREF(nameobj);
Nick Coghland5cacbb2015-05-23 22:24:10 +1000373 return m;
374
375error:
376 Py_DECREF(nameobj);
377 Py_XDECREF(m);
378 return NULL;
379}
380
381int
382PyModule_ExecDef(PyObject *module, PyModuleDef *def)
383{
384 PyModuleDef_Slot *cur_slot;
385 const char *name;
386 int ret;
387
388 name = PyModule_GetName(module);
389 if (name == NULL) {
390 return -1;
391 }
392
Nick Coghlan8682f572016-08-21 17:41:56 +1000393 if (def->m_size >= 0) {
Nick Coghland5cacbb2015-05-23 22:24:10 +1000394 PyModuleObject *md = (PyModuleObject*)module;
395 if (md->md_state == NULL) {
396 /* Always set a state pointer; this serves as a marker to skip
397 * multiple initialization (importlib.reload() is no-op) */
398 md->md_state = PyMem_MALLOC(def->m_size);
399 if (!md->md_state) {
400 PyErr_NoMemory();
401 return -1;
402 }
403 memset(md->md_state, 0, def->m_size);
404 }
405 }
406
407 if (def->m_slots == NULL) {
408 return 0;
409 }
410
411 for (cur_slot = def->m_slots; cur_slot && cur_slot->slot; cur_slot++) {
412 switch (cur_slot->slot) {
413 case Py_mod_create:
Serhiy Storchaka333ad922016-09-26 23:14:44 +0300414 /* handled in PyModule_FromDefAndSpec2 */
Nick Coghland5cacbb2015-05-23 22:24:10 +1000415 break;
416 case Py_mod_exec:
417 ret = ((int (*)(PyObject *))cur_slot->value)(module);
418 if (ret != 0) {
419 if (!PyErr_Occurred()) {
420 PyErr_Format(
421 PyExc_SystemError,
422 "execution of module %s failed without setting an exception",
423 name);
424 }
425 return -1;
426 }
427 if (PyErr_Occurred()) {
428 PyErr_Format(
429 PyExc_SystemError,
430 "execution of module %s raised unreported exception",
431 name);
432 return -1;
433 }
434 break;
435 default:
436 PyErr_Format(
437 PyExc_SystemError,
438 "module %s initialized with unknown slot %i",
439 name, cur_slot->slot);
440 return -1;
441 }
442 }
443 return 0;
444}
445
446int
447PyModule_AddFunctions(PyObject *m, PyMethodDef *functions)
448{
Nick Coghlan8682f572016-08-21 17:41:56 +1000449 int res;
450 PyObject *name = PyModule_GetNameObject(m);
Nick Coghland5cacbb2015-05-23 22:24:10 +1000451 if (name == NULL) {
452 return -1;
453 }
454
Nick Coghlan8682f572016-08-21 17:41:56 +1000455 res = _add_methods_to_object(m, name, functions);
Nick Coghland5cacbb2015-05-23 22:24:10 +1000456 Py_DECREF(name);
Nick Coghlan8682f572016-08-21 17:41:56 +1000457 return res;
Nick Coghland5cacbb2015-05-23 22:24:10 +1000458}
459
460int
461PyModule_SetDocString(PyObject *m, const char *doc)
462{
463 PyObject *v;
464 _Py_IDENTIFIER(__doc__);
465
466 v = PyUnicode_FromString(doc);
467 if (v == NULL || _PyObject_SetAttrId(m, &PyId___doc__, v) != 0) {
468 Py_XDECREF(v);
469 return -1;
470 }
471 Py_DECREF(v);
472 return 0;
473}
Martin v. Löwis1a214512008-06-11 05:26:20 +0000474
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000475PyObject *
Fred Drakeee238b92000-07-09 06:03:25 +0000476PyModule_GetDict(PyObject *m)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000477{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000478 PyObject *d;
479 if (!PyModule_Check(m)) {
480 PyErr_BadInternalCall();
481 return NULL;
482 }
483 d = ((PyModuleObject *)m) -> md_dict;
Berker Peksag7fbce562016-08-19 12:00:13 +0300484 assert(d != NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000485 return d;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000486}
487
Victor Stinnerbd475112011-02-23 00:21:43 +0000488PyObject*
489PyModule_GetNameObject(PyObject *m)
Guido van Rossum0558a201990-10-26 15:00:11 +0000490{
Benjamin Peterson027ce162014-04-24 19:39:18 -0400491 _Py_IDENTIFIER(__name__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000492 PyObject *d;
Victor Stinnerbd475112011-02-23 00:21:43 +0000493 PyObject *name;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000494 if (!PyModule_Check(m)) {
495 PyErr_BadArgument();
496 return NULL;
497 }
498 d = ((PyModuleObject *)m)->md_dict;
499 if (d == NULL ||
Benjamin Peterson027ce162014-04-24 19:39:18 -0400500 (name = _PyDict_GetItemId(d, &PyId___name__)) == NULL ||
Victor Stinnerbd475112011-02-23 00:21:43 +0000501 !PyUnicode_Check(name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000502 {
503 PyErr_SetString(PyExc_SystemError, "nameless module");
504 return NULL;
505 }
Victor Stinnerbd475112011-02-23 00:21:43 +0000506 Py_INCREF(name);
507 return name;
508}
509
510const char *
511PyModule_GetName(PyObject *m)
512{
513 PyObject *name = PyModule_GetNameObject(m);
514 if (name == NULL)
515 return NULL;
516 Py_DECREF(name); /* module dict has still a reference */
Serhiy Storchaka06515832016-11-20 09:13:07 +0200517 return PyUnicode_AsUTF8(name);
Guido van Rossum0558a201990-10-26 15:00:11 +0000518}
519
Victor Stinner6c00c142010-08-17 23:37:11 +0000520PyObject*
521PyModule_GetFilenameObject(PyObject *m)
Guido van Rossum98cc19f1999-02-15 14:47:16 +0000522{
Benjamin Peterson027ce162014-04-24 19:39:18 -0400523 _Py_IDENTIFIER(__file__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000524 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 ||
Benjamin Peterson027ce162014-04-24 19:39:18 -0400532 (fileobj = _PyDict_GetItemId(d, &PyId___file__)) == NULL ||
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000533 !PyUnicode_Check(fileobj))
534 {
535 PyErr_SetString(PyExc_SystemError, "module filename missing");
536 return NULL;
537 }
Victor Stinner6c00c142010-08-17 23:37:11 +0000538 Py_INCREF(fileobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000539 return fileobj;
Victor Stinner8124feb2010-05-07 00:50:12 +0000540}
541
542const char *
543PyModule_GetFilename(PyObject *m)
544{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000545 PyObject *fileobj;
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +0200546 const char *utf8;
Victor Stinner6c00c142010-08-17 23:37:11 +0000547 fileobj = PyModule_GetFilenameObject(m);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000548 if (fileobj == NULL)
549 return NULL;
Serhiy Storchaka06515832016-11-20 09:13:07 +0200550 utf8 = PyUnicode_AsUTF8(fileobj);
Victor Stinnerbd475112011-02-23 00:21:43 +0000551 Py_DECREF(fileobj); /* module dict has still a reference */
Victor Stinner6c00c142010-08-17 23:37:11 +0000552 return utf8;
Guido van Rossum98cc19f1999-02-15 14:47:16 +0000553}
554
Martin v. Löwis1a214512008-06-11 05:26:20 +0000555PyModuleDef*
556PyModule_GetDef(PyObject* m)
557{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000558 if (!PyModule_Check(m)) {
559 PyErr_BadArgument();
560 return NULL;
561 }
562 return ((PyModuleObject *)m)->md_def;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000563}
564
565void*
566PyModule_GetState(PyObject* m)
567{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000568 if (!PyModule_Check(m)) {
569 PyErr_BadArgument();
570 return NULL;
571 }
572 return ((PyModuleObject *)m)->md_state;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000573}
574
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000575void
Fred Drakeee238b92000-07-09 06:03:25 +0000576_PyModule_Clear(PyObject *m)
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000577{
Serhiy Storchaka87a5c512014-02-10 18:21:34 +0200578 PyObject *d = ((PyModuleObject *)m)->md_dict;
579 if (d != NULL)
580 _PyModule_ClearDict(d);
581}
582
583void
584_PyModule_ClearDict(PyObject *d)
585{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000586 /* To make the execution order of destructors for global
587 objects a bit more predictable, we first zap all objects
588 whose name starts with a single underscore, before we clear
589 the entire dictionary. We zap them by replacing them with
590 None, rather than deleting them from the dictionary, to
591 avoid rehashing the dictionary (to some extent). */
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000592
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000593 Py_ssize_t pos;
594 PyObject *key, *value;
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000595
Victor Stinner331a6a52019-05-27 16:39:22 +0200596 int verbose = _PyInterpreterState_GET_UNSAFE()->config.verbose;
Victor Stinnerc96be812019-05-14 17:34:56 +0200597
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000598 /* First, clear only names starting with a single underscore */
599 pos = 0;
600 while (PyDict_Next(d, &pos, &key, &value)) {
601 if (value != Py_None && PyUnicode_Check(key)) {
Brett Cannon62228db2012-04-29 14:38:11 -0400602 if (PyUnicode_READ_CHAR(key, 0) == '_' &&
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200603 PyUnicode_READ_CHAR(key, 1) != '_') {
Victor Stinnerc96be812019-05-14 17:34:56 +0200604 if (verbose > 1) {
Serhiy Storchaka06515832016-11-20 09:13:07 +0200605 const char *s = PyUnicode_AsUTF8(key);
Victor Stinnerf3f22a22010-05-19 00:03:09 +0000606 if (s != NULL)
607 PySys_WriteStderr("# clear[1] %s\n", s);
608 else
609 PyErr_Clear();
610 }
Serhiy Storchakac1a68322018-04-29 22:16:30 +0300611 if (PyDict_SetItem(d, key, Py_None) != 0) {
612 PyErr_WriteUnraisable(NULL);
613 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000614 }
615 }
616 }
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000617
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000618 /* Next, clear all names except for __builtins__ */
619 pos = 0;
620 while (PyDict_Next(d, &pos, &key, &value)) {
621 if (value != Py_None && PyUnicode_Check(key)) {
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200622 if (PyUnicode_READ_CHAR(key, 0) != '_' ||
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +0200623 !_PyUnicode_EqualToASCIIString(key, "__builtins__"))
Victor Stinnerf3f22a22010-05-19 00:03:09 +0000624 {
Victor Stinnerc96be812019-05-14 17:34:56 +0200625 if (verbose > 1) {
Serhiy Storchaka06515832016-11-20 09:13:07 +0200626 const char *s = PyUnicode_AsUTF8(key);
Victor Stinnerf3f22a22010-05-19 00:03:09 +0000627 if (s != NULL)
628 PySys_WriteStderr("# clear[2] %s\n", s);
629 else
630 PyErr_Clear();
631 }
Serhiy Storchakac1a68322018-04-29 22:16:30 +0300632 if (PyDict_SetItem(d, key, Py_None) != 0) {
633 PyErr_WriteUnraisable(NULL);
634 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000635 }
636 }
637 }
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000638
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000639 /* Note: we leave __builtins__ in place, so that destructors
640 of non-global objects defined in this module can still use
641 builtins, in particularly 'None'. */
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000642
643}
644
Serhiy Storchaka18b250f2017-03-19 08:51:07 +0200645/*[clinic input]
646class module "PyModuleObject *" "&PyModule_Type"
647[clinic start generated code]*/
648/*[clinic end generated code: output=da39a3ee5e6b4b0d input=3e35d4f708ecb6af]*/
649
650#include "clinic/moduleobject.c.h"
651
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000652/* Methods */
653
Serhiy Storchaka18b250f2017-03-19 08:51:07 +0200654/*[clinic input]
655module.__init__
656 name: unicode
657 doc: object = None
658
659Create a module object.
660
661The name must be a string; the optional doc argument can have any type.
662[clinic start generated code]*/
663
Tim Peters6d6c1a32001-08-02 04:15:00 +0000664static int
Serhiy Storchaka18b250f2017-03-19 08:51:07 +0200665module___init___impl(PyModuleObject *self, PyObject *name, PyObject *doc)
666/*[clinic end generated code: output=e7e721c26ce7aad7 input=57f9e177401e5e1e]*/
Tim Peters6d6c1a32001-08-02 04:15:00 +0000667{
Serhiy Storchaka18b250f2017-03-19 08:51:07 +0200668 PyObject *dict = self->md_dict;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000669 if (dict == NULL) {
670 dict = PyDict_New();
671 if (dict == NULL)
672 return -1;
Serhiy Storchaka18b250f2017-03-19 08:51:07 +0200673 self->md_dict = dict;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000674 }
Serhiy Storchaka18b250f2017-03-19 08:51:07 +0200675 if (module_init_dict(self, dict, name, doc) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000676 return -1;
677 return 0;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000678}
679
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000680static void
Fred Drakeee238b92000-07-09 06:03:25 +0000681module_dealloc(PyModuleObject *m)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000682{
Victor Stinner331a6a52019-05-27 16:39:22 +0200683 int verbose = _PyInterpreterState_GET_UNSAFE()->config.verbose;
Victor Stinnerc96be812019-05-14 17:34:56 +0200684
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000685 PyObject_GC_UnTrack(m);
Victor Stinnerc96be812019-05-14 17:34:56 +0200686 if (verbose && m->md_name) {
Serhiy Storchakad7c38732019-10-08 13:46:17 +0300687 PySys_FormatStderr("# destroy %U\n", m->md_name);
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200688 }
689 if (m->md_weaklist != NULL)
690 PyObject_ClearWeakRefs((PyObject *) m);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000691 if (m->md_def && m->md_def->m_free)
692 m->md_def->m_free(m);
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200693 Py_XDECREF(m->md_dict);
694 Py_XDECREF(m->md_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000695 if (m->md_state != NULL)
696 PyMem_FREE(m->md_state);
697 Py_TYPE(m)->tp_free((PyObject *)m);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000698}
699
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000700static PyObject *
Fred Drakeee238b92000-07-09 06:03:25 +0000701module_repr(PyModuleObject *m)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000702{
Victor Stinnercaba55b2018-08-03 15:33:52 +0200703 PyInterpreterState *interp = _PyInterpreterState_Get();
Barry Warsaw2907fe62001-08-16 20:39:24 +0000704
Eric Snowb523f842013-11-22 09:05:39 -0700705 return PyObject_CallMethod(interp->importlib, "_module_repr", "O", m);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000706}
707
Serhiy Storchaka3e429dc2018-10-30 13:19:51 +0200708/* Check if the "_initializing" attribute of the module spec is set to true.
709 Clear the exception and return 0 if spec is NULL.
710 */
711int
712_PyModuleSpec_IsInitializing(PyObject *spec)
713{
714 if (spec != NULL) {
715 _Py_IDENTIFIER(_initializing);
716 PyObject *value = _PyObject_GetAttrId(spec, &PyId__initializing);
717 if (value != NULL) {
718 int initializing = PyObject_IsTrue(value);
719 Py_DECREF(value);
720 if (initializing >= 0) {
721 return initializing;
722 }
723 }
724 }
725 PyErr_Clear();
726 return 0;
727}
728
Ethan Furman7b9ff0e2014-04-24 14:47:47 -0700729static PyObject*
Benjamin Peterson1184e262014-04-24 19:29:23 -0400730module_getattro(PyModuleObject *m, PyObject *name)
Ethan Furman7b9ff0e2014-04-24 14:47:47 -0700731{
Ivan Levkivskyi5364b5c2017-12-14 11:59:44 +0100732 PyObject *attr, *mod_name, *getattr;
Benjamin Peterson1184e262014-04-24 19:29:23 -0400733 attr = PyObject_GenericGetAttr((PyObject *)m, name);
Ivan Levkivskyi5364b5c2017-12-14 11:59:44 +0100734 if (attr || !PyErr_ExceptionMatches(PyExc_AttributeError)) {
Ethan Furman7b9ff0e2014-04-24 14:47:47 -0700735 return attr;
Ivan Levkivskyi5364b5c2017-12-14 11:59:44 +0100736 }
Ethan Furman7b9ff0e2014-04-24 14:47:47 -0700737 PyErr_Clear();
Benjamin Peterson1184e262014-04-24 19:29:23 -0400738 if (m->md_dict) {
Ivan Levkivskyi5364b5c2017-12-14 11:59:44 +0100739 _Py_IDENTIFIER(__getattr__);
740 getattr = _PyDict_GetItemId(m->md_dict, &PyId___getattr__);
741 if (getattr) {
Jeroen Demeyer196a5302019-07-04 12:31:34 +0200742 return _PyObject_CallOneArg(getattr, name);
Ivan Levkivskyi5364b5c2017-12-14 11:59:44 +0100743 }
Benjamin Peterson027ce162014-04-24 19:39:18 -0400744 _Py_IDENTIFIER(__name__);
745 mod_name = _PyDict_GetItemId(m->md_dict, &PyId___name__);
Oren Milman6db70332017-09-19 14:23:01 +0300746 if (mod_name && PyUnicode_Check(mod_name)) {
Serhiy Storchaka3e429dc2018-10-30 13:19:51 +0200747 _Py_IDENTIFIER(__spec__);
748 Py_INCREF(mod_name);
749 PyObject *spec = _PyDict_GetItemId(m->md_dict, &PyId___spec__);
750 Py_XINCREF(spec);
751 if (_PyModuleSpec_IsInitializing(spec)) {
752 PyErr_Format(PyExc_AttributeError,
753 "partially initialized "
754 "module '%U' has no attribute '%U' "
755 "(most likely due to a circular import)",
756 mod_name, name);
757 }
758 else {
759 PyErr_Format(PyExc_AttributeError,
760 "module '%U' has no attribute '%U'",
761 mod_name, name);
762 }
763 Py_XDECREF(spec);
764 Py_DECREF(mod_name);
Ethan Furman7b9ff0e2014-04-24 14:47:47 -0700765 return NULL;
766 }
Ethan Furman7b9ff0e2014-04-24 14:47:47 -0700767 }
768 PyErr_Format(PyExc_AttributeError,
769 "module has no attribute '%U'", name);
770 return NULL;
771}
772
Neil Schemenauer10e31cf2001-01-02 15:58:27 +0000773static int
774module_traverse(PyModuleObject *m, visitproc visit, void *arg)
775{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000776 if (m->md_def && m->md_def->m_traverse) {
777 int res = m->md_def->m_traverse((PyObject*)m, visit, arg);
778 if (res)
779 return res;
780 }
781 Py_VISIT(m->md_dict);
782 return 0;
Neil Schemenauer10e31cf2001-01-02 15:58:27 +0000783}
784
Martin v. Löwis1a214512008-06-11 05:26:20 +0000785static int
786module_clear(PyModuleObject *m)
787{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000788 if (m->md_def && m->md_def->m_clear) {
789 int res = m->md_def->m_clear((PyObject*)m);
Serhiy Storchakad7c38732019-10-08 13:46:17 +0300790 if (PyErr_Occurred()) {
791 PySys_FormatStderr("Exception ignored in m_clear of module%s%V\n",
792 m->md_name ? " " : "",
793 m->md_name, "");
794 PyErr_WriteUnraisable(NULL);
795 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000796 if (res)
797 return res;
798 }
799 Py_CLEAR(m->md_dict);
800 return 0;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000801}
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000802
Benjamin Peterson82b00c12011-05-24 11:09:06 -0500803static PyObject *
804module_dir(PyObject *self, PyObject *args)
805{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200806 _Py_IDENTIFIER(__dict__);
Serhiy Storchakaa24107b2019-02-25 17:59:46 +0200807 _Py_IDENTIFIER(__dir__);
Benjamin Peterson82b00c12011-05-24 11:09:06 -0500808 PyObject *result = NULL;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +0200809 PyObject *dict = _PyObject_GetAttrId(self, &PyId___dict__);
Benjamin Peterson82b00c12011-05-24 11:09:06 -0500810
811 if (dict != NULL) {
Ivan Levkivskyi5364b5c2017-12-14 11:59:44 +0100812 if (PyDict_Check(dict)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +0200813 PyObject *dirfunc = _PyDict_GetItemIdWithError(dict, &PyId___dir__);
Ivan Levkivskyi5364b5c2017-12-14 11:59:44 +0100814 if (dirfunc) {
815 result = _PyObject_CallNoArg(dirfunc);
816 }
Serhiy Storchakaa24107b2019-02-25 17:59:46 +0200817 else if (!PyErr_Occurred()) {
Ivan Levkivskyi5364b5c2017-12-14 11:59:44 +0100818 result = PyDict_Keys(dict);
819 }
820 }
Benjamin Peterson82b00c12011-05-24 11:09:06 -0500821 else {
822 const char *name = PyModule_GetName(self);
823 if (name)
824 PyErr_Format(PyExc_TypeError,
825 "%.200s.__dict__ is not a dictionary",
826 name);
827 }
828 }
829
830 Py_XDECREF(dict);
831 return result;
832}
833
834static PyMethodDef module_methods[] = {
835 {"__dir__", module_dir, METH_NOARGS,
Benjamin Petersonc7284122011-05-24 12:46:15 -0500836 PyDoc_STR("__dir__() -> list\nspecialized dir() implementation")},
Benjamin Peterson82b00c12011-05-24 11:09:06 -0500837 {0}
838};
839
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000840PyTypeObject PyModule_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000841 PyVarObject_HEAD_INIT(&PyType_Type, 0)
842 "module", /* tp_name */
Peter Eisentraut0e0bc4e2018-09-10 18:46:08 +0200843 sizeof(PyModuleObject), /* tp_basicsize */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000844 0, /* tp_itemsize */
845 (destructor)module_dealloc, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +0200846 0, /* tp_vectorcall_offset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000847 0, /* tp_getattr */
848 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +0200849 0, /* tp_as_async */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000850 (reprfunc)module_repr, /* tp_repr */
851 0, /* tp_as_number */
852 0, /* tp_as_sequence */
853 0, /* tp_as_mapping */
854 0, /* tp_hash */
855 0, /* tp_call */
856 0, /* tp_str */
Benjamin Peterson1184e262014-04-24 19:29:23 -0400857 (getattrofunc)module_getattro, /* tp_getattro */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000858 PyObject_GenericSetAttr, /* tp_setattro */
859 0, /* tp_as_buffer */
860 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
861 Py_TPFLAGS_BASETYPE, /* tp_flags */
Serhiy Storchaka18b250f2017-03-19 08:51:07 +0200862 module___init____doc__, /* tp_doc */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000863 (traverseproc)module_traverse, /* tp_traverse */
864 (inquiry)module_clear, /* tp_clear */
865 0, /* tp_richcompare */
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200866 offsetof(PyModuleObject, md_weaklist), /* tp_weaklistoffset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000867 0, /* tp_iter */
868 0, /* tp_iternext */
Benjamin Peterson82b00c12011-05-24 11:09:06 -0500869 module_methods, /* tp_methods */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000870 module_members, /* tp_members */
871 0, /* tp_getset */
872 0, /* tp_base */
873 0, /* tp_dict */
874 0, /* tp_descr_get */
875 0, /* tp_descr_set */
876 offsetof(PyModuleObject, md_dict), /* tp_dictoffset */
Serhiy Storchaka18b250f2017-03-19 08:51:07 +0200877 module___init__, /* tp_init */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000878 PyType_GenericAlloc, /* tp_alloc */
879 PyType_GenericNew, /* tp_new */
880 PyObject_GC_Del, /* tp_free */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000881};