blob: 7b41b0b6c474f33659a9cdc9a43eb8e6ff1060ee [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);
72 Py_XDECREF(mod->md_name);
73 mod->md_name = name;
74 }
Brett Cannon4c14b5d2013-05-04 13:56:58 -040075
76 return 0;
77}
78
79
Guido van Rossumc0b618a1997-05-02 03:12:38 +000080PyObject *
Victor Stinner0639b562011-03-04 12:57:07 +000081PyModule_NewObject(PyObject *name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000082{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000083 PyModuleObject *m;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000084 m = PyObject_GC_New(PyModuleObject, &PyModule_Type);
85 if (m == NULL)
86 return NULL;
87 m->md_def = NULL;
88 m->md_state = NULL;
Antoine Pitroudcedaf62013-07-31 23:14:08 +020089 m->md_weaklist = NULL;
90 m->md_name = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000091 m->md_dict = PyDict_New();
Antoine Pitroudcedaf62013-07-31 23:14:08 +020092 if (module_init_dict(m, m->md_dict, name, NULL) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000093 goto fail;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000094 PyObject_GC_Track(m);
95 return (PyObject *)m;
Guido van Rossumc45611d1993-11-17 22:58:56 +000096
97 fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000098 Py_DECREF(m);
99 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000100}
101
Martin v. Löwis1a214512008-06-11 05:26:20 +0000102PyObject *
Victor Stinner0639b562011-03-04 12:57:07 +0000103PyModule_New(const char *name)
104{
105 PyObject *nameobj, *module;
106 nameobj = PyUnicode_FromString(name);
107 if (nameobj == NULL)
108 return NULL;
109 module = PyModule_NewObject(nameobj);
110 Py_DECREF(nameobj);
111 return module;
112}
113
Nick Coghland5cacbb2015-05-23 22:24:10 +1000114/* Check API/ABI version
115 * Issues a warning on mismatch, which is usually not fatal.
116 * Returns 0 if an exception is raised.
117 */
118static int
119check_api_version(const char *name, int module_api_version)
Martin v. Löwis1a214512008-06-11 05:26:20 +0000120{
Martin v. Löwis4d0d4712010-12-03 20:14:31 +0000121 if (module_api_version != PYTHON_API_VERSION && module_api_version != PYTHON_ABI_VERSION) {
Victor Stinner4a2b7a12010-08-13 14:03:48 +0000122 int err;
123 err = PyErr_WarnFormat(PyExc_RuntimeWarning, 1,
124 "Python C API version mismatch for module %.100s: "
125 "This Python has API version %d, module %.100s has version %d.",
126 name,
127 PYTHON_API_VERSION, name, module_api_version);
128 if (err)
Nick Coghland5cacbb2015-05-23 22:24:10 +1000129 return 0;
130 }
131 return 1;
132}
133
134PyObject *
135PyModule_Create2(struct PyModuleDef* module, int module_api_version)
136{
137 const char* name;
138 PyModuleObject *m;
139 PyInterpreterState *interp = PyThreadState_Get()->interp;
140 if (interp->modules == NULL)
141 Py_FatalError("Python import machinery not initialized");
142 if (!PyModuleDef_Init(module))
143 return NULL;
144 name = module->m_name;
145 if (!check_api_version(name, module_api_version)) {
146 return NULL;
147 }
148 if (module->m_slots) {
149 PyErr_Format(
150 PyExc_SystemError,
151 "module %s: PyModule_Create is incompatible with m_slots", name);
152 return NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000153 }
154 /* Make sure name is fully qualified.
Martin v. Löwis1a214512008-06-11 05:26:20 +0000155
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000156 This is a bit of a hack: when the shared library is loaded,
157 the module name is "package.module", but the module calls
158 PyModule_Create*() with just "module" for the name. The shared
159 library loader squirrels away the true name of the module in
160 _Py_PackageContext, and PyModule_Create*() will substitute this
161 (if the name actually matches).
162 */
163 if (_Py_PackageContext != NULL) {
164 char *p = strrchr(_Py_PackageContext, '.');
165 if (p != NULL && strcmp(module->m_name, p+1) == 0) {
166 name = _Py_PackageContext;
167 _Py_PackageContext = NULL;
168 }
169 }
170 if ((m = (PyModuleObject*)PyModule_New(name)) == NULL)
171 return NULL;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000172
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000173 if (module->m_size > 0) {
174 m->md_state = PyMem_MALLOC(module->m_size);
175 if (!m->md_state) {
176 PyErr_NoMemory();
177 Py_DECREF(m);
178 return NULL;
179 }
180 memset(m->md_state, 0, module->m_size);
181 }
182
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000183 if (module->m_methods != NULL) {
Nick Coghland5cacbb2015-05-23 22:24:10 +1000184 if (PyModule_AddFunctions((PyObject *) m, module->m_methods) != 0) {
Meador Inge29e49d62012-07-19 13:45:43 -0500185 Py_DECREF(m);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000186 return NULL;
Meador Inge29e49d62012-07-19 13:45:43 -0500187 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000188 }
189 if (module->m_doc != NULL) {
Nick Coghland5cacbb2015-05-23 22:24:10 +1000190 if (PyModule_SetDocString((PyObject *) m, module->m_doc) != 0) {
Meador Inge29e49d62012-07-19 13:45:43 -0500191 Py_DECREF(m);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000192 return NULL;
193 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000194 }
195 m->md_def = module;
196 return (PyObject*)m;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000197}
198
Nick Coghland5cacbb2015-05-23 22:24:10 +1000199PyObject *
200PyModule_FromDefAndSpec2(struct PyModuleDef* def, PyObject *spec, int module_api_version)
201{
202 PyModuleDef_Slot* cur_slot;
203 PyObject *(*create)(PyObject *, PyModuleDef*) = NULL;
204 PyObject *nameobj;
205 PyObject *m = NULL;
206 int has_execution_slots = 0;
207 char *name;
208 int ret;
209
210 PyModuleDef_Init(def);
211
212 nameobj = PyObject_GetAttrString(spec, "name");
213 if (nameobj == NULL) {
214 return NULL;
215 }
216 name = PyUnicode_AsUTF8(nameobj);
217 if (name == NULL) {
218 goto error;
219 }
220
221 if (!check_api_version(name, module_api_version)) {
222 goto error;
223 }
224
225 if (def->m_size < 0) {
226 PyErr_Format(
227 PyExc_SystemError,
228 "module %s: m_size may not be negative for multi-phase initialization",
229 name);
230 goto error;
231 }
232
233 for (cur_slot = def->m_slots; cur_slot && cur_slot->slot; cur_slot++) {
234 if (cur_slot->slot == Py_mod_create) {
235 if (create) {
236 PyErr_Format(
237 PyExc_SystemError,
238 "module %s has multiple create slots",
239 name);
240 goto error;
241 }
242 create = cur_slot->value;
243 } else if (cur_slot->slot < 0 || cur_slot->slot > _Py_mod_LAST_SLOT) {
244 PyErr_Format(
245 PyExc_SystemError,
246 "module %s uses unknown slot ID %i",
247 name, cur_slot->slot);
248 goto error;
249 } else {
250 has_execution_slots = 1;
251 }
252 }
253
254 if (create) {
255 m = create(spec, def);
256 if (m == NULL) {
257 if (!PyErr_Occurred()) {
258 PyErr_Format(
259 PyExc_SystemError,
260 "creation of module %s failed without setting an exception",
261 name);
262 }
263 goto error;
264 } else {
265 if (PyErr_Occurred()) {
266 PyErr_Format(PyExc_SystemError,
267 "creation of module %s raised unreported exception",
268 name);
269 goto error;
270 }
271 }
272 } else {
273 m = PyModule_New(name);
274 if (m == NULL) {
275 goto error;
276 }
277 }
278
279 if (PyModule_Check(m)) {
280 ((PyModuleObject*)m)->md_state = NULL;
281 ((PyModuleObject*)m)->md_def = def;
282 } else {
283 if (def->m_size > 0 || def->m_traverse || def->m_clear || def->m_free) {
284 PyErr_Format(
285 PyExc_SystemError,
286 "module %s is not a module object, but requests module state",
287 name);
288 goto error;
289 }
290 if (has_execution_slots) {
291 PyErr_Format(
292 PyExc_SystemError,
293 "module %s specifies execution slots, but did not create "
294 "a ModuleType instance",
295 name);
296 goto error;
297 }
298 }
299
300 if (def->m_methods != NULL) {
301 ret = PyModule_AddFunctions(m, def->m_methods);
302 if (ret != 0) {
303 goto error;
304 }
305 }
306
307 if (def->m_doc != NULL) {
308 ret = PyModule_SetDocString(m, def->m_doc);
309 if (ret != 0) {
310 goto error;
311 }
312 }
313
Nick Coghlana48db2b2015-05-24 01:03:46 +1000314 Py_DECREF(nameobj);
Nick Coghland5cacbb2015-05-23 22:24:10 +1000315 return m;
316
317error:
318 Py_DECREF(nameobj);
319 Py_XDECREF(m);
320 return NULL;
321}
322
323int
324PyModule_ExecDef(PyObject *module, PyModuleDef *def)
325{
326 PyModuleDef_Slot *cur_slot;
327 const char *name;
328 int ret;
329
330 name = PyModule_GetName(module);
331 if (name == NULL) {
332 return -1;
333 }
334
335 if (PyModule_Check(module) && def->m_size >= 0) {
336 PyModuleObject *md = (PyModuleObject*)module;
337 if (md->md_state == NULL) {
338 /* Always set a state pointer; this serves as a marker to skip
339 * multiple initialization (importlib.reload() is no-op) */
340 md->md_state = PyMem_MALLOC(def->m_size);
341 if (!md->md_state) {
342 PyErr_NoMemory();
343 return -1;
344 }
345 memset(md->md_state, 0, def->m_size);
346 }
347 }
348
349 if (def->m_slots == NULL) {
350 return 0;
351 }
352
353 for (cur_slot = def->m_slots; cur_slot && cur_slot->slot; cur_slot++) {
354 switch (cur_slot->slot) {
355 case Py_mod_create:
356 /* handled in PyModule_CreateFromSlots */
357 break;
358 case Py_mod_exec:
359 ret = ((int (*)(PyObject *))cur_slot->value)(module);
360 if (ret != 0) {
361 if (!PyErr_Occurred()) {
362 PyErr_Format(
363 PyExc_SystemError,
364 "execution of module %s failed without setting an exception",
365 name);
366 }
367 return -1;
368 }
369 if (PyErr_Occurred()) {
370 PyErr_Format(
371 PyExc_SystemError,
372 "execution of module %s raised unreported exception",
373 name);
374 return -1;
375 }
376 break;
377 default:
378 PyErr_Format(
379 PyExc_SystemError,
380 "module %s initialized with unknown slot %i",
381 name, cur_slot->slot);
382 return -1;
383 }
384 }
385 return 0;
386}
387
388int
389PyModule_AddFunctions(PyObject *m, PyMethodDef *functions)
390{
391 PyObject *name, *func;
392 PyMethodDef *fdef;
393
394 name = PyModule_GetNameObject(m);
395 if (name == NULL) {
396 return -1;
397 }
398
399 for (fdef = functions; fdef->ml_name != NULL; fdef++) {
400 if ((fdef->ml_flags & METH_CLASS) ||
401 (fdef->ml_flags & METH_STATIC)) {
402 PyErr_SetString(PyExc_ValueError,
403 "module functions cannot set"
404 " METH_CLASS or METH_STATIC");
405 Py_DECREF(name);
406 return -1;
407 }
408 func = PyCFunction_NewEx(fdef, (PyObject*)m, name);
409 if (func == NULL) {
410 Py_DECREF(name);
411 return -1;
412 }
413 if (PyObject_SetAttrString(m, fdef->ml_name, func) != 0) {
414 Py_DECREF(func);
415 Py_DECREF(name);
416 return -1;
417 }
418 Py_DECREF(func);
419 }
420 Py_DECREF(name);
421 return 0;
422}
423
424int
425PyModule_SetDocString(PyObject *m, const char *doc)
426{
427 PyObject *v;
428 _Py_IDENTIFIER(__doc__);
429
430 v = PyUnicode_FromString(doc);
431 if (v == NULL || _PyObject_SetAttrId(m, &PyId___doc__, v) != 0) {
432 Py_XDECREF(v);
433 return -1;
434 }
435 Py_DECREF(v);
436 return 0;
437}
Martin v. Löwis1a214512008-06-11 05:26:20 +0000438
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000439PyObject *
Fred Drakeee238b92000-07-09 06:03:25 +0000440PyModule_GetDict(PyObject *m)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000441{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000442 PyObject *d;
443 if (!PyModule_Check(m)) {
444 PyErr_BadInternalCall();
445 return NULL;
446 }
447 d = ((PyModuleObject *)m) -> md_dict;
448 if (d == NULL)
449 ((PyModuleObject *)m) -> md_dict = d = PyDict_New();
450 return d;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000451}
452
Victor Stinnerbd475112011-02-23 00:21:43 +0000453PyObject*
454PyModule_GetNameObject(PyObject *m)
Guido van Rossum0558a201990-10-26 15:00:11 +0000455{
Benjamin Peterson027ce162014-04-24 19:39:18 -0400456 _Py_IDENTIFIER(__name__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000457 PyObject *d;
Victor Stinnerbd475112011-02-23 00:21:43 +0000458 PyObject *name;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000459 if (!PyModule_Check(m)) {
460 PyErr_BadArgument();
461 return NULL;
462 }
463 d = ((PyModuleObject *)m)->md_dict;
464 if (d == NULL ||
Benjamin Peterson027ce162014-04-24 19:39:18 -0400465 (name = _PyDict_GetItemId(d, &PyId___name__)) == NULL ||
Victor Stinnerbd475112011-02-23 00:21:43 +0000466 !PyUnicode_Check(name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000467 {
468 PyErr_SetString(PyExc_SystemError, "nameless module");
469 return NULL;
470 }
Victor Stinnerbd475112011-02-23 00:21:43 +0000471 Py_INCREF(name);
472 return name;
473}
474
475const char *
476PyModule_GetName(PyObject *m)
477{
478 PyObject *name = PyModule_GetNameObject(m);
479 if (name == NULL)
480 return NULL;
481 Py_DECREF(name); /* module dict has still a reference */
482 return _PyUnicode_AsString(name);
Guido van Rossum0558a201990-10-26 15:00:11 +0000483}
484
Victor Stinner6c00c142010-08-17 23:37:11 +0000485PyObject*
486PyModule_GetFilenameObject(PyObject *m)
Guido van Rossum98cc19f1999-02-15 14:47:16 +0000487{
Benjamin Peterson027ce162014-04-24 19:39:18 -0400488 _Py_IDENTIFIER(__file__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000489 PyObject *d;
490 PyObject *fileobj;
491 if (!PyModule_Check(m)) {
492 PyErr_BadArgument();
493 return NULL;
494 }
495 d = ((PyModuleObject *)m)->md_dict;
496 if (d == NULL ||
Benjamin Peterson027ce162014-04-24 19:39:18 -0400497 (fileobj = _PyDict_GetItemId(d, &PyId___file__)) == NULL ||
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000498 !PyUnicode_Check(fileobj))
499 {
500 PyErr_SetString(PyExc_SystemError, "module filename missing");
501 return NULL;
502 }
Victor Stinner6c00c142010-08-17 23:37:11 +0000503 Py_INCREF(fileobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000504 return fileobj;
Victor Stinner8124feb2010-05-07 00:50:12 +0000505}
506
507const char *
508PyModule_GetFilename(PyObject *m)
509{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000510 PyObject *fileobj;
Victor Stinner6c00c142010-08-17 23:37:11 +0000511 char *utf8;
512 fileobj = PyModule_GetFilenameObject(m);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000513 if (fileobj == NULL)
514 return NULL;
Victor Stinner6c00c142010-08-17 23:37:11 +0000515 utf8 = _PyUnicode_AsString(fileobj);
Victor Stinnerbd475112011-02-23 00:21:43 +0000516 Py_DECREF(fileobj); /* module dict has still a reference */
Victor Stinner6c00c142010-08-17 23:37:11 +0000517 return utf8;
Guido van Rossum98cc19f1999-02-15 14:47:16 +0000518}
519
Martin v. Löwis1a214512008-06-11 05:26:20 +0000520PyModuleDef*
521PyModule_GetDef(PyObject* m)
522{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000523 if (!PyModule_Check(m)) {
524 PyErr_BadArgument();
525 return NULL;
526 }
527 return ((PyModuleObject *)m)->md_def;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000528}
529
530void*
531PyModule_GetState(PyObject* m)
532{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000533 if (!PyModule_Check(m)) {
534 PyErr_BadArgument();
535 return NULL;
536 }
537 return ((PyModuleObject *)m)->md_state;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000538}
539
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000540void
Fred Drakeee238b92000-07-09 06:03:25 +0000541_PyModule_Clear(PyObject *m)
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000542{
Serhiy Storchaka87a5c512014-02-10 18:21:34 +0200543 PyObject *d = ((PyModuleObject *)m)->md_dict;
544 if (d != NULL)
545 _PyModule_ClearDict(d);
546}
547
548void
549_PyModule_ClearDict(PyObject *d)
550{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000551 /* To make the execution order of destructors for global
552 objects a bit more predictable, we first zap all objects
553 whose name starts with a single underscore, before we clear
554 the entire dictionary. We zap them by replacing them with
555 None, rather than deleting them from the dictionary, to
556 avoid rehashing the dictionary (to some extent). */
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000557
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000558 Py_ssize_t pos;
559 PyObject *key, *value;
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000560
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000561 /* First, clear only names starting with a single underscore */
562 pos = 0;
563 while (PyDict_Next(d, &pos, &key, &value)) {
564 if (value != Py_None && PyUnicode_Check(key)) {
Brett Cannon62228db2012-04-29 14:38:11 -0400565 if (PyUnicode_READ_CHAR(key, 0) == '_' &&
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200566 PyUnicode_READ_CHAR(key, 1) != '_') {
Victor Stinnerf3f22a22010-05-19 00:03:09 +0000567 if (Py_VerboseFlag > 1) {
568 const char *s = _PyUnicode_AsString(key);
569 if (s != NULL)
570 PySys_WriteStderr("# clear[1] %s\n", s);
571 else
572 PyErr_Clear();
573 }
Serhiy Storchaka1f9d11b2014-02-12 09:55:01 +0200574 if (PyDict_SetItem(d, key, Py_None) != 0)
575 PyErr_Clear();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000576 }
577 }
578 }
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000579
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000580 /* Next, clear all names except for __builtins__ */
581 pos = 0;
582 while (PyDict_Next(d, &pos, &key, &value)) {
583 if (value != Py_None && PyUnicode_Check(key)) {
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200584 if (PyUnicode_READ_CHAR(key, 0) != '_' ||
585 PyUnicode_CompareWithASCIIString(key, "__builtins__") != 0)
Victor Stinnerf3f22a22010-05-19 00:03:09 +0000586 {
587 if (Py_VerboseFlag > 1) {
588 const char *s = _PyUnicode_AsString(key);
589 if (s != NULL)
590 PySys_WriteStderr("# clear[2] %s\n", s);
591 else
592 PyErr_Clear();
593 }
Serhiy Storchaka1f9d11b2014-02-12 09:55:01 +0200594 if (PyDict_SetItem(d, key, Py_None) != 0)
595 PyErr_Clear();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000596 }
597 }
598 }
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000599
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000600 /* Note: we leave __builtins__ in place, so that destructors
601 of non-global objects defined in this module can still use
602 builtins, in particularly 'None'. */
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000603
604}
605
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000606/* Methods */
607
Tim Peters6d6c1a32001-08-02 04:15:00 +0000608static int
Guido van Rossumc3a787e2002-06-04 05:52:47 +0000609module_init(PyModuleObject *m, PyObject *args, PyObject *kwds)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000610{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000611 static char *kwlist[] = {"name", "doc", NULL};
612 PyObject *dict, *name = Py_None, *doc = Py_None;
613 if (!PyArg_ParseTupleAndKeywords(args, kwds, "U|O:module.__init__",
614 kwlist, &name, &doc))
615 return -1;
616 dict = m->md_dict;
617 if (dict == NULL) {
618 dict = PyDict_New();
619 if (dict == NULL)
620 return -1;
621 m->md_dict = dict;
622 }
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200623 if (module_init_dict(m, dict, name, doc) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000624 return -1;
625 return 0;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000626}
627
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000628static void
Fred Drakeee238b92000-07-09 06:03:25 +0000629module_dealloc(PyModuleObject *m)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000630{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000631 PyObject_GC_UnTrack(m);
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200632 if (Py_VerboseFlag && m->md_name) {
633 PySys_FormatStderr("# destroy %S\n", m->md_name);
634 }
635 if (m->md_weaklist != NULL)
636 PyObject_ClearWeakRefs((PyObject *) m);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000637 if (m->md_def && m->md_def->m_free)
638 m->md_def->m_free(m);
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200639 Py_XDECREF(m->md_dict);
640 Py_XDECREF(m->md_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000641 if (m->md_state != NULL)
642 PyMem_FREE(m->md_state);
643 Py_TYPE(m)->tp_free((PyObject *)m);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000644}
645
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000646static PyObject *
Fred Drakeee238b92000-07-09 06:03:25 +0000647module_repr(PyModuleObject *m)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000648{
Eric Snowb523f842013-11-22 09:05:39 -0700649 PyThreadState *tstate = PyThreadState_GET();
650 PyInterpreterState *interp = tstate->interp;
Barry Warsaw2907fe62001-08-16 20:39:24 +0000651
Eric Snowb523f842013-11-22 09:05:39 -0700652 return PyObject_CallMethod(interp->importlib, "_module_repr", "O", m);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000653}
654
Ethan Furman7b9ff0e2014-04-24 14:47:47 -0700655static PyObject*
Benjamin Peterson1184e262014-04-24 19:29:23 -0400656module_getattro(PyModuleObject *m, PyObject *name)
Ethan Furman7b9ff0e2014-04-24 14:47:47 -0700657{
Ethan Furman7b9ff0e2014-04-24 14:47:47 -0700658 PyObject *attr, *mod_name;
Benjamin Peterson1184e262014-04-24 19:29:23 -0400659 attr = PyObject_GenericGetAttr((PyObject *)m, name);
660 if (attr || !PyErr_ExceptionMatches(PyExc_AttributeError))
Ethan Furman7b9ff0e2014-04-24 14:47:47 -0700661 return attr;
662 PyErr_Clear();
Benjamin Peterson1184e262014-04-24 19:29:23 -0400663 if (m->md_dict) {
Benjamin Peterson027ce162014-04-24 19:39:18 -0400664 _Py_IDENTIFIER(__name__);
665 mod_name = _PyDict_GetItemId(m->md_dict, &PyId___name__);
Benjamin Peterson1184e262014-04-24 19:29:23 -0400666 if (mod_name) {
Ethan Furman7b9ff0e2014-04-24 14:47:47 -0700667 PyErr_Format(PyExc_AttributeError,
668 "module '%U' has no attribute '%U'", mod_name, name);
669 return NULL;
670 }
Benjamin Peterson1184e262014-04-24 19:29:23 -0400671 else if (PyErr_Occurred()) {
Ethan Furman7b9ff0e2014-04-24 14:47:47 -0700672 PyErr_Clear();
Benjamin Peterson1184e262014-04-24 19:29:23 -0400673 }
Ethan Furman7b9ff0e2014-04-24 14:47:47 -0700674 }
675 PyErr_Format(PyExc_AttributeError,
676 "module has no attribute '%U'", name);
677 return NULL;
678}
679
Neil Schemenauer10e31cf2001-01-02 15:58:27 +0000680static int
681module_traverse(PyModuleObject *m, visitproc visit, void *arg)
682{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000683 if (m->md_def && m->md_def->m_traverse) {
684 int res = m->md_def->m_traverse((PyObject*)m, visit, arg);
685 if (res)
686 return res;
687 }
688 Py_VISIT(m->md_dict);
689 return 0;
Neil Schemenauer10e31cf2001-01-02 15:58:27 +0000690}
691
Martin v. Löwis1a214512008-06-11 05:26:20 +0000692static int
693module_clear(PyModuleObject *m)
694{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000695 if (m->md_def && m->md_def->m_clear) {
696 int res = m->md_def->m_clear((PyObject*)m);
697 if (res)
698 return res;
699 }
700 Py_CLEAR(m->md_dict);
701 return 0;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000702}
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000703
Benjamin Peterson82b00c12011-05-24 11:09:06 -0500704static PyObject *
705module_dir(PyObject *self, PyObject *args)
706{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200707 _Py_IDENTIFIER(__dict__);
Benjamin Peterson82b00c12011-05-24 11:09:06 -0500708 PyObject *result = NULL;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +0200709 PyObject *dict = _PyObject_GetAttrId(self, &PyId___dict__);
Benjamin Peterson82b00c12011-05-24 11:09:06 -0500710
711 if (dict != NULL) {
712 if (PyDict_Check(dict))
713 result = PyDict_Keys(dict);
714 else {
715 const char *name = PyModule_GetName(self);
716 if (name)
717 PyErr_Format(PyExc_TypeError,
718 "%.200s.__dict__ is not a dictionary",
719 name);
720 }
721 }
722
723 Py_XDECREF(dict);
724 return result;
725}
726
727static PyMethodDef module_methods[] = {
728 {"__dir__", module_dir, METH_NOARGS,
Benjamin Petersonc7284122011-05-24 12:46:15 -0500729 PyDoc_STR("__dir__() -> list\nspecialized dir() implementation")},
Benjamin Peterson82b00c12011-05-24 11:09:06 -0500730 {0}
731};
732
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000733PyDoc_STRVAR(module_doc,
Guido van Rossumed3e09f2002-06-04 06:02:35 +0000734"module(name[, doc])\n\
735\n\
736Create a module object.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000737The name must be a string; the optional doc argument can have any type.");
Guido van Rossumed3e09f2002-06-04 06:02:35 +0000738
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000739PyTypeObject PyModule_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000740 PyVarObject_HEAD_INIT(&PyType_Type, 0)
741 "module", /* tp_name */
742 sizeof(PyModuleObject), /* tp_size */
743 0, /* tp_itemsize */
744 (destructor)module_dealloc, /* tp_dealloc */
745 0, /* tp_print */
746 0, /* tp_getattr */
747 0, /* tp_setattr */
748 0, /* tp_reserved */
749 (reprfunc)module_repr, /* tp_repr */
750 0, /* tp_as_number */
751 0, /* tp_as_sequence */
752 0, /* tp_as_mapping */
753 0, /* tp_hash */
754 0, /* tp_call */
755 0, /* tp_str */
Benjamin Peterson1184e262014-04-24 19:29:23 -0400756 (getattrofunc)module_getattro, /* tp_getattro */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000757 PyObject_GenericSetAttr, /* tp_setattro */
758 0, /* tp_as_buffer */
759 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
760 Py_TPFLAGS_BASETYPE, /* tp_flags */
761 module_doc, /* tp_doc */
762 (traverseproc)module_traverse, /* tp_traverse */
763 (inquiry)module_clear, /* tp_clear */
764 0, /* tp_richcompare */
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200765 offsetof(PyModuleObject, md_weaklist), /* tp_weaklistoffset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000766 0, /* tp_iter */
767 0, /* tp_iternext */
Benjamin Peterson82b00c12011-05-24 11:09:06 -0500768 module_methods, /* tp_methods */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000769 module_members, /* tp_members */
770 0, /* tp_getset */
771 0, /* tp_base */
772 0, /* tp_dict */
773 0, /* tp_descr_get */
774 0, /* tp_descr_set */
775 offsetof(PyModuleObject, md_dict), /* tp_dictoffset */
776 (initproc)module_init, /* tp_init */
777 PyType_GenericAlloc, /* tp_alloc */
778 PyType_GenericNew, /* tp_new */
779 PyObject_GC_Del, /* tp_free */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000780};