blob: ae72da6e3b52ee046d5c780d630ef94a12d1f7af [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"
Tim Peters6d6c1a32001-08-02 04:15:00 +00005#include "structmember.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00006
Martin v. Löwis1a214512008-06-11 05:26:20 +00007static Py_ssize_t max_module_number;
8
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00009typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000010 PyObject_HEAD
11 PyObject *md_dict;
12 struct PyModuleDef *md_def;
13 void *md_state;
Antoine Pitroudcedaf62013-07-31 23:14:08 +020014 PyObject *md_weaklist;
15 PyObject *md_name; /* for logging purposes after md_dict is cleared */
Guido van Rossumc0b618a1997-05-02 03:12:38 +000016} PyModuleObject;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000017
Neil Schemenauerf23473f2001-10-21 22:28:58 +000018static PyMemberDef module_members[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000019 {"__dict__", T_OBJECT, offsetof(PyModuleObject, md_dict), READONLY},
20 {0}
Tim Peters6d6c1a32001-08-02 04:15:00 +000021};
22
Nick Coghland5cacbb2015-05-23 22:24:10 +100023PyTypeObject PyModuleDef_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000024 PyVarObject_HEAD_INIT(&PyType_Type, 0)
25 "moduledef", /* tp_name */
26 sizeof(struct PyModuleDef), /* tp_size */
27 0, /* tp_itemsize */
Martin v. Löwis1a214512008-06-11 05:26:20 +000028};
29
30
Nick Coghland5cacbb2015-05-23 22:24:10 +100031PyObject*
32PyModuleDef_Init(struct PyModuleDef* def)
33{
34 if (PyType_Ready(&PyModuleDef_Type) < 0)
35 return NULL;
36 if (def->m_base.m_index == 0) {
37 max_module_number++;
38 Py_REFCNT(def) = 1;
39 Py_TYPE(def) = &PyModuleDef_Type;
40 def->m_base.m_index = max_module_number;
41 }
42 return (PyObject*)def;
43}
44
Brett Cannon4c14b5d2013-05-04 13:56:58 -040045static int
Antoine Pitroudcedaf62013-07-31 23:14:08 +020046module_init_dict(PyModuleObject *mod, PyObject *md_dict,
47 PyObject *name, PyObject *doc)
Brett Cannon4c14b5d2013-05-04 13:56:58 -040048{
Benjamin Peterson027ce162014-04-24 19:39:18 -040049 _Py_IDENTIFIER(__name__);
50 _Py_IDENTIFIER(__doc__);
51 _Py_IDENTIFIER(__package__);
52 _Py_IDENTIFIER(__loader__);
53 _Py_IDENTIFIER(__spec__);
Serhiy Storchaka009b8112015-03-18 21:53:15 +020054
Brett Cannon4c14b5d2013-05-04 13:56:58 -040055 if (md_dict == NULL)
56 return -1;
57 if (doc == NULL)
58 doc = Py_None;
59
Benjamin Peterson027ce162014-04-24 19:39:18 -040060 if (_PyDict_SetItemId(md_dict, &PyId___name__, name) != 0)
Brett Cannon4c14b5d2013-05-04 13:56:58 -040061 return -1;
Benjamin Peterson027ce162014-04-24 19:39:18 -040062 if (_PyDict_SetItemId(md_dict, &PyId___doc__, doc) != 0)
Brett Cannon4c14b5d2013-05-04 13:56:58 -040063 return -1;
Benjamin Peterson027ce162014-04-24 19:39:18 -040064 if (_PyDict_SetItemId(md_dict, &PyId___package__, Py_None) != 0)
Brett Cannon4c14b5d2013-05-04 13:56:58 -040065 return -1;
Benjamin Peterson027ce162014-04-24 19:39:18 -040066 if (_PyDict_SetItemId(md_dict, &PyId___loader__, Py_None) != 0)
Brett Cannon4c14b5d2013-05-04 13:56:58 -040067 return -1;
Benjamin Peterson027ce162014-04-24 19:39:18 -040068 if (_PyDict_SetItemId(md_dict, &PyId___spec__, Py_None) != 0)
Eric Snowb523f842013-11-22 09:05:39 -070069 return -1;
Antoine Pitroudcedaf62013-07-31 23:14:08 +020070 if (PyUnicode_CheckExact(name)) {
71 Py_INCREF(name);
Serhiy Storchaka48842712016-04-06 09:45:48 +030072 Py_XSETREF(mod->md_name, name);
Antoine Pitroudcedaf62013-07-31 23:14:08 +020073 }
Brett Cannon4c14b5d2013-05-04 13:56:58 -040074
75 return 0;
76}
77
78
Guido van Rossumc0b618a1997-05-02 03:12:38 +000079PyObject *
Victor Stinner0639b562011-03-04 12:57:07 +000080PyModule_NewObject(PyObject *name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000081{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000082 PyModuleObject *m;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000083 m = PyObject_GC_New(PyModuleObject, &PyModule_Type);
84 if (m == NULL)
85 return NULL;
86 m->md_def = NULL;
87 m->md_state = NULL;
Antoine Pitroudcedaf62013-07-31 23:14:08 +020088 m->md_weaklist = NULL;
89 m->md_name = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000090 m->md_dict = PyDict_New();
Antoine Pitroudcedaf62013-07-31 23:14:08 +020091 if (module_init_dict(m, m->md_dict, name, NULL) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000092 goto fail;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000093 PyObject_GC_Track(m);
94 return (PyObject *)m;
Guido van Rossumc45611d1993-11-17 22:58:56 +000095
96 fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000097 Py_DECREF(m);
98 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000099}
100
Martin v. Löwis1a214512008-06-11 05:26:20 +0000101PyObject *
Victor Stinner0639b562011-03-04 12:57:07 +0000102PyModule_New(const char *name)
103{
104 PyObject *nameobj, *module;
105 nameobj = PyUnicode_FromString(name);
106 if (nameobj == NULL)
107 return NULL;
108 module = PyModule_NewObject(nameobj);
109 Py_DECREF(nameobj);
110 return module;
111}
112
Nick Coghland5cacbb2015-05-23 22:24:10 +1000113/* Check API/ABI version
114 * Issues a warning on mismatch, which is usually not fatal.
115 * Returns 0 if an exception is raised.
116 */
117static int
118check_api_version(const char *name, int module_api_version)
Martin v. Löwis1a214512008-06-11 05:26:20 +0000119{
Martin v. Löwis4d0d4712010-12-03 20:14:31 +0000120 if (module_api_version != PYTHON_API_VERSION && module_api_version != PYTHON_ABI_VERSION) {
Victor Stinner4a2b7a12010-08-13 14:03:48 +0000121 int err;
122 err = PyErr_WarnFormat(PyExc_RuntimeWarning, 1,
123 "Python C API version mismatch for module %.100s: "
124 "This Python has API version %d, module %.100s has version %d.",
125 name,
126 PYTHON_API_VERSION, name, module_api_version);
127 if (err)
Nick Coghland5cacbb2015-05-23 22:24:10 +1000128 return 0;
129 }
130 return 1;
131}
132
Nick Coghlan8682f572016-08-21 17:41:56 +1000133static int
134_add_methods_to_object(PyObject *module, PyObject *name, PyMethodDef *functions)
135{
136 PyObject *func;
137 PyMethodDef *fdef;
138
139 for (fdef = functions; fdef->ml_name != NULL; fdef++) {
140 if ((fdef->ml_flags & METH_CLASS) ||
141 (fdef->ml_flags & METH_STATIC)) {
142 PyErr_SetString(PyExc_ValueError,
143 "module functions cannot set"
144 " METH_CLASS or METH_STATIC");
145 return -1;
146 }
147 func = PyCFunction_NewEx(fdef, (PyObject*)module, name);
148 if (func == NULL) {
149 return -1;
150 }
151 if (PyObject_SetAttrString(module, fdef->ml_name, func) != 0) {
152 Py_DECREF(func);
153 return -1;
154 }
155 Py_DECREF(func);
156 }
157
158 return 0;
159}
160
Nick Coghland5cacbb2015-05-23 22:24:10 +1000161PyObject *
162PyModule_Create2(struct PyModuleDef* module, int module_api_version)
163{
164 const char* name;
165 PyModuleObject *m;
166 PyInterpreterState *interp = PyThreadState_Get()->interp;
167 if (interp->modules == NULL)
168 Py_FatalError("Python import machinery not initialized");
169 if (!PyModuleDef_Init(module))
170 return NULL;
171 name = module->m_name;
172 if (!check_api_version(name, module_api_version)) {
173 return NULL;
174 }
175 if (module->m_slots) {
176 PyErr_Format(
177 PyExc_SystemError,
178 "module %s: PyModule_Create is incompatible with m_slots", name);
179 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000180 }
181 /* Make sure name is fully qualified.
Martin v. Löwis1a214512008-06-11 05:26:20 +0000182
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000183 This is a bit of a hack: when the shared library is loaded,
184 the module name is "package.module", but the module calls
185 PyModule_Create*() with just "module" for the name. The shared
186 library loader squirrels away the true name of the module in
187 _Py_PackageContext, and PyModule_Create*() will substitute this
188 (if the name actually matches).
189 */
190 if (_Py_PackageContext != NULL) {
191 char *p = strrchr(_Py_PackageContext, '.');
192 if (p != NULL && strcmp(module->m_name, p+1) == 0) {
193 name = _Py_PackageContext;
194 _Py_PackageContext = NULL;
195 }
196 }
197 if ((m = (PyModuleObject*)PyModule_New(name)) == NULL)
198 return NULL;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000199
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000200 if (module->m_size > 0) {
201 m->md_state = PyMem_MALLOC(module->m_size);
202 if (!m->md_state) {
203 PyErr_NoMemory();
204 Py_DECREF(m);
205 return NULL;
206 }
207 memset(m->md_state, 0, module->m_size);
208 }
209
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000210 if (module->m_methods != NULL) {
Nick Coghland5cacbb2015-05-23 22:24:10 +1000211 if (PyModule_AddFunctions((PyObject *) m, module->m_methods) != 0) {
Meador Inge29e49d62012-07-19 13:45:43 -0500212 Py_DECREF(m);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000213 return NULL;
Meador Inge29e49d62012-07-19 13:45:43 -0500214 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000215 }
216 if (module->m_doc != NULL) {
Nick Coghland5cacbb2015-05-23 22:24:10 +1000217 if (PyModule_SetDocString((PyObject *) m, module->m_doc) != 0) {
Meador Inge29e49d62012-07-19 13:45:43 -0500218 Py_DECREF(m);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000219 return NULL;
220 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000221 }
222 m->md_def = module;
223 return (PyObject*)m;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000224}
225
Nick Coghland5cacbb2015-05-23 22:24:10 +1000226PyObject *
227PyModule_FromDefAndSpec2(struct PyModuleDef* def, PyObject *spec, int module_api_version)
228{
229 PyModuleDef_Slot* cur_slot;
230 PyObject *(*create)(PyObject *, PyModuleDef*) = NULL;
231 PyObject *nameobj;
232 PyObject *m = NULL;
233 int has_execution_slots = 0;
234 char *name;
235 int ret;
236
237 PyModuleDef_Init(def);
238
239 nameobj = PyObject_GetAttrString(spec, "name");
240 if (nameobj == NULL) {
241 return NULL;
242 }
243 name = PyUnicode_AsUTF8(nameobj);
244 if (name == NULL) {
245 goto error;
246 }
247
248 if (!check_api_version(name, module_api_version)) {
249 goto error;
250 }
251
252 if (def->m_size < 0) {
253 PyErr_Format(
254 PyExc_SystemError,
255 "module %s: m_size may not be negative for multi-phase initialization",
256 name);
257 goto error;
258 }
259
260 for (cur_slot = def->m_slots; cur_slot && cur_slot->slot; cur_slot++) {
261 if (cur_slot->slot == Py_mod_create) {
262 if (create) {
263 PyErr_Format(
264 PyExc_SystemError,
265 "module %s has multiple create slots",
266 name);
267 goto error;
268 }
269 create = cur_slot->value;
270 } else if (cur_slot->slot < 0 || cur_slot->slot > _Py_mod_LAST_SLOT) {
271 PyErr_Format(
272 PyExc_SystemError,
273 "module %s uses unknown slot ID %i",
274 name, cur_slot->slot);
275 goto error;
276 } else {
277 has_execution_slots = 1;
278 }
279 }
280
281 if (create) {
282 m = create(spec, def);
283 if (m == NULL) {
284 if (!PyErr_Occurred()) {
285 PyErr_Format(
286 PyExc_SystemError,
287 "creation of module %s failed without setting an exception",
288 name);
289 }
290 goto error;
291 } else {
292 if (PyErr_Occurred()) {
293 PyErr_Format(PyExc_SystemError,
294 "creation of module %s raised unreported exception",
295 name);
296 goto error;
297 }
298 }
299 } else {
Nick Coghlan8682f572016-08-21 17:41:56 +1000300 m = PyModule_NewObject(nameobj);
Nick Coghland5cacbb2015-05-23 22:24:10 +1000301 if (m == NULL) {
302 goto error;
303 }
304 }
305
306 if (PyModule_Check(m)) {
307 ((PyModuleObject*)m)->md_state = NULL;
308 ((PyModuleObject*)m)->md_def = def;
309 } else {
310 if (def->m_size > 0 || def->m_traverse || def->m_clear || def->m_free) {
311 PyErr_Format(
312 PyExc_SystemError,
313 "module %s is not a module object, but requests module state",
314 name);
315 goto error;
316 }
317 if (has_execution_slots) {
318 PyErr_Format(
319 PyExc_SystemError,
320 "module %s specifies execution slots, but did not create "
321 "a ModuleType instance",
322 name);
323 goto error;
324 }
325 }
326
327 if (def->m_methods != NULL) {
Nick Coghlan8682f572016-08-21 17:41:56 +1000328 ret = _add_methods_to_object(m, nameobj, def->m_methods);
Nick Coghland5cacbb2015-05-23 22:24:10 +1000329 if (ret != 0) {
330 goto error;
331 }
332 }
333
334 if (def->m_doc != NULL) {
335 ret = PyModule_SetDocString(m, def->m_doc);
336 if (ret != 0) {
337 goto error;
338 }
339 }
340
Nick Coghlana48db2b2015-05-24 01:03:46 +1000341 Py_DECREF(nameobj);
Nick Coghland5cacbb2015-05-23 22:24:10 +1000342 return m;
343
344error:
345 Py_DECREF(nameobj);
346 Py_XDECREF(m);
347 return NULL;
348}
349
350int
351PyModule_ExecDef(PyObject *module, PyModuleDef *def)
352{
353 PyModuleDef_Slot *cur_slot;
354 const char *name;
355 int ret;
356
357 name = PyModule_GetName(module);
358 if (name == NULL) {
359 return -1;
360 }
361
Nick Coghlan8682f572016-08-21 17:41:56 +1000362 if (def->m_size >= 0) {
Nick Coghland5cacbb2015-05-23 22:24:10 +1000363 PyModuleObject *md = (PyModuleObject*)module;
364 if (md->md_state == NULL) {
365 /* Always set a state pointer; this serves as a marker to skip
366 * multiple initialization (importlib.reload() is no-op) */
367 md->md_state = PyMem_MALLOC(def->m_size);
368 if (!md->md_state) {
369 PyErr_NoMemory();
370 return -1;
371 }
372 memset(md->md_state, 0, def->m_size);
373 }
374 }
375
376 if (def->m_slots == NULL) {
377 return 0;
378 }
379
380 for (cur_slot = def->m_slots; cur_slot && cur_slot->slot; cur_slot++) {
381 switch (cur_slot->slot) {
382 case Py_mod_create:
383 /* handled in PyModule_CreateFromSlots */
384 break;
385 case Py_mod_exec:
386 ret = ((int (*)(PyObject *))cur_slot->value)(module);
387 if (ret != 0) {
388 if (!PyErr_Occurred()) {
389 PyErr_Format(
390 PyExc_SystemError,
391 "execution of module %s failed without setting an exception",
392 name);
393 }
394 return -1;
395 }
396 if (PyErr_Occurred()) {
397 PyErr_Format(
398 PyExc_SystemError,
399 "execution of module %s raised unreported exception",
400 name);
401 return -1;
402 }
403 break;
404 default:
405 PyErr_Format(
406 PyExc_SystemError,
407 "module %s initialized with unknown slot %i",
408 name, cur_slot->slot);
409 return -1;
410 }
411 }
412 return 0;
413}
414
415int
416PyModule_AddFunctions(PyObject *m, PyMethodDef *functions)
417{
Nick Coghlan8682f572016-08-21 17:41:56 +1000418 int res;
419 PyObject *name = PyModule_GetNameObject(m);
Nick Coghland5cacbb2015-05-23 22:24:10 +1000420 if (name == NULL) {
421 return -1;
422 }
423
Nick Coghlan8682f572016-08-21 17:41:56 +1000424 res = _add_methods_to_object(m, name, functions);
Nick Coghland5cacbb2015-05-23 22:24:10 +1000425 Py_DECREF(name);
Nick Coghlan8682f572016-08-21 17:41:56 +1000426 return res;
Nick Coghland5cacbb2015-05-23 22:24:10 +1000427}
428
429int
430PyModule_SetDocString(PyObject *m, const char *doc)
431{
432 PyObject *v;
433 _Py_IDENTIFIER(__doc__);
434
435 v = PyUnicode_FromString(doc);
436 if (v == NULL || _PyObject_SetAttrId(m, &PyId___doc__, v) != 0) {
437 Py_XDECREF(v);
438 return -1;
439 }
440 Py_DECREF(v);
441 return 0;
442}
Martin v. Löwis1a214512008-06-11 05:26:20 +0000443
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000444PyObject *
Fred Drakeee238b92000-07-09 06:03:25 +0000445PyModule_GetDict(PyObject *m)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000446{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000447 PyObject *d;
448 if (!PyModule_Check(m)) {
449 PyErr_BadInternalCall();
450 return NULL;
451 }
452 d = ((PyModuleObject *)m) -> md_dict;
453 if (d == NULL)
454 ((PyModuleObject *)m) -> md_dict = d = PyDict_New();
455 return d;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000456}
457
Victor Stinnerbd475112011-02-23 00:21:43 +0000458PyObject*
459PyModule_GetNameObject(PyObject *m)
Guido van Rossum0558a201990-10-26 15:00:11 +0000460{
Benjamin Peterson027ce162014-04-24 19:39:18 -0400461 _Py_IDENTIFIER(__name__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000462 PyObject *d;
Victor Stinnerbd475112011-02-23 00:21:43 +0000463 PyObject *name;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000464 if (!PyModule_Check(m)) {
465 PyErr_BadArgument();
466 return NULL;
467 }
468 d = ((PyModuleObject *)m)->md_dict;
469 if (d == NULL ||
Benjamin Peterson027ce162014-04-24 19:39:18 -0400470 (name = _PyDict_GetItemId(d, &PyId___name__)) == NULL ||
Victor Stinnerbd475112011-02-23 00:21:43 +0000471 !PyUnicode_Check(name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000472 {
473 PyErr_SetString(PyExc_SystemError, "nameless module");
474 return NULL;
475 }
Victor Stinnerbd475112011-02-23 00:21:43 +0000476 Py_INCREF(name);
477 return name;
478}
479
480const char *
481PyModule_GetName(PyObject *m)
482{
483 PyObject *name = PyModule_GetNameObject(m);
484 if (name == NULL)
485 return NULL;
486 Py_DECREF(name); /* module dict has still a reference */
487 return _PyUnicode_AsString(name);
Guido van Rossum0558a201990-10-26 15:00:11 +0000488}
489
Victor Stinner6c00c142010-08-17 23:37:11 +0000490PyObject*
491PyModule_GetFilenameObject(PyObject *m)
Guido van Rossum98cc19f1999-02-15 14:47:16 +0000492{
Benjamin Peterson027ce162014-04-24 19:39:18 -0400493 _Py_IDENTIFIER(__file__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000494 PyObject *d;
495 PyObject *fileobj;
496 if (!PyModule_Check(m)) {
497 PyErr_BadArgument();
498 return NULL;
499 }
500 d = ((PyModuleObject *)m)->md_dict;
501 if (d == NULL ||
Benjamin Peterson027ce162014-04-24 19:39:18 -0400502 (fileobj = _PyDict_GetItemId(d, &PyId___file__)) == NULL ||
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000503 !PyUnicode_Check(fileobj))
504 {
505 PyErr_SetString(PyExc_SystemError, "module filename missing");
506 return NULL;
507 }
Victor Stinner6c00c142010-08-17 23:37:11 +0000508 Py_INCREF(fileobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000509 return fileobj;
Victor Stinner8124feb2010-05-07 00:50:12 +0000510}
511
512const char *
513PyModule_GetFilename(PyObject *m)
514{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000515 PyObject *fileobj;
Victor Stinner6c00c142010-08-17 23:37:11 +0000516 char *utf8;
517 fileobj = PyModule_GetFilenameObject(m);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000518 if (fileobj == NULL)
519 return NULL;
Victor Stinner6c00c142010-08-17 23:37:11 +0000520 utf8 = _PyUnicode_AsString(fileobj);
Victor Stinnerbd475112011-02-23 00:21:43 +0000521 Py_DECREF(fileobj); /* module dict has still a reference */
Victor Stinner6c00c142010-08-17 23:37:11 +0000522 return utf8;
Guido van Rossum98cc19f1999-02-15 14:47:16 +0000523}
524
Martin v. Löwis1a214512008-06-11 05:26:20 +0000525PyModuleDef*
526PyModule_GetDef(PyObject* m)
527{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000528 if (!PyModule_Check(m)) {
529 PyErr_BadArgument();
530 return NULL;
531 }
532 return ((PyModuleObject *)m)->md_def;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000533}
534
535void*
536PyModule_GetState(PyObject* m)
537{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000538 if (!PyModule_Check(m)) {
539 PyErr_BadArgument();
540 return NULL;
541 }
542 return ((PyModuleObject *)m)->md_state;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000543}
544
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000545void
Fred Drakeee238b92000-07-09 06:03:25 +0000546_PyModule_Clear(PyObject *m)
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000547{
Serhiy Storchaka87a5c512014-02-10 18:21:34 +0200548 PyObject *d = ((PyModuleObject *)m)->md_dict;
549 if (d != NULL)
550 _PyModule_ClearDict(d);
551}
552
553void
554_PyModule_ClearDict(PyObject *d)
555{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000556 /* To make the execution order of destructors for global
557 objects a bit more predictable, we first zap all objects
558 whose name starts with a single underscore, before we clear
559 the entire dictionary. We zap them by replacing them with
560 None, rather than deleting them from the dictionary, to
561 avoid rehashing the dictionary (to some extent). */
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000562
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000563 Py_ssize_t pos;
564 PyObject *key, *value;
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000565
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000566 /* First, clear only names starting with a single underscore */
567 pos = 0;
568 while (PyDict_Next(d, &pos, &key, &value)) {
569 if (value != Py_None && PyUnicode_Check(key)) {
Brett Cannon62228db2012-04-29 14:38:11 -0400570 if (PyUnicode_READ_CHAR(key, 0) == '_' &&
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200571 PyUnicode_READ_CHAR(key, 1) != '_') {
Victor Stinnerf3f22a22010-05-19 00:03:09 +0000572 if (Py_VerboseFlag > 1) {
573 const char *s = _PyUnicode_AsString(key);
574 if (s != NULL)
575 PySys_WriteStderr("# clear[1] %s\n", s);
576 else
577 PyErr_Clear();
578 }
Serhiy Storchaka1f9d11b2014-02-12 09:55:01 +0200579 if (PyDict_SetItem(d, key, Py_None) != 0)
580 PyErr_Clear();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000581 }
582 }
583 }
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000584
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000585 /* Next, clear all names except for __builtins__ */
586 pos = 0;
587 while (PyDict_Next(d, &pos, &key, &value)) {
588 if (value != Py_None && PyUnicode_Check(key)) {
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200589 if (PyUnicode_READ_CHAR(key, 0) != '_' ||
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +0200590 !_PyUnicode_EqualToASCIIString(key, "__builtins__"))
Victor Stinnerf3f22a22010-05-19 00:03:09 +0000591 {
592 if (Py_VerboseFlag > 1) {
593 const char *s = _PyUnicode_AsString(key);
594 if (s != NULL)
595 PySys_WriteStderr("# clear[2] %s\n", s);
596 else
597 PyErr_Clear();
598 }
Serhiy Storchaka1f9d11b2014-02-12 09:55:01 +0200599 if (PyDict_SetItem(d, key, Py_None) != 0)
600 PyErr_Clear();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000601 }
602 }
603 }
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000604
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000605 /* Note: we leave __builtins__ in place, so that destructors
606 of non-global objects defined in this module can still use
607 builtins, in particularly 'None'. */
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000608
609}
610
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000611/* Methods */
612
Tim Peters6d6c1a32001-08-02 04:15:00 +0000613static int
Guido van Rossumc3a787e2002-06-04 05:52:47 +0000614module_init(PyModuleObject *m, PyObject *args, PyObject *kwds)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000615{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000616 static char *kwlist[] = {"name", "doc", NULL};
617 PyObject *dict, *name = Py_None, *doc = Py_None;
618 if (!PyArg_ParseTupleAndKeywords(args, kwds, "U|O:module.__init__",
619 kwlist, &name, &doc))
620 return -1;
621 dict = m->md_dict;
622 if (dict == NULL) {
623 dict = PyDict_New();
624 if (dict == NULL)
625 return -1;
626 m->md_dict = dict;
627 }
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200628 if (module_init_dict(m, dict, name, doc) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000629 return -1;
630 return 0;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000631}
632
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000633static void
Fred Drakeee238b92000-07-09 06:03:25 +0000634module_dealloc(PyModuleObject *m)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000635{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000636 PyObject_GC_UnTrack(m);
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200637 if (Py_VerboseFlag && m->md_name) {
638 PySys_FormatStderr("# destroy %S\n", m->md_name);
639 }
640 if (m->md_weaklist != NULL)
641 PyObject_ClearWeakRefs((PyObject *) m);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000642 if (m->md_def && m->md_def->m_free)
643 m->md_def->m_free(m);
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200644 Py_XDECREF(m->md_dict);
645 Py_XDECREF(m->md_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000646 if (m->md_state != NULL)
647 PyMem_FREE(m->md_state);
648 Py_TYPE(m)->tp_free((PyObject *)m);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000649}
650
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000651static PyObject *
Fred Drakeee238b92000-07-09 06:03:25 +0000652module_repr(PyModuleObject *m)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000653{
Eric Snowb523f842013-11-22 09:05:39 -0700654 PyThreadState *tstate = PyThreadState_GET();
655 PyInterpreterState *interp = tstate->interp;
Barry Warsaw2907fe62001-08-16 20:39:24 +0000656
Eric Snowb523f842013-11-22 09:05:39 -0700657 return PyObject_CallMethod(interp->importlib, "_module_repr", "O", m);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000658}
659
Ethan Furman7b9ff0e2014-04-24 14:47:47 -0700660static PyObject*
Benjamin Peterson1184e262014-04-24 19:29:23 -0400661module_getattro(PyModuleObject *m, PyObject *name)
Ethan Furman7b9ff0e2014-04-24 14:47:47 -0700662{
Ethan Furman7b9ff0e2014-04-24 14:47:47 -0700663 PyObject *attr, *mod_name;
Benjamin Peterson1184e262014-04-24 19:29:23 -0400664 attr = PyObject_GenericGetAttr((PyObject *)m, name);
665 if (attr || !PyErr_ExceptionMatches(PyExc_AttributeError))
Ethan Furman7b9ff0e2014-04-24 14:47:47 -0700666 return attr;
667 PyErr_Clear();
Benjamin Peterson1184e262014-04-24 19:29:23 -0400668 if (m->md_dict) {
Benjamin Peterson027ce162014-04-24 19:39:18 -0400669 _Py_IDENTIFIER(__name__);
670 mod_name = _PyDict_GetItemId(m->md_dict, &PyId___name__);
Benjamin Peterson1184e262014-04-24 19:29:23 -0400671 if (mod_name) {
Ethan Furman7b9ff0e2014-04-24 14:47:47 -0700672 PyErr_Format(PyExc_AttributeError,
673 "module '%U' has no attribute '%U'", mod_name, name);
674 return NULL;
675 }
Benjamin Peterson1184e262014-04-24 19:29:23 -0400676 else if (PyErr_Occurred()) {
Ethan Furman7b9ff0e2014-04-24 14:47:47 -0700677 PyErr_Clear();
Benjamin Peterson1184e262014-04-24 19:29:23 -0400678 }
Ethan Furman7b9ff0e2014-04-24 14:47:47 -0700679 }
680 PyErr_Format(PyExc_AttributeError,
681 "module has no attribute '%U'", name);
682 return NULL;
683}
684
Neil Schemenauer10e31cf2001-01-02 15:58:27 +0000685static int
686module_traverse(PyModuleObject *m, visitproc visit, void *arg)
687{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000688 if (m->md_def && m->md_def->m_traverse) {
689 int res = m->md_def->m_traverse((PyObject*)m, visit, arg);
690 if (res)
691 return res;
692 }
693 Py_VISIT(m->md_dict);
694 return 0;
Neil Schemenauer10e31cf2001-01-02 15:58:27 +0000695}
696
Martin v. Löwis1a214512008-06-11 05:26:20 +0000697static int
698module_clear(PyModuleObject *m)
699{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000700 if (m->md_def && m->md_def->m_clear) {
701 int res = m->md_def->m_clear((PyObject*)m);
702 if (res)
703 return res;
704 }
705 Py_CLEAR(m->md_dict);
706 return 0;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000707}
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000708
Benjamin Peterson82b00c12011-05-24 11:09:06 -0500709static PyObject *
710module_dir(PyObject *self, PyObject *args)
711{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200712 _Py_IDENTIFIER(__dict__);
Benjamin Peterson82b00c12011-05-24 11:09:06 -0500713 PyObject *result = NULL;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +0200714 PyObject *dict = _PyObject_GetAttrId(self, &PyId___dict__);
Benjamin Peterson82b00c12011-05-24 11:09:06 -0500715
716 if (dict != NULL) {
717 if (PyDict_Check(dict))
718 result = PyDict_Keys(dict);
719 else {
720 const char *name = PyModule_GetName(self);
721 if (name)
722 PyErr_Format(PyExc_TypeError,
723 "%.200s.__dict__ is not a dictionary",
724 name);
725 }
726 }
727
728 Py_XDECREF(dict);
729 return result;
730}
731
732static PyMethodDef module_methods[] = {
733 {"__dir__", module_dir, METH_NOARGS,
Benjamin Petersonc7284122011-05-24 12:46:15 -0500734 PyDoc_STR("__dir__() -> list\nspecialized dir() implementation")},
Benjamin Peterson82b00c12011-05-24 11:09:06 -0500735 {0}
736};
737
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000738PyDoc_STRVAR(module_doc,
Guido van Rossumed3e09f2002-06-04 06:02:35 +0000739"module(name[, doc])\n\
740\n\
741Create a module object.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000742The name must be a string; the optional doc argument can have any type.");
Guido van Rossumed3e09f2002-06-04 06:02:35 +0000743
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000744PyTypeObject PyModule_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000745 PyVarObject_HEAD_INIT(&PyType_Type, 0)
746 "module", /* tp_name */
747 sizeof(PyModuleObject), /* tp_size */
748 0, /* tp_itemsize */
749 (destructor)module_dealloc, /* tp_dealloc */
750 0, /* tp_print */
751 0, /* tp_getattr */
752 0, /* tp_setattr */
753 0, /* tp_reserved */
754 (reprfunc)module_repr, /* tp_repr */
755 0, /* tp_as_number */
756 0, /* tp_as_sequence */
757 0, /* tp_as_mapping */
758 0, /* tp_hash */
759 0, /* tp_call */
760 0, /* tp_str */
Benjamin Peterson1184e262014-04-24 19:29:23 -0400761 (getattrofunc)module_getattro, /* tp_getattro */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000762 PyObject_GenericSetAttr, /* tp_setattro */
763 0, /* tp_as_buffer */
764 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
765 Py_TPFLAGS_BASETYPE, /* tp_flags */
766 module_doc, /* tp_doc */
767 (traverseproc)module_traverse, /* tp_traverse */
768 (inquiry)module_clear, /* tp_clear */
769 0, /* tp_richcompare */
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200770 offsetof(PyModuleObject, md_weaklist), /* tp_weaklistoffset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000771 0, /* tp_iter */
772 0, /* tp_iternext */
Benjamin Peterson82b00c12011-05-24 11:09:06 -0500773 module_methods, /* tp_methods */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000774 module_members, /* tp_members */
775 0, /* tp_getset */
776 0, /* tp_base */
777 0, /* tp_dict */
778 0, /* tp_descr_get */
779 0, /* tp_descr_set */
780 offsetof(PyModuleObject, md_dict), /* tp_dictoffset */
781 (initproc)module_init, /* tp_init */
782 PyType_GenericAlloc, /* tp_alloc */
783 PyType_GenericNew, /* tp_new */
784 PyObject_GC_Del, /* tp_free */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000785};