blob: 79be51a806b707233aed5d98ddef675feb38d05b [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:
Serhiy Storchaka333ad922016-09-26 23:14:44 +0300383 /* handled in PyModule_FromDefAndSpec2 */
Nick Coghland5cacbb2015-05-23 22:24:10 +1000384 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;
Berker Peksag7fbce562016-08-19 12:00:13 +0300453 assert(d != NULL);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000454 return d;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000455}
456
Victor Stinnerbd475112011-02-23 00:21:43 +0000457PyObject*
458PyModule_GetNameObject(PyObject *m)
Guido van Rossum0558a201990-10-26 15:00:11 +0000459{
Benjamin Peterson027ce162014-04-24 19:39:18 -0400460 _Py_IDENTIFIER(__name__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000461 PyObject *d;
Victor Stinnerbd475112011-02-23 00:21:43 +0000462 PyObject *name;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000463 if (!PyModule_Check(m)) {
464 PyErr_BadArgument();
465 return NULL;
466 }
467 d = ((PyModuleObject *)m)->md_dict;
468 if (d == NULL ||
Benjamin Peterson027ce162014-04-24 19:39:18 -0400469 (name = _PyDict_GetItemId(d, &PyId___name__)) == NULL ||
Victor Stinnerbd475112011-02-23 00:21:43 +0000470 !PyUnicode_Check(name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000471 {
472 PyErr_SetString(PyExc_SystemError, "nameless module");
473 return NULL;
474 }
Victor Stinnerbd475112011-02-23 00:21:43 +0000475 Py_INCREF(name);
476 return name;
477}
478
479const char *
480PyModule_GetName(PyObject *m)
481{
482 PyObject *name = PyModule_GetNameObject(m);
483 if (name == NULL)
484 return NULL;
485 Py_DECREF(name); /* module dict has still a reference */
Serhiy Storchaka06515832016-11-20 09:13:07 +0200486 return PyUnicode_AsUTF8(name);
Guido van Rossum0558a201990-10-26 15:00:11 +0000487}
488
Victor Stinner6c00c142010-08-17 23:37:11 +0000489PyObject*
490PyModule_GetFilenameObject(PyObject *m)
Guido van Rossum98cc19f1999-02-15 14:47:16 +0000491{
Benjamin Peterson027ce162014-04-24 19:39:18 -0400492 _Py_IDENTIFIER(__file__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000493 PyObject *d;
494 PyObject *fileobj;
495 if (!PyModule_Check(m)) {
496 PyErr_BadArgument();
497 return NULL;
498 }
499 d = ((PyModuleObject *)m)->md_dict;
500 if (d == NULL ||
Benjamin Peterson027ce162014-04-24 19:39:18 -0400501 (fileobj = _PyDict_GetItemId(d, &PyId___file__)) == NULL ||
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000502 !PyUnicode_Check(fileobj))
503 {
504 PyErr_SetString(PyExc_SystemError, "module filename missing");
505 return NULL;
506 }
Victor Stinner6c00c142010-08-17 23:37:11 +0000507 Py_INCREF(fileobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000508 return fileobj;
Victor Stinner8124feb2010-05-07 00:50:12 +0000509}
510
511const char *
512PyModule_GetFilename(PyObject *m)
513{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000514 PyObject *fileobj;
Victor Stinner6c00c142010-08-17 23:37:11 +0000515 char *utf8;
516 fileobj = PyModule_GetFilenameObject(m);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000517 if (fileobj == NULL)
518 return NULL;
Serhiy Storchaka06515832016-11-20 09:13:07 +0200519 utf8 = PyUnicode_AsUTF8(fileobj);
Victor Stinnerbd475112011-02-23 00:21:43 +0000520 Py_DECREF(fileobj); /* module dict has still a reference */
Victor Stinner6c00c142010-08-17 23:37:11 +0000521 return utf8;
Guido van Rossum98cc19f1999-02-15 14:47:16 +0000522}
523
Martin v. Löwis1a214512008-06-11 05:26:20 +0000524PyModuleDef*
525PyModule_GetDef(PyObject* m)
526{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000527 if (!PyModule_Check(m)) {
528 PyErr_BadArgument();
529 return NULL;
530 }
531 return ((PyModuleObject *)m)->md_def;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000532}
533
534void*
535PyModule_GetState(PyObject* m)
536{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000537 if (!PyModule_Check(m)) {
538 PyErr_BadArgument();
539 return NULL;
540 }
541 return ((PyModuleObject *)m)->md_state;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000542}
543
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000544void
Fred Drakeee238b92000-07-09 06:03:25 +0000545_PyModule_Clear(PyObject *m)
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000546{
Serhiy Storchaka87a5c512014-02-10 18:21:34 +0200547 PyObject *d = ((PyModuleObject *)m)->md_dict;
548 if (d != NULL)
549 _PyModule_ClearDict(d);
550}
551
552void
553_PyModule_ClearDict(PyObject *d)
554{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000555 /* To make the execution order of destructors for global
556 objects a bit more predictable, we first zap all objects
557 whose name starts with a single underscore, before we clear
558 the entire dictionary. We zap them by replacing them with
559 None, rather than deleting them from the dictionary, to
560 avoid rehashing the dictionary (to some extent). */
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000561
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000562 Py_ssize_t pos;
563 PyObject *key, *value;
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000564
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000565 /* First, clear only names starting with a single underscore */
566 pos = 0;
567 while (PyDict_Next(d, &pos, &key, &value)) {
568 if (value != Py_None && PyUnicode_Check(key)) {
Brett Cannon62228db2012-04-29 14:38:11 -0400569 if (PyUnicode_READ_CHAR(key, 0) == '_' &&
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200570 PyUnicode_READ_CHAR(key, 1) != '_') {
Victor Stinnerf3f22a22010-05-19 00:03:09 +0000571 if (Py_VerboseFlag > 1) {
Serhiy Storchaka06515832016-11-20 09:13:07 +0200572 const char *s = PyUnicode_AsUTF8(key);
Victor Stinnerf3f22a22010-05-19 00:03:09 +0000573 if (s != NULL)
574 PySys_WriteStderr("# clear[1] %s\n", s);
575 else
576 PyErr_Clear();
577 }
Serhiy Storchaka1f9d11b2014-02-12 09:55:01 +0200578 if (PyDict_SetItem(d, key, Py_None) != 0)
579 PyErr_Clear();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000580 }
581 }
582 }
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000583
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000584 /* Next, clear all names except for __builtins__ */
585 pos = 0;
586 while (PyDict_Next(d, &pos, &key, &value)) {
587 if (value != Py_None && PyUnicode_Check(key)) {
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200588 if (PyUnicode_READ_CHAR(key, 0) != '_' ||
Serhiy Storchakaf4934ea2016-11-16 10:17:58 +0200589 !_PyUnicode_EqualToASCIIString(key, "__builtins__"))
Victor Stinnerf3f22a22010-05-19 00:03:09 +0000590 {
591 if (Py_VerboseFlag > 1) {
Serhiy Storchaka06515832016-11-20 09:13:07 +0200592 const char *s = PyUnicode_AsUTF8(key);
Victor Stinnerf3f22a22010-05-19 00:03:09 +0000593 if (s != NULL)
594 PySys_WriteStderr("# clear[2] %s\n", s);
595 else
596 PyErr_Clear();
597 }
Serhiy Storchaka1f9d11b2014-02-12 09:55:01 +0200598 if (PyDict_SetItem(d, key, Py_None) != 0)
599 PyErr_Clear();
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 /* Note: we leave __builtins__ in place, so that destructors
605 of non-global objects defined in this module can still use
606 builtins, in particularly 'None'. */
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000607
608}
609
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000610/* Methods */
611
Tim Peters6d6c1a32001-08-02 04:15:00 +0000612static int
Guido van Rossumc3a787e2002-06-04 05:52:47 +0000613module_init(PyModuleObject *m, PyObject *args, PyObject *kwds)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000614{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000615 static char *kwlist[] = {"name", "doc", NULL};
616 PyObject *dict, *name = Py_None, *doc = Py_None;
617 if (!PyArg_ParseTupleAndKeywords(args, kwds, "U|O:module.__init__",
618 kwlist, &name, &doc))
619 return -1;
620 dict = m->md_dict;
621 if (dict == NULL) {
622 dict = PyDict_New();
623 if (dict == NULL)
624 return -1;
625 m->md_dict = dict;
626 }
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200627 if (module_init_dict(m, dict, name, doc) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000628 return -1;
629 return 0;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000630}
631
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000632static void
Fred Drakeee238b92000-07-09 06:03:25 +0000633module_dealloc(PyModuleObject *m)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000634{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000635 PyObject_GC_UnTrack(m);
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200636 if (Py_VerboseFlag && m->md_name) {
637 PySys_FormatStderr("# destroy %S\n", m->md_name);
638 }
639 if (m->md_weaklist != NULL)
640 PyObject_ClearWeakRefs((PyObject *) m);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000641 if (m->md_def && m->md_def->m_free)
642 m->md_def->m_free(m);
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200643 Py_XDECREF(m->md_dict);
644 Py_XDECREF(m->md_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000645 if (m->md_state != NULL)
646 PyMem_FREE(m->md_state);
647 Py_TYPE(m)->tp_free((PyObject *)m);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000648}
649
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000650static PyObject *
Fred Drakeee238b92000-07-09 06:03:25 +0000651module_repr(PyModuleObject *m)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000652{
Eric Snowb523f842013-11-22 09:05:39 -0700653 PyThreadState *tstate = PyThreadState_GET();
654 PyInterpreterState *interp = tstate->interp;
Barry Warsaw2907fe62001-08-16 20:39:24 +0000655
Eric Snowb523f842013-11-22 09:05:39 -0700656 return PyObject_CallMethod(interp->importlib, "_module_repr", "O", m);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000657}
658
Ethan Furman7b9ff0e2014-04-24 14:47:47 -0700659static PyObject*
Benjamin Peterson1184e262014-04-24 19:29:23 -0400660module_getattro(PyModuleObject *m, PyObject *name)
Ethan Furman7b9ff0e2014-04-24 14:47:47 -0700661{
Ethan Furman7b9ff0e2014-04-24 14:47:47 -0700662 PyObject *attr, *mod_name;
Benjamin Peterson1184e262014-04-24 19:29:23 -0400663 attr = PyObject_GenericGetAttr((PyObject *)m, name);
664 if (attr || !PyErr_ExceptionMatches(PyExc_AttributeError))
Ethan Furman7b9ff0e2014-04-24 14:47:47 -0700665 return attr;
666 PyErr_Clear();
Benjamin Peterson1184e262014-04-24 19:29:23 -0400667 if (m->md_dict) {
Benjamin Peterson027ce162014-04-24 19:39:18 -0400668 _Py_IDENTIFIER(__name__);
669 mod_name = _PyDict_GetItemId(m->md_dict, &PyId___name__);
Benjamin Peterson1184e262014-04-24 19:29:23 -0400670 if (mod_name) {
Ethan Furman7b9ff0e2014-04-24 14:47:47 -0700671 PyErr_Format(PyExc_AttributeError,
672 "module '%U' has no attribute '%U'", mod_name, name);
673 return NULL;
674 }
Benjamin Peterson1184e262014-04-24 19:29:23 -0400675 else if (PyErr_Occurred()) {
Ethan Furman7b9ff0e2014-04-24 14:47:47 -0700676 PyErr_Clear();
Benjamin Peterson1184e262014-04-24 19:29:23 -0400677 }
Ethan Furman7b9ff0e2014-04-24 14:47:47 -0700678 }
679 PyErr_Format(PyExc_AttributeError,
680 "module has no attribute '%U'", name);
681 return NULL;
682}
683
Neil Schemenauer10e31cf2001-01-02 15:58:27 +0000684static int
685module_traverse(PyModuleObject *m, visitproc visit, void *arg)
686{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000687 if (m->md_def && m->md_def->m_traverse) {
688 int res = m->md_def->m_traverse((PyObject*)m, visit, arg);
689 if (res)
690 return res;
691 }
692 Py_VISIT(m->md_dict);
693 return 0;
Neil Schemenauer10e31cf2001-01-02 15:58:27 +0000694}
695
Martin v. Löwis1a214512008-06-11 05:26:20 +0000696static int
697module_clear(PyModuleObject *m)
698{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000699 if (m->md_def && m->md_def->m_clear) {
700 int res = m->md_def->m_clear((PyObject*)m);
701 if (res)
702 return res;
703 }
704 Py_CLEAR(m->md_dict);
705 return 0;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000706}
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000707
Benjamin Peterson82b00c12011-05-24 11:09:06 -0500708static PyObject *
709module_dir(PyObject *self, PyObject *args)
710{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200711 _Py_IDENTIFIER(__dict__);
Benjamin Peterson82b00c12011-05-24 11:09:06 -0500712 PyObject *result = NULL;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +0200713 PyObject *dict = _PyObject_GetAttrId(self, &PyId___dict__);
Benjamin Peterson82b00c12011-05-24 11:09:06 -0500714
715 if (dict != NULL) {
716 if (PyDict_Check(dict))
717 result = PyDict_Keys(dict);
718 else {
719 const char *name = PyModule_GetName(self);
720 if (name)
721 PyErr_Format(PyExc_TypeError,
722 "%.200s.__dict__ is not a dictionary",
723 name);
724 }
725 }
726
727 Py_XDECREF(dict);
728 return result;
729}
730
731static PyMethodDef module_methods[] = {
732 {"__dir__", module_dir, METH_NOARGS,
Benjamin Petersonc7284122011-05-24 12:46:15 -0500733 PyDoc_STR("__dir__() -> list\nspecialized dir() implementation")},
Benjamin Peterson82b00c12011-05-24 11:09:06 -0500734 {0}
735};
736
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000737PyDoc_STRVAR(module_doc,
Guido van Rossumed3e09f2002-06-04 06:02:35 +0000738"module(name[, doc])\n\
739\n\
740Create a module object.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000741The name must be a string; the optional doc argument can have any type.");
Guido van Rossumed3e09f2002-06-04 06:02:35 +0000742
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000743PyTypeObject PyModule_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000744 PyVarObject_HEAD_INIT(&PyType_Type, 0)
745 "module", /* tp_name */
746 sizeof(PyModuleObject), /* tp_size */
747 0, /* tp_itemsize */
748 (destructor)module_dealloc, /* tp_dealloc */
749 0, /* tp_print */
750 0, /* tp_getattr */
751 0, /* tp_setattr */
752 0, /* tp_reserved */
753 (reprfunc)module_repr, /* tp_repr */
754 0, /* tp_as_number */
755 0, /* tp_as_sequence */
756 0, /* tp_as_mapping */
757 0, /* tp_hash */
758 0, /* tp_call */
759 0, /* tp_str */
Benjamin Peterson1184e262014-04-24 19:29:23 -0400760 (getattrofunc)module_getattro, /* tp_getattro */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000761 PyObject_GenericSetAttr, /* tp_setattro */
762 0, /* tp_as_buffer */
763 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
764 Py_TPFLAGS_BASETYPE, /* tp_flags */
765 module_doc, /* tp_doc */
766 (traverseproc)module_traverse, /* tp_traverse */
767 (inquiry)module_clear, /* tp_clear */
768 0, /* tp_richcompare */
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200769 offsetof(PyModuleObject, md_weaklist), /* tp_weaklistoffset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000770 0, /* tp_iter */
771 0, /* tp_iternext */
Benjamin Peterson82b00c12011-05-24 11:09:06 -0500772 module_methods, /* tp_methods */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000773 module_members, /* tp_members */
774 0, /* tp_getset */
775 0, /* tp_base */
776 0, /* tp_dict */
777 0, /* tp_descr_get */
778 0, /* tp_descr_set */
779 offsetof(PyModuleObject, md_dict), /* tp_dictoffset */
780 (initproc)module_init, /* tp_init */
781 PyType_GenericAlloc, /* tp_alloc */
782 PyType_GenericNew, /* tp_new */
783 PyObject_GC_Del, /* tp_free */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000784};