blob: a6eb85bdc2a9626d1bd20266c4d8ae57818017cf [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 Stinner4a21e572020-04-15 02:35:41 +02005#include "pycore_interp.h" // PyInterpreterState.importlib
6#include "pycore_pystate.h" // _PyInterpreterState_GET()
Victor Stinnercdad2722021-04-22 00:52:52 +02007#include "pycore_moduleobject.h" // _PyModule_GetDef()
Victor Stinner4a21e572020-04-15 02:35:41 +02008#include "structmember.h" // PyMemberDef
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00009
Martin v. Löwis1a214512008-06-11 05:26:20 +000010static Py_ssize_t max_module_number;
11
Hai Shi46874c22020-01-30 17:20:25 -060012_Py_IDENTIFIER(__doc__);
13_Py_IDENTIFIER(__name__);
14_Py_IDENTIFIER(__spec__);
15
Neil Schemenauerf23473f2001-10-21 22:28:58 +000016static PyMemberDef module_members[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000017 {"__dict__", T_OBJECT, offsetof(PyModuleObject, md_dict), READONLY},
18 {0}
Tim Peters6d6c1a32001-08-02 04:15:00 +000019};
20
Marcel Plchc2b0b122018-03-17 06:41:20 +010021
Nick Coghland5cacbb2015-05-23 22:24:10 +100022PyTypeObject PyModuleDef_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000023 PyVarObject_HEAD_INIT(&PyType_Type, 0)
24 "moduledef", /* tp_name */
Peter Eisentraut0e0bc4e2018-09-10 18:46:08 +020025 sizeof(struct PyModuleDef), /* tp_basicsize */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000026 0, /* tp_itemsize */
Martin v. Löwis1a214512008-06-11 05:26:20 +000027};
28
29
Victor Stinner250035d2021-01-18 20:47:13 +010030int
31_PyModule_IsExtension(PyObject *obj)
32{
33 if (!PyModule_Check(obj)) {
34 return 0;
35 }
36 PyModuleObject *module = (PyModuleObject*)obj;
37
38 struct PyModuleDef *def = module->md_def;
39 return (def != NULL && def->m_methods != NULL);
40}
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++;
Victor Stinnerc86a1122020-02-07 01:24:29 +010050 Py_SET_REFCNT(def, 1);
Victor Stinnerd2ec81a2020-02-07 09:17:07 +010051 Py_SET_TYPE(def, &PyModuleDef_Type);
Nick Coghland5cacbb2015-05-23 22:24:10 +100052 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(__package__);
62 _Py_IDENTIFIER(__loader__);
Serhiy Storchaka009b8112015-03-18 21:53:15 +020063
Brett Cannon4c14b5d2013-05-04 13:56:58 -040064 if (md_dict == NULL)
65 return -1;
66 if (doc == NULL)
67 doc = Py_None;
68
Benjamin Peterson027ce162014-04-24 19:39:18 -040069 if (_PyDict_SetItemId(md_dict, &PyId___name__, name) != 0)
Brett Cannon4c14b5d2013-05-04 13:56:58 -040070 return -1;
Benjamin Peterson027ce162014-04-24 19:39:18 -040071 if (_PyDict_SetItemId(md_dict, &PyId___doc__, doc) != 0)
Brett Cannon4c14b5d2013-05-04 13:56:58 -040072 return -1;
Benjamin Peterson027ce162014-04-24 19:39:18 -040073 if (_PyDict_SetItemId(md_dict, &PyId___package__, Py_None) != 0)
Brett Cannon4c14b5d2013-05-04 13:56:58 -040074 return -1;
Benjamin Peterson027ce162014-04-24 19:39:18 -040075 if (_PyDict_SetItemId(md_dict, &PyId___loader__, Py_None) != 0)
Brett Cannon4c14b5d2013-05-04 13:56:58 -040076 return -1;
Benjamin Peterson027ce162014-04-24 19:39:18 -040077 if (_PyDict_SetItemId(md_dict, &PyId___spec__, Py_None) != 0)
Eric Snowb523f842013-11-22 09:05:39 -070078 return -1;
Antoine Pitroudcedaf62013-07-31 23:14:08 +020079 if (PyUnicode_CheckExact(name)) {
80 Py_INCREF(name);
Serhiy Storchaka48842712016-04-06 09:45:48 +030081 Py_XSETREF(mod->md_name, name);
Antoine Pitroudcedaf62013-07-31 23:14:08 +020082 }
Brett Cannon4c14b5d2013-05-04 13:56:58 -040083
84 return 0;
85}
86
87
Guido van Rossumc0b618a1997-05-02 03:12:38 +000088PyObject *
Victor Stinner0639b562011-03-04 12:57:07 +000089PyModule_NewObject(PyObject *name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000090{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000091 PyModuleObject *m;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000092 m = PyObject_GC_New(PyModuleObject, &PyModule_Type);
93 if (m == NULL)
94 return NULL;
95 m->md_def = NULL;
96 m->md_state = NULL;
Antoine Pitroudcedaf62013-07-31 23:14:08 +020097 m->md_weaklist = NULL;
98 m->md_name = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000099 m->md_dict = PyDict_New();
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200100 if (module_init_dict(m, m->md_dict, name, NULL) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000101 goto fail;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000102 PyObject_GC_Track(m);
103 return (PyObject *)m;
Guido van Rossumc45611d1993-11-17 22:58:56 +0000104
105 fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000106 Py_DECREF(m);
107 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000108}
109
Martin v. Löwis1a214512008-06-11 05:26:20 +0000110PyObject *
Victor Stinner0639b562011-03-04 12:57:07 +0000111PyModule_New(const char *name)
112{
113 PyObject *nameobj, *module;
114 nameobj = PyUnicode_FromString(name);
115 if (nameobj == NULL)
116 return NULL;
117 module = PyModule_NewObject(nameobj);
118 Py_DECREF(nameobj);
119 return module;
120}
121
Nick Coghland5cacbb2015-05-23 22:24:10 +1000122/* Check API/ABI version
123 * Issues a warning on mismatch, which is usually not fatal.
124 * Returns 0 if an exception is raised.
125 */
126static int
127check_api_version(const char *name, int module_api_version)
Martin v. Löwis1a214512008-06-11 05:26:20 +0000128{
Martin v. Löwis4d0d4712010-12-03 20:14:31 +0000129 if (module_api_version != PYTHON_API_VERSION && module_api_version != PYTHON_ABI_VERSION) {
Victor Stinner4a2b7a12010-08-13 14:03:48 +0000130 int err;
131 err = PyErr_WarnFormat(PyExc_RuntimeWarning, 1,
132 "Python C API version mismatch for module %.100s: "
133 "This Python has API version %d, module %.100s has version %d.",
134 name,
135 PYTHON_API_VERSION, name, module_api_version);
136 if (err)
Nick Coghland5cacbb2015-05-23 22:24:10 +1000137 return 0;
138 }
139 return 1;
140}
141
Nick Coghlan8682f572016-08-21 17:41:56 +1000142static int
143_add_methods_to_object(PyObject *module, PyObject *name, PyMethodDef *functions)
144{
145 PyObject *func;
146 PyMethodDef *fdef;
147
148 for (fdef = functions; fdef->ml_name != NULL; fdef++) {
149 if ((fdef->ml_flags & METH_CLASS) ||
150 (fdef->ml_flags & METH_STATIC)) {
151 PyErr_SetString(PyExc_ValueError,
152 "module functions cannot set"
153 " METH_CLASS or METH_STATIC");
154 return -1;
155 }
156 func = PyCFunction_NewEx(fdef, (PyObject*)module, name);
157 if (func == NULL) {
158 return -1;
159 }
160 if (PyObject_SetAttrString(module, fdef->ml_name, func) != 0) {
161 Py_DECREF(func);
162 return -1;
163 }
164 Py_DECREF(func);
165 }
166
167 return 0;
168}
169
Nick Coghland5cacbb2015-05-23 22:24:10 +1000170PyObject *
171PyModule_Create2(struct PyModuleDef* module, int module_api_version)
172{
Victor Stinner81a7be32020-04-14 15:14:01 +0200173 if (!_PyImport_IsInitialized(_PyInterpreterState_GET())) {
Victor Stinnera94c6b62020-01-27 22:37:05 +0100174 PyErr_SetString(PyExc_SystemError,
175 "Python import machinery not initialized");
176 return NULL;
177 }
Eric Snowd393c1b2017-09-14 12:18:12 -0600178 return _PyModule_CreateInitialized(module, module_api_version);
179}
180
181PyObject *
182_PyModule_CreateInitialized(struct PyModuleDef* module, int module_api_version)
183{
Nick Coghland5cacbb2015-05-23 22:24:10 +1000184 const char* name;
185 PyModuleObject *m;
Eric Snowd393c1b2017-09-14 12:18:12 -0600186
Nick Coghland5cacbb2015-05-23 22:24:10 +1000187 if (!PyModuleDef_Init(module))
188 return NULL;
189 name = module->m_name;
190 if (!check_api_version(name, module_api_version)) {
191 return NULL;
192 }
193 if (module->m_slots) {
194 PyErr_Format(
195 PyExc_SystemError,
196 "module %s: PyModule_Create is incompatible with m_slots", name);
197 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000198 }
199 /* Make sure name is fully qualified.
Martin v. Löwis1a214512008-06-11 05:26:20 +0000200
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000201 This is a bit of a hack: when the shared library is loaded,
202 the module name is "package.module", but the module calls
203 PyModule_Create*() with just "module" for the name. The shared
204 library loader squirrels away the true name of the module in
205 _Py_PackageContext, and PyModule_Create*() will substitute this
206 (if the name actually matches).
207 */
208 if (_Py_PackageContext != NULL) {
Serhiy Storchakab57d9ea2016-11-21 10:25:54 +0200209 const char *p = strrchr(_Py_PackageContext, '.');
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000210 if (p != NULL && strcmp(module->m_name, p+1) == 0) {
211 name = _Py_PackageContext;
212 _Py_PackageContext = NULL;
213 }
214 }
215 if ((m = (PyModuleObject*)PyModule_New(name)) == NULL)
216 return NULL;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000217
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000218 if (module->m_size > 0) {
Victor Stinner00d7abd2020-12-01 09:56:42 +0100219 m->md_state = PyMem_Malloc(module->m_size);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000220 if (!m->md_state) {
221 PyErr_NoMemory();
222 Py_DECREF(m);
223 return NULL;
224 }
225 memset(m->md_state, 0, module->m_size);
226 }
227
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000228 if (module->m_methods != NULL) {
Nick Coghland5cacbb2015-05-23 22:24:10 +1000229 if (PyModule_AddFunctions((PyObject *) m, module->m_methods) != 0) {
Meador Inge29e49d62012-07-19 13:45:43 -0500230 Py_DECREF(m);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000231 return NULL;
Meador Inge29e49d62012-07-19 13:45:43 -0500232 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000233 }
234 if (module->m_doc != NULL) {
Nick Coghland5cacbb2015-05-23 22:24:10 +1000235 if (PyModule_SetDocString((PyObject *) m, module->m_doc) != 0) {
Meador Inge29e49d62012-07-19 13:45:43 -0500236 Py_DECREF(m);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000237 return NULL;
238 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000239 }
240 m->md_def = module;
241 return (PyObject*)m;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000242}
243
Nick Coghland5cacbb2015-05-23 22:24:10 +1000244PyObject *
245PyModule_FromDefAndSpec2(struct PyModuleDef* def, PyObject *spec, int module_api_version)
246{
247 PyModuleDef_Slot* cur_slot;
248 PyObject *(*create)(PyObject *, PyModuleDef*) = NULL;
249 PyObject *nameobj;
250 PyObject *m = NULL;
251 int has_execution_slots = 0;
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +0200252 const char *name;
Nick Coghland5cacbb2015-05-23 22:24:10 +1000253 int ret;
254
255 PyModuleDef_Init(def);
256
257 nameobj = PyObject_GetAttrString(spec, "name");
258 if (nameobj == NULL) {
259 return NULL;
260 }
261 name = PyUnicode_AsUTF8(nameobj);
262 if (name == NULL) {
263 goto error;
264 }
265
266 if (!check_api_version(name, module_api_version)) {
267 goto error;
268 }
269
270 if (def->m_size < 0) {
271 PyErr_Format(
272 PyExc_SystemError,
273 "module %s: m_size may not be negative for multi-phase initialization",
274 name);
275 goto error;
276 }
277
278 for (cur_slot = def->m_slots; cur_slot && cur_slot->slot; cur_slot++) {
279 if (cur_slot->slot == Py_mod_create) {
280 if (create) {
281 PyErr_Format(
282 PyExc_SystemError,
283 "module %s has multiple create slots",
284 name);
285 goto error;
286 }
287 create = cur_slot->value;
288 } else if (cur_slot->slot < 0 || cur_slot->slot > _Py_mod_LAST_SLOT) {
289 PyErr_Format(
290 PyExc_SystemError,
291 "module %s uses unknown slot ID %i",
292 name, cur_slot->slot);
293 goto error;
294 } else {
295 has_execution_slots = 1;
296 }
297 }
298
299 if (create) {
300 m = create(spec, def);
301 if (m == NULL) {
302 if (!PyErr_Occurred()) {
303 PyErr_Format(
304 PyExc_SystemError,
305 "creation of module %s failed without setting an exception",
306 name);
307 }
308 goto error;
309 } else {
310 if (PyErr_Occurred()) {
311 PyErr_Format(PyExc_SystemError,
312 "creation of module %s raised unreported exception",
313 name);
314 goto error;
315 }
316 }
317 } else {
Nick Coghlan8682f572016-08-21 17:41:56 +1000318 m = PyModule_NewObject(nameobj);
Nick Coghland5cacbb2015-05-23 22:24:10 +1000319 if (m == NULL) {
320 goto error;
321 }
322 }
323
324 if (PyModule_Check(m)) {
325 ((PyModuleObject*)m)->md_state = NULL;
326 ((PyModuleObject*)m)->md_def = def;
327 } else {
328 if (def->m_size > 0 || def->m_traverse || def->m_clear || def->m_free) {
329 PyErr_Format(
330 PyExc_SystemError,
331 "module %s is not a module object, but requests module state",
332 name);
333 goto error;
334 }
335 if (has_execution_slots) {
336 PyErr_Format(
337 PyExc_SystemError,
338 "module %s specifies execution slots, but did not create "
339 "a ModuleType instance",
340 name);
341 goto error;
342 }
343 }
344
345 if (def->m_methods != NULL) {
Nick Coghlan8682f572016-08-21 17:41:56 +1000346 ret = _add_methods_to_object(m, nameobj, def->m_methods);
Nick Coghland5cacbb2015-05-23 22:24:10 +1000347 if (ret != 0) {
348 goto error;
349 }
350 }
351
352 if (def->m_doc != NULL) {
353 ret = PyModule_SetDocString(m, def->m_doc);
354 if (ret != 0) {
355 goto error;
356 }
357 }
358
Nick Coghlana48db2b2015-05-24 01:03:46 +1000359 Py_DECREF(nameobj);
Nick Coghland5cacbb2015-05-23 22:24:10 +1000360 return m;
361
362error:
363 Py_DECREF(nameobj);
364 Py_XDECREF(m);
365 return NULL;
366}
367
368int
369PyModule_ExecDef(PyObject *module, PyModuleDef *def)
370{
371 PyModuleDef_Slot *cur_slot;
372 const char *name;
373 int ret;
374
375 name = PyModule_GetName(module);
376 if (name == NULL) {
377 return -1;
378 }
379
Nick Coghlan8682f572016-08-21 17:41:56 +1000380 if (def->m_size >= 0) {
Nick Coghland5cacbb2015-05-23 22:24:10 +1000381 PyModuleObject *md = (PyModuleObject*)module;
382 if (md->md_state == NULL) {
383 /* Always set a state pointer; this serves as a marker to skip
384 * multiple initialization (importlib.reload() is no-op) */
Victor Stinner00d7abd2020-12-01 09:56:42 +0100385 md->md_state = PyMem_Malloc(def->m_size);
Nick Coghland5cacbb2015-05-23 22:24:10 +1000386 if (!md->md_state) {
387 PyErr_NoMemory();
388 return -1;
389 }
390 memset(md->md_state, 0, def->m_size);
391 }
392 }
393
394 if (def->m_slots == NULL) {
395 return 0;
396 }
397
398 for (cur_slot = def->m_slots; cur_slot && cur_slot->slot; cur_slot++) {
399 switch (cur_slot->slot) {
400 case Py_mod_create:
Serhiy Storchaka333ad922016-09-26 23:14:44 +0300401 /* handled in PyModule_FromDefAndSpec2 */
Nick Coghland5cacbb2015-05-23 22:24:10 +1000402 break;
403 case Py_mod_exec:
404 ret = ((int (*)(PyObject *))cur_slot->value)(module);
405 if (ret != 0) {
406 if (!PyErr_Occurred()) {
407 PyErr_Format(
408 PyExc_SystemError,
409 "execution of module %s failed without setting an exception",
410 name);
411 }
412 return -1;
413 }
414 if (PyErr_Occurred()) {
415 PyErr_Format(
416 PyExc_SystemError,
417 "execution of module %s raised unreported exception",
418 name);
419 return -1;
420 }
421 break;
422 default:
423 PyErr_Format(
424 PyExc_SystemError,
425 "module %s initialized with unknown slot %i",
426 name, cur_slot->slot);
427 return -1;
428 }
429 }
430 return 0;
431}
432
433int
434PyModule_AddFunctions(PyObject *m, PyMethodDef *functions)
435{
Nick Coghlan8682f572016-08-21 17:41:56 +1000436 int res;
437 PyObject *name = PyModule_GetNameObject(m);
Nick Coghland5cacbb2015-05-23 22:24:10 +1000438 if (name == NULL) {
439 return -1;
440 }
441
Nick Coghlan8682f572016-08-21 17:41:56 +1000442 res = _add_methods_to_object(m, name, functions);
Nick Coghland5cacbb2015-05-23 22:24:10 +1000443 Py_DECREF(name);
Nick Coghlan8682f572016-08-21 17:41:56 +1000444 return res;
Nick Coghland5cacbb2015-05-23 22:24:10 +1000445}
446
447int
448PyModule_SetDocString(PyObject *m, const char *doc)
449{
450 PyObject *v;
Nick Coghland5cacbb2015-05-23 22:24:10 +1000451
452 v = PyUnicode_FromString(doc);
453 if (v == NULL || _PyObject_SetAttrId(m, &PyId___doc__, v) != 0) {
454 Py_XDECREF(v);
455 return -1;
456 }
457 Py_DECREF(v);
458 return 0;
459}
Martin v. Löwis1a214512008-06-11 05:26:20 +0000460
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000461PyObject *
Fred Drakeee238b92000-07-09 06:03:25 +0000462PyModule_GetDict(PyObject *m)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000463{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000464 if (!PyModule_Check(m)) {
465 PyErr_BadInternalCall();
466 return NULL;
467 }
Victor Stinnercdad2722021-04-22 00:52:52 +0200468 return _PyModule_GetDict(m);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000469}
470
Victor Stinnerbd475112011-02-23 00:21:43 +0000471PyObject*
472PyModule_GetNameObject(PyObject *m)
Guido van Rossum0558a201990-10-26 15:00:11 +0000473{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000474 PyObject *d;
Victor Stinnerbd475112011-02-23 00:21:43 +0000475 PyObject *name;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000476 if (!PyModule_Check(m)) {
477 PyErr_BadArgument();
478 return NULL;
479 }
480 d = ((PyModuleObject *)m)->md_dict;
481 if (d == NULL ||
Serhiy Storchakafb5db7e2020-10-26 08:43:39 +0200482 (name = _PyDict_GetItemIdWithError(d, &PyId___name__)) == NULL ||
Victor Stinnerbd475112011-02-23 00:21:43 +0000483 !PyUnicode_Check(name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000484 {
Serhiy Storchakafb5db7e2020-10-26 08:43:39 +0200485 if (!PyErr_Occurred()) {
486 PyErr_SetString(PyExc_SystemError, "nameless module");
487 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000488 return NULL;
489 }
Victor Stinnerbd475112011-02-23 00:21:43 +0000490 Py_INCREF(name);
491 return name;
492}
493
494const char *
495PyModule_GetName(PyObject *m)
496{
497 PyObject *name = PyModule_GetNameObject(m);
498 if (name == NULL)
499 return NULL;
500 Py_DECREF(name); /* module dict has still a reference */
Serhiy Storchaka06515832016-11-20 09:13:07 +0200501 return PyUnicode_AsUTF8(name);
Guido van Rossum0558a201990-10-26 15:00:11 +0000502}
503
Victor Stinner6c00c142010-08-17 23:37:11 +0000504PyObject*
505PyModule_GetFilenameObject(PyObject *m)
Guido van Rossum98cc19f1999-02-15 14:47:16 +0000506{
Benjamin Peterson027ce162014-04-24 19:39:18 -0400507 _Py_IDENTIFIER(__file__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000508 PyObject *d;
509 PyObject *fileobj;
510 if (!PyModule_Check(m)) {
511 PyErr_BadArgument();
512 return NULL;
513 }
514 d = ((PyModuleObject *)m)->md_dict;
515 if (d == NULL ||
Serhiy Storchakafb5db7e2020-10-26 08:43:39 +0200516 (fileobj = _PyDict_GetItemIdWithError(d, &PyId___file__)) == NULL ||
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000517 !PyUnicode_Check(fileobj))
518 {
Serhiy Storchakafb5db7e2020-10-26 08:43:39 +0200519 if (!PyErr_Occurred()) {
520 PyErr_SetString(PyExc_SystemError, "module filename missing");
521 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000522 return NULL;
523 }
Victor Stinner6c00c142010-08-17 23:37:11 +0000524 Py_INCREF(fileobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000525 return fileobj;
Victor Stinner8124feb2010-05-07 00:50:12 +0000526}
527
528const char *
529PyModule_GetFilename(PyObject *m)
530{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000531 PyObject *fileobj;
Serhiy Storchaka85b0f5b2016-11-20 10:16:47 +0200532 const char *utf8;
Victor Stinner6c00c142010-08-17 23:37:11 +0000533 fileobj = PyModule_GetFilenameObject(m);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000534 if (fileobj == NULL)
535 return NULL;
Serhiy Storchaka06515832016-11-20 09:13:07 +0200536 utf8 = PyUnicode_AsUTF8(fileobj);
Victor Stinnerbd475112011-02-23 00:21:43 +0000537 Py_DECREF(fileobj); /* module dict has still a reference */
Victor Stinner6c00c142010-08-17 23:37:11 +0000538 return utf8;
Guido van Rossum98cc19f1999-02-15 14:47:16 +0000539}
540
Martin v. Löwis1a214512008-06-11 05:26:20 +0000541PyModuleDef*
542PyModule_GetDef(PyObject* m)
543{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000544 if (!PyModule_Check(m)) {
545 PyErr_BadArgument();
546 return NULL;
547 }
Victor Stinnercdad2722021-04-22 00:52:52 +0200548 return _PyModule_GetDef(m);
Martin v. Löwis1a214512008-06-11 05:26:20 +0000549}
550
551void*
552PyModule_GetState(PyObject* m)
553{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000554 if (!PyModule_Check(m)) {
555 PyErr_BadArgument();
556 return NULL;
557 }
Victor Stinnercdad2722021-04-22 00:52:52 +0200558 return _PyModule_GetState(m);
Martin v. Löwis1a214512008-06-11 05:26:20 +0000559}
560
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000561void
Fred Drakeee238b92000-07-09 06:03:25 +0000562_PyModule_Clear(PyObject *m)
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000563{
Serhiy Storchaka87a5c512014-02-10 18:21:34 +0200564 PyObject *d = ((PyModuleObject *)m)->md_dict;
565 if (d != NULL)
566 _PyModule_ClearDict(d);
567}
568
569void
570_PyModule_ClearDict(PyObject *d)
571{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000572 /* To make the execution order of destructors for global
573 objects a bit more predictable, we first zap all objects
574 whose name starts with a single underscore, before we clear
575 the entire dictionary. We zap them by replacing them with
576 None, rather than deleting them from the dictionary, to
577 avoid rehashing the dictionary (to some extent). */
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000578
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000579 Py_ssize_t pos;
580 PyObject *key, *value;
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000581
Victor Stinnerda7933e2020-04-13 03:04:28 +0200582 int verbose = _Py_GetConfig()->verbose;
Victor Stinnerc96be812019-05-14 17:34:56 +0200583
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000584 /* First, clear only names starting with a single underscore */
585 pos = 0;
586 while (PyDict_Next(d, &pos, &key, &value)) {
587 if (value != Py_None && PyUnicode_Check(key)) {
Brett Cannon62228db2012-04-29 14:38:11 -0400588 if (PyUnicode_READ_CHAR(key, 0) == '_' &&
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200589 PyUnicode_READ_CHAR(key, 1) != '_') {
Victor Stinnerc96be812019-05-14 17:34:56 +0200590 if (verbose > 1) {
Serhiy Storchaka06515832016-11-20 09:13:07 +0200591 const char *s = PyUnicode_AsUTF8(key);
Victor Stinnerf3f22a22010-05-19 00:03:09 +0000592 if (s != NULL)
593 PySys_WriteStderr("# clear[1] %s\n", s);
594 else
595 PyErr_Clear();
596 }
Serhiy Storchakac1a68322018-04-29 22:16:30 +0300597 if (PyDict_SetItem(d, key, Py_None) != 0) {
598 PyErr_WriteUnraisable(NULL);
599 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000600 }
601 }
602 }
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000603
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000604 /* Next, clear all names except for __builtins__ */
605 pos = 0;
606 while (PyDict_Next(d, &pos, &key, &value)) {
607 if (value != Py_None && PyUnicode_Check(key)) {
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200608 if (PyUnicode_READ_CHAR(key, 0) != '_' ||
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +0200609 !_PyUnicode_EqualToASCIIString(key, "__builtins__"))
Victor Stinnerf3f22a22010-05-19 00:03:09 +0000610 {
Victor Stinnerc96be812019-05-14 17:34:56 +0200611 if (verbose > 1) {
Serhiy Storchaka06515832016-11-20 09:13:07 +0200612 const char *s = PyUnicode_AsUTF8(key);
Victor Stinnerf3f22a22010-05-19 00:03:09 +0000613 if (s != NULL)
614 PySys_WriteStderr("# clear[2] %s\n", s);
615 else
616 PyErr_Clear();
617 }
Serhiy Storchakac1a68322018-04-29 22:16:30 +0300618 if (PyDict_SetItem(d, key, Py_None) != 0) {
619 PyErr_WriteUnraisable(NULL);
620 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000621 }
622 }
623 }
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000624
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000625 /* Note: we leave __builtins__ in place, so that destructors
626 of non-global objects defined in this module can still use
627 builtins, in particularly 'None'. */
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000628
629}
630
Serhiy Storchaka18b250f2017-03-19 08:51:07 +0200631/*[clinic input]
632class module "PyModuleObject *" "&PyModule_Type"
633[clinic start generated code]*/
634/*[clinic end generated code: output=da39a3ee5e6b4b0d input=3e35d4f708ecb6af]*/
635
636#include "clinic/moduleobject.c.h"
637
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000638/* Methods */
639
Serhiy Storchaka18b250f2017-03-19 08:51:07 +0200640/*[clinic input]
641module.__init__
642 name: unicode
643 doc: object = None
644
645Create a module object.
646
647The name must be a string; the optional doc argument can have any type.
648[clinic start generated code]*/
649
Tim Peters6d6c1a32001-08-02 04:15:00 +0000650static int
Serhiy Storchaka18b250f2017-03-19 08:51:07 +0200651module___init___impl(PyModuleObject *self, PyObject *name, PyObject *doc)
652/*[clinic end generated code: output=e7e721c26ce7aad7 input=57f9e177401e5e1e]*/
Tim Peters6d6c1a32001-08-02 04:15:00 +0000653{
Serhiy Storchaka18b250f2017-03-19 08:51:07 +0200654 PyObject *dict = self->md_dict;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000655 if (dict == NULL) {
656 dict = PyDict_New();
657 if (dict == NULL)
658 return -1;
Serhiy Storchaka18b250f2017-03-19 08:51:07 +0200659 self->md_dict = dict;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000660 }
Serhiy Storchaka18b250f2017-03-19 08:51:07 +0200661 if (module_init_dict(self, dict, name, doc) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000662 return -1;
663 return 0;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000664}
665
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000666static void
Fred Drakeee238b92000-07-09 06:03:25 +0000667module_dealloc(PyModuleObject *m)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000668{
Victor Stinnerda7933e2020-04-13 03:04:28 +0200669 int verbose = _Py_GetConfig()->verbose;
Victor Stinnerc96be812019-05-14 17:34:56 +0200670
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000671 PyObject_GC_UnTrack(m);
Victor Stinnerc96be812019-05-14 17:34:56 +0200672 if (verbose && m->md_name) {
Serhiy Storchakad7c38732019-10-08 13:46:17 +0300673 PySys_FormatStderr("# destroy %U\n", m->md_name);
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200674 }
675 if (m->md_weaklist != NULL)
676 PyObject_ClearWeakRefs((PyObject *) m);
Victor Stinner5b1ef202020-03-17 18:09:46 +0100677 /* bpo-39824: Don't call m_free() if m_size > 0 and md_state=NULL */
678 if (m->md_def && m->md_def->m_free
679 && (m->md_def->m_size <= 0 || m->md_state != NULL))
680 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000681 m->md_def->m_free(m);
Victor Stinner5b1ef202020-03-17 18:09:46 +0100682 }
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200683 Py_XDECREF(m->md_dict);
684 Py_XDECREF(m->md_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000685 if (m->md_state != NULL)
Victor Stinner00d7abd2020-12-01 09:56:42 +0100686 PyMem_Free(m->md_state);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000687 Py_TYPE(m)->tp_free((PyObject *)m);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000688}
689
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000690static PyObject *
Fred Drakeee238b92000-07-09 06:03:25 +0000691module_repr(PyModuleObject *m)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000692{
Victor Stinner81a7be32020-04-14 15:14:01 +0200693 PyInterpreterState *interp = _PyInterpreterState_GET();
Barry Warsaw2907fe62001-08-16 20:39:24 +0000694
Eric Snowb523f842013-11-22 09:05:39 -0700695 return PyObject_CallMethod(interp->importlib, "_module_repr", "O", m);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000696}
697
Serhiy Storchaka3e429dc2018-10-30 13:19:51 +0200698/* Check if the "_initializing" attribute of the module spec is set to true.
699 Clear the exception and return 0 if spec is NULL.
700 */
701int
702_PyModuleSpec_IsInitializing(PyObject *spec)
703{
704 if (spec != NULL) {
705 _Py_IDENTIFIER(_initializing);
706 PyObject *value = _PyObject_GetAttrId(spec, &PyId__initializing);
707 if (value != NULL) {
708 int initializing = PyObject_IsTrue(value);
709 Py_DECREF(value);
710 if (initializing >= 0) {
711 return initializing;
712 }
713 }
714 }
715 PyErr_Clear();
716 return 0;
717}
718
Ethan Furman7b9ff0e2014-04-24 14:47:47 -0700719static PyObject*
Benjamin Peterson1184e262014-04-24 19:29:23 -0400720module_getattro(PyModuleObject *m, PyObject *name)
Ethan Furman7b9ff0e2014-04-24 14:47:47 -0700721{
Ivan Levkivskyi5364b5c2017-12-14 11:59:44 +0100722 PyObject *attr, *mod_name, *getattr;
Benjamin Peterson1184e262014-04-24 19:29:23 -0400723 attr = PyObject_GenericGetAttr((PyObject *)m, name);
Ivan Levkivskyi5364b5c2017-12-14 11:59:44 +0100724 if (attr || !PyErr_ExceptionMatches(PyExc_AttributeError)) {
Ethan Furman7b9ff0e2014-04-24 14:47:47 -0700725 return attr;
Ivan Levkivskyi5364b5c2017-12-14 11:59:44 +0100726 }
Ethan Furman7b9ff0e2014-04-24 14:47:47 -0700727 PyErr_Clear();
Benjamin Peterson1184e262014-04-24 19:29:23 -0400728 if (m->md_dict) {
Ivan Levkivskyi5364b5c2017-12-14 11:59:44 +0100729 _Py_IDENTIFIER(__getattr__);
Serhiy Storchakafb5db7e2020-10-26 08:43:39 +0200730 getattr = _PyDict_GetItemIdWithError(m->md_dict, &PyId___getattr__);
Ivan Levkivskyi5364b5c2017-12-14 11:59:44 +0100731 if (getattr) {
Petr Viktorinffd97532020-02-11 17:46:57 +0100732 return PyObject_CallOneArg(getattr, name);
Ivan Levkivskyi5364b5c2017-12-14 11:59:44 +0100733 }
Serhiy Storchakafb5db7e2020-10-26 08:43:39 +0200734 if (PyErr_Occurred()) {
735 return NULL;
736 }
737 mod_name = _PyDict_GetItemIdWithError(m->md_dict, &PyId___name__);
Oren Milman6db70332017-09-19 14:23:01 +0300738 if (mod_name && PyUnicode_Check(mod_name)) {
Serhiy Storchaka3e429dc2018-10-30 13:19:51 +0200739 Py_INCREF(mod_name);
Serhiy Storchakafb5db7e2020-10-26 08:43:39 +0200740 PyObject *spec = _PyDict_GetItemIdWithError(m->md_dict, &PyId___spec__);
741 if (spec == NULL && PyErr_Occurred()) {
742 Py_DECREF(mod_name);
743 return NULL;
744 }
Serhiy Storchaka3e429dc2018-10-30 13:19:51 +0200745 Py_XINCREF(spec);
746 if (_PyModuleSpec_IsInitializing(spec)) {
747 PyErr_Format(PyExc_AttributeError,
748 "partially initialized "
749 "module '%U' has no attribute '%U' "
750 "(most likely due to a circular import)",
751 mod_name, name);
752 }
753 else {
754 PyErr_Format(PyExc_AttributeError,
755 "module '%U' has no attribute '%U'",
756 mod_name, name);
757 }
758 Py_XDECREF(spec);
759 Py_DECREF(mod_name);
Ethan Furman7b9ff0e2014-04-24 14:47:47 -0700760 return NULL;
761 }
Serhiy Storchakafb5db7e2020-10-26 08:43:39 +0200762 else if (PyErr_Occurred()) {
763 return NULL;
764 }
Ethan Furman7b9ff0e2014-04-24 14:47:47 -0700765 }
766 PyErr_Format(PyExc_AttributeError,
767 "module has no attribute '%U'", name);
768 return NULL;
769}
770
Neil Schemenauer10e31cf2001-01-02 15:58:27 +0000771static int
772module_traverse(PyModuleObject *m, visitproc visit, void *arg)
773{
Victor Stinner5b1ef202020-03-17 18:09:46 +0100774 /* bpo-39824: Don't call m_traverse() if m_size > 0 and md_state=NULL */
775 if (m->md_def && m->md_def->m_traverse
776 && (m->md_def->m_size <= 0 || m->md_state != NULL))
777 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000778 int res = m->md_def->m_traverse((PyObject*)m, visit, arg);
779 if (res)
780 return res;
781 }
782 Py_VISIT(m->md_dict);
783 return 0;
Neil Schemenauer10e31cf2001-01-02 15:58:27 +0000784}
785
Martin v. Löwis1a214512008-06-11 05:26:20 +0000786static int
787module_clear(PyModuleObject *m)
788{
Victor Stinner5b1ef202020-03-17 18:09:46 +0100789 /* bpo-39824: Don't call m_clear() if m_size > 0 and md_state=NULL */
790 if (m->md_def && m->md_def->m_clear
791 && (m->md_def->m_size <= 0 || m->md_state != NULL))
792 {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000793 int res = m->md_def->m_clear((PyObject*)m);
Serhiy Storchakad7c38732019-10-08 13:46:17 +0300794 if (PyErr_Occurred()) {
795 PySys_FormatStderr("Exception ignored in m_clear of module%s%V\n",
796 m->md_name ? " " : "",
797 m->md_name, "");
798 PyErr_WriteUnraisable(NULL);
799 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000800 if (res)
801 return res;
802 }
803 Py_CLEAR(m->md_dict);
804 return 0;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000805}
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000806
Benjamin Peterson82b00c12011-05-24 11:09:06 -0500807static PyObject *
808module_dir(PyObject *self, PyObject *args)
809{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200810 _Py_IDENTIFIER(__dict__);
Serhiy Storchakaa24107b2019-02-25 17:59:46 +0200811 _Py_IDENTIFIER(__dir__);
Benjamin Peterson82b00c12011-05-24 11:09:06 -0500812 PyObject *result = NULL;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +0200813 PyObject *dict = _PyObject_GetAttrId(self, &PyId___dict__);
Benjamin Peterson82b00c12011-05-24 11:09:06 -0500814
815 if (dict != NULL) {
Ivan Levkivskyi5364b5c2017-12-14 11:59:44 +0100816 if (PyDict_Check(dict)) {
Serhiy Storchakaa24107b2019-02-25 17:59:46 +0200817 PyObject *dirfunc = _PyDict_GetItemIdWithError(dict, &PyId___dir__);
Ivan Levkivskyi5364b5c2017-12-14 11:59:44 +0100818 if (dirfunc) {
819 result = _PyObject_CallNoArg(dirfunc);
820 }
Serhiy Storchakaa24107b2019-02-25 17:59:46 +0200821 else if (!PyErr_Occurred()) {
Ivan Levkivskyi5364b5c2017-12-14 11:59:44 +0100822 result = PyDict_Keys(dict);
823 }
824 }
Benjamin Peterson82b00c12011-05-24 11:09:06 -0500825 else {
826 const char *name = PyModule_GetName(self);
827 if (name)
828 PyErr_Format(PyExc_TypeError,
829 "%.200s.__dict__ is not a dictionary",
830 name);
831 }
832 }
833
834 Py_XDECREF(dict);
835 return result;
836}
837
838static PyMethodDef module_methods[] = {
839 {"__dir__", module_dir, METH_NOARGS,
Benjamin Petersonc7284122011-05-24 12:46:15 -0500840 PyDoc_STR("__dir__() -> list\nspecialized dir() implementation")},
Benjamin Peterson82b00c12011-05-24 11:09:06 -0500841 {0}
842};
843
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000844PyTypeObject PyModule_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000845 PyVarObject_HEAD_INIT(&PyType_Type, 0)
846 "module", /* tp_name */
Peter Eisentraut0e0bc4e2018-09-10 18:46:08 +0200847 sizeof(PyModuleObject), /* tp_basicsize */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000848 0, /* tp_itemsize */
849 (destructor)module_dealloc, /* tp_dealloc */
Jeroen Demeyer530f5062019-05-31 04:13:39 +0200850 0, /* tp_vectorcall_offset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000851 0, /* tp_getattr */
852 0, /* tp_setattr */
Jeroen Demeyer530f5062019-05-31 04:13:39 +0200853 0, /* tp_as_async */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000854 (reprfunc)module_repr, /* tp_repr */
855 0, /* tp_as_number */
856 0, /* tp_as_sequence */
857 0, /* tp_as_mapping */
858 0, /* tp_hash */
859 0, /* tp_call */
860 0, /* tp_str */
Benjamin Peterson1184e262014-04-24 19:29:23 -0400861 (getattrofunc)module_getattro, /* tp_getattro */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000862 PyObject_GenericSetAttr, /* tp_setattro */
863 0, /* tp_as_buffer */
864 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
865 Py_TPFLAGS_BASETYPE, /* tp_flags */
Serhiy Storchaka18b250f2017-03-19 08:51:07 +0200866 module___init____doc__, /* tp_doc */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000867 (traverseproc)module_traverse, /* tp_traverse */
868 (inquiry)module_clear, /* tp_clear */
869 0, /* tp_richcompare */
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200870 offsetof(PyModuleObject, md_weaklist), /* tp_weaklistoffset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000871 0, /* tp_iter */
872 0, /* tp_iternext */
Benjamin Peterson82b00c12011-05-24 11:09:06 -0500873 module_methods, /* tp_methods */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000874 module_members, /* tp_members */
875 0, /* tp_getset */
876 0, /* tp_base */
877 0, /* tp_dict */
878 0, /* tp_descr_get */
879 0, /* tp_descr_set */
880 offsetof(PyModuleObject, md_dict), /* tp_dictoffset */
Serhiy Storchaka18b250f2017-03-19 08:51:07 +0200881 module___init__, /* tp_init */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000882 PyType_GenericAlloc, /* tp_alloc */
883 PyType_GenericNew, /* tp_new */
884 PyObject_GC_Del, /* tp_free */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000885};