blob: dca5e58c44a3b1391bcd3a0234c725e10251a230 [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
Martin v. Löwis1a214512008-06-11 05:26:20 +000023static PyTypeObject moduledef_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
Brett Cannon4c14b5d2013-05-04 13:56:58 -040031static int
Antoine Pitroudcedaf62013-07-31 23:14:08 +020032module_init_dict(PyModuleObject *mod, PyObject *md_dict,
33 PyObject *name, PyObject *doc)
Brett Cannon4c14b5d2013-05-04 13:56:58 -040034{
Benjamin Peterson027ce162014-04-24 19:39:18 -040035 _Py_IDENTIFIER(__name__);
36 _Py_IDENTIFIER(__doc__);
37 _Py_IDENTIFIER(__package__);
38 _Py_IDENTIFIER(__loader__);
39 _Py_IDENTIFIER(__spec__);
Serhiy Storchaka009b8112015-03-18 21:53:15 +020040
Brett Cannon4c14b5d2013-05-04 13:56:58 -040041 if (md_dict == NULL)
42 return -1;
43 if (doc == NULL)
44 doc = Py_None;
45
Benjamin Peterson027ce162014-04-24 19:39:18 -040046 if (_PyDict_SetItemId(md_dict, &PyId___name__, name) != 0)
Brett Cannon4c14b5d2013-05-04 13:56:58 -040047 return -1;
Benjamin Peterson027ce162014-04-24 19:39:18 -040048 if (_PyDict_SetItemId(md_dict, &PyId___doc__, doc) != 0)
Brett Cannon4c14b5d2013-05-04 13:56:58 -040049 return -1;
Benjamin Peterson027ce162014-04-24 19:39:18 -040050 if (_PyDict_SetItemId(md_dict, &PyId___package__, Py_None) != 0)
Brett Cannon4c14b5d2013-05-04 13:56:58 -040051 return -1;
Benjamin Peterson027ce162014-04-24 19:39:18 -040052 if (_PyDict_SetItemId(md_dict, &PyId___loader__, Py_None) != 0)
Brett Cannon4c14b5d2013-05-04 13:56:58 -040053 return -1;
Benjamin Peterson027ce162014-04-24 19:39:18 -040054 if (_PyDict_SetItemId(md_dict, &PyId___spec__, Py_None) != 0)
Eric Snowb523f842013-11-22 09:05:39 -070055 return -1;
Antoine Pitroudcedaf62013-07-31 23:14:08 +020056 if (PyUnicode_CheckExact(name)) {
57 Py_INCREF(name);
58 Py_XDECREF(mod->md_name);
59 mod->md_name = name;
60 }
Brett Cannon4c14b5d2013-05-04 13:56:58 -040061
62 return 0;
63}
64
65
Guido van Rossumc0b618a1997-05-02 03:12:38 +000066PyObject *
Victor Stinner0639b562011-03-04 12:57:07 +000067PyModule_NewObject(PyObject *name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000068{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000069 PyModuleObject *m;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000070 m = PyObject_GC_New(PyModuleObject, &PyModule_Type);
71 if (m == NULL)
72 return NULL;
73 m->md_def = NULL;
74 m->md_state = NULL;
Antoine Pitroudcedaf62013-07-31 23:14:08 +020075 m->md_weaklist = NULL;
76 m->md_name = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000077 m->md_dict = PyDict_New();
Antoine Pitroudcedaf62013-07-31 23:14:08 +020078 if (module_init_dict(m, m->md_dict, name, NULL) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000079 goto fail;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000080 PyObject_GC_Track(m);
81 return (PyObject *)m;
Guido van Rossumc45611d1993-11-17 22:58:56 +000082
83 fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000084 Py_DECREF(m);
85 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000086}
87
Martin v. Löwis1a214512008-06-11 05:26:20 +000088PyObject *
Victor Stinner0639b562011-03-04 12:57:07 +000089PyModule_New(const char *name)
90{
91 PyObject *nameobj, *module;
92 nameobj = PyUnicode_FromString(name);
93 if (nameobj == NULL)
94 return NULL;
95 module = PyModule_NewObject(nameobj);
96 Py_DECREF(nameobj);
97 return module;
98}
99
100
101PyObject *
Martin v. Löwis1a214512008-06-11 05:26:20 +0000102PyModule_Create2(struct PyModuleDef* module, int module_api_version)
103{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000104 PyObject *d, *v, *n;
105 PyMethodDef *ml;
106 const char* name;
107 PyModuleObject *m;
R. David Murrayce4b1702010-12-14 23:06:25 +0000108 PyInterpreterState *interp = PyThreadState_Get()->interp;
109 if (interp->modules == NULL)
110 Py_FatalError("Python import machinery not initialized");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000111 if (PyType_Ready(&moduledef_type) < 0)
112 return NULL;
113 if (module->m_base.m_index == 0) {
114 max_module_number++;
115 Py_REFCNT(module) = 1;
116 Py_TYPE(module) = &moduledef_type;
117 module->m_base.m_index = max_module_number;
118 }
119 name = module->m_name;
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)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000128 return NULL;
129 }
130 /* Make sure name is fully qualified.
Martin v. Löwis1a214512008-06-11 05:26:20 +0000131
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000132 This is a bit of a hack: when the shared library is loaded,
133 the module name is "package.module", but the module calls
134 PyModule_Create*() with just "module" for the name. The shared
135 library loader squirrels away the true name of the module in
136 _Py_PackageContext, and PyModule_Create*() will substitute this
137 (if the name actually matches).
138 */
139 if (_Py_PackageContext != NULL) {
140 char *p = strrchr(_Py_PackageContext, '.');
141 if (p != NULL && strcmp(module->m_name, p+1) == 0) {
142 name = _Py_PackageContext;
143 _Py_PackageContext = NULL;
144 }
145 }
146 if ((m = (PyModuleObject*)PyModule_New(name)) == NULL)
147 return NULL;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000148
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000149 if (module->m_size > 0) {
150 m->md_state = PyMem_MALLOC(module->m_size);
151 if (!m->md_state) {
152 PyErr_NoMemory();
153 Py_DECREF(m);
154 return NULL;
155 }
156 memset(m->md_state, 0, module->m_size);
157 }
158
159 d = PyModule_GetDict((PyObject*)m);
160 if (module->m_methods != NULL) {
161 n = PyUnicode_FromString(name);
Meador Inge29e49d62012-07-19 13:45:43 -0500162 if (n == NULL) {
163 Py_DECREF(m);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000164 return NULL;
Meador Inge29e49d62012-07-19 13:45:43 -0500165 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000166 for (ml = module->m_methods; ml->ml_name != NULL; ml++) {
167 if ((ml->ml_flags & METH_CLASS) ||
168 (ml->ml_flags & METH_STATIC)) {
169 PyErr_SetString(PyExc_ValueError,
170 "module functions cannot set"
171 " METH_CLASS or METH_STATIC");
172 Py_DECREF(n);
Meador Inge29e49d62012-07-19 13:45:43 -0500173 Py_DECREF(m);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000174 return NULL;
175 }
176 v = PyCFunction_NewEx(ml, (PyObject*)m, n);
177 if (v == NULL) {
178 Py_DECREF(n);
Meador Inge29e49d62012-07-19 13:45:43 -0500179 Py_DECREF(m);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000180 return NULL;
181 }
182 if (PyDict_SetItemString(d, ml->ml_name, v) != 0) {
183 Py_DECREF(v);
184 Py_DECREF(n);
Meador Inge29e49d62012-07-19 13:45:43 -0500185 Py_DECREF(m);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000186 return NULL;
187 }
188 Py_DECREF(v);
189 }
190 Py_DECREF(n);
191 }
192 if (module->m_doc != NULL) {
Benjamin Peterson027ce162014-04-24 19:39:18 -0400193 _Py_IDENTIFIER(__doc__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000194 v = PyUnicode_FromString(module->m_doc);
Benjamin Peterson027ce162014-04-24 19:39:18 -0400195 if (v == NULL || _PyDict_SetItemId(d, &PyId___doc__, v) != 0) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000196 Py_XDECREF(v);
Meador Inge29e49d62012-07-19 13:45:43 -0500197 Py_DECREF(m);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000198 return NULL;
199 }
200 Py_DECREF(v);
201 }
202 m->md_def = module;
203 return (PyObject*)m;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000204}
205
206
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000207PyObject *
Fred Drakeee238b92000-07-09 06:03:25 +0000208PyModule_GetDict(PyObject *m)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000209{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000210 PyObject *d;
211 if (!PyModule_Check(m)) {
212 PyErr_BadInternalCall();
213 return NULL;
214 }
215 d = ((PyModuleObject *)m) -> md_dict;
216 if (d == NULL)
217 ((PyModuleObject *)m) -> md_dict = d = PyDict_New();
218 return d;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000219}
220
Victor Stinnerbd475112011-02-23 00:21:43 +0000221PyObject*
222PyModule_GetNameObject(PyObject *m)
Guido van Rossum0558a201990-10-26 15:00:11 +0000223{
Benjamin Peterson027ce162014-04-24 19:39:18 -0400224 _Py_IDENTIFIER(__name__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000225 PyObject *d;
Victor Stinnerbd475112011-02-23 00:21:43 +0000226 PyObject *name;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000227 if (!PyModule_Check(m)) {
228 PyErr_BadArgument();
229 return NULL;
230 }
231 d = ((PyModuleObject *)m)->md_dict;
232 if (d == NULL ||
Benjamin Peterson027ce162014-04-24 19:39:18 -0400233 (name = _PyDict_GetItemId(d, &PyId___name__)) == NULL ||
Victor Stinnerbd475112011-02-23 00:21:43 +0000234 !PyUnicode_Check(name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000235 {
236 PyErr_SetString(PyExc_SystemError, "nameless module");
237 return NULL;
238 }
Victor Stinnerbd475112011-02-23 00:21:43 +0000239 Py_INCREF(name);
240 return name;
241}
242
243const char *
244PyModule_GetName(PyObject *m)
245{
246 PyObject *name = PyModule_GetNameObject(m);
247 if (name == NULL)
248 return NULL;
249 Py_DECREF(name); /* module dict has still a reference */
250 return _PyUnicode_AsString(name);
Guido van Rossum0558a201990-10-26 15:00:11 +0000251}
252
Victor Stinner6c00c142010-08-17 23:37:11 +0000253PyObject*
254PyModule_GetFilenameObject(PyObject *m)
Guido van Rossum98cc19f1999-02-15 14:47:16 +0000255{
Benjamin Peterson027ce162014-04-24 19:39:18 -0400256 _Py_IDENTIFIER(__file__);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000257 PyObject *d;
258 PyObject *fileobj;
259 if (!PyModule_Check(m)) {
260 PyErr_BadArgument();
261 return NULL;
262 }
263 d = ((PyModuleObject *)m)->md_dict;
264 if (d == NULL ||
Benjamin Peterson027ce162014-04-24 19:39:18 -0400265 (fileobj = _PyDict_GetItemId(d, &PyId___file__)) == NULL ||
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000266 !PyUnicode_Check(fileobj))
267 {
268 PyErr_SetString(PyExc_SystemError, "module filename missing");
269 return NULL;
270 }
Victor Stinner6c00c142010-08-17 23:37:11 +0000271 Py_INCREF(fileobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000272 return fileobj;
Victor Stinner8124feb2010-05-07 00:50:12 +0000273}
274
275const char *
276PyModule_GetFilename(PyObject *m)
277{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000278 PyObject *fileobj;
Victor Stinner6c00c142010-08-17 23:37:11 +0000279 char *utf8;
280 fileobj = PyModule_GetFilenameObject(m);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000281 if (fileobj == NULL)
282 return NULL;
Victor Stinner6c00c142010-08-17 23:37:11 +0000283 utf8 = _PyUnicode_AsString(fileobj);
Victor Stinnerbd475112011-02-23 00:21:43 +0000284 Py_DECREF(fileobj); /* module dict has still a reference */
Victor Stinner6c00c142010-08-17 23:37:11 +0000285 return utf8;
Guido van Rossum98cc19f1999-02-15 14:47:16 +0000286}
287
Martin v. Löwis1a214512008-06-11 05:26:20 +0000288PyModuleDef*
289PyModule_GetDef(PyObject* m)
290{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000291 if (!PyModule_Check(m)) {
292 PyErr_BadArgument();
293 return NULL;
294 }
295 return ((PyModuleObject *)m)->md_def;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000296}
297
298void*
299PyModule_GetState(PyObject* m)
300{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000301 if (!PyModule_Check(m)) {
302 PyErr_BadArgument();
303 return NULL;
304 }
305 return ((PyModuleObject *)m)->md_state;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000306}
307
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000308void
Fred Drakeee238b92000-07-09 06:03:25 +0000309_PyModule_Clear(PyObject *m)
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000310{
Serhiy Storchaka87a5c512014-02-10 18:21:34 +0200311 PyObject *d = ((PyModuleObject *)m)->md_dict;
312 if (d != NULL)
313 _PyModule_ClearDict(d);
314}
315
316void
317_PyModule_ClearDict(PyObject *d)
318{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000319 /* To make the execution order of destructors for global
320 objects a bit more predictable, we first zap all objects
321 whose name starts with a single underscore, before we clear
322 the entire dictionary. We zap them by replacing them with
323 None, rather than deleting them from the dictionary, to
324 avoid rehashing the dictionary (to some extent). */
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000325
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000326 Py_ssize_t pos;
327 PyObject *key, *value;
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000328
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000329 /* First, clear only names starting with a single underscore */
330 pos = 0;
331 while (PyDict_Next(d, &pos, &key, &value)) {
332 if (value != Py_None && PyUnicode_Check(key)) {
Brett Cannon62228db2012-04-29 14:38:11 -0400333 if (PyUnicode_READ_CHAR(key, 0) == '_' &&
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200334 PyUnicode_READ_CHAR(key, 1) != '_') {
Victor Stinnerf3f22a22010-05-19 00:03:09 +0000335 if (Py_VerboseFlag > 1) {
336 const char *s = _PyUnicode_AsString(key);
337 if (s != NULL)
338 PySys_WriteStderr("# clear[1] %s\n", s);
339 else
340 PyErr_Clear();
341 }
Serhiy Storchaka1f9d11b2014-02-12 09:55:01 +0200342 if (PyDict_SetItem(d, key, Py_None) != 0)
343 PyErr_Clear();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000344 }
345 }
346 }
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000347
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000348 /* Next, clear all names except for __builtins__ */
349 pos = 0;
350 while (PyDict_Next(d, &pos, &key, &value)) {
351 if (value != Py_None && PyUnicode_Check(key)) {
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200352 if (PyUnicode_READ_CHAR(key, 0) != '_' ||
353 PyUnicode_CompareWithASCIIString(key, "__builtins__") != 0)
Victor Stinnerf3f22a22010-05-19 00:03:09 +0000354 {
355 if (Py_VerboseFlag > 1) {
356 const char *s = _PyUnicode_AsString(key);
357 if (s != NULL)
358 PySys_WriteStderr("# clear[2] %s\n", s);
359 else
360 PyErr_Clear();
361 }
Serhiy Storchaka1f9d11b2014-02-12 09:55:01 +0200362 if (PyDict_SetItem(d, key, Py_None) != 0)
363 PyErr_Clear();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000364 }
365 }
366 }
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000367
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000368 /* Note: we leave __builtins__ in place, so that destructors
369 of non-global objects defined in this module can still use
370 builtins, in particularly 'None'. */
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000371
372}
373
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000374/* Methods */
375
Tim Peters6d6c1a32001-08-02 04:15:00 +0000376static int
Guido van Rossumc3a787e2002-06-04 05:52:47 +0000377module_init(PyModuleObject *m, PyObject *args, PyObject *kwds)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000378{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000379 static char *kwlist[] = {"name", "doc", NULL};
380 PyObject *dict, *name = Py_None, *doc = Py_None;
381 if (!PyArg_ParseTupleAndKeywords(args, kwds, "U|O:module.__init__",
382 kwlist, &name, &doc))
383 return -1;
384 dict = m->md_dict;
385 if (dict == NULL) {
386 dict = PyDict_New();
387 if (dict == NULL)
388 return -1;
389 m->md_dict = dict;
390 }
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200391 if (module_init_dict(m, dict, name, doc) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000392 return -1;
393 return 0;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000394}
395
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000396static void
Fred Drakeee238b92000-07-09 06:03:25 +0000397module_dealloc(PyModuleObject *m)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000398{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000399 PyObject_GC_UnTrack(m);
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200400 if (Py_VerboseFlag && m->md_name) {
401 PySys_FormatStderr("# destroy %S\n", m->md_name);
402 }
403 if (m->md_weaklist != NULL)
404 PyObject_ClearWeakRefs((PyObject *) m);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000405 if (m->md_def && m->md_def->m_free)
406 m->md_def->m_free(m);
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200407 Py_XDECREF(m->md_dict);
408 Py_XDECREF(m->md_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000409 if (m->md_state != NULL)
410 PyMem_FREE(m->md_state);
411 Py_TYPE(m)->tp_free((PyObject *)m);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000412}
413
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000414static PyObject *
Fred Drakeee238b92000-07-09 06:03:25 +0000415module_repr(PyModuleObject *m)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000416{
Eric Snowb523f842013-11-22 09:05:39 -0700417 PyThreadState *tstate = PyThreadState_GET();
418 PyInterpreterState *interp = tstate->interp;
Barry Warsaw2907fe62001-08-16 20:39:24 +0000419
Eric Snowb523f842013-11-22 09:05:39 -0700420 return PyObject_CallMethod(interp->importlib, "_module_repr", "O", m);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000421}
422
Ethan Furman7b9ff0e2014-04-24 14:47:47 -0700423static PyObject*
Benjamin Peterson1184e262014-04-24 19:29:23 -0400424module_getattro(PyModuleObject *m, PyObject *name)
Ethan Furman7b9ff0e2014-04-24 14:47:47 -0700425{
Ethan Furman7b9ff0e2014-04-24 14:47:47 -0700426 PyObject *attr, *mod_name;
Benjamin Peterson1184e262014-04-24 19:29:23 -0400427 attr = PyObject_GenericGetAttr((PyObject *)m, name);
428 if (attr || !PyErr_ExceptionMatches(PyExc_AttributeError))
Ethan Furman7b9ff0e2014-04-24 14:47:47 -0700429 return attr;
430 PyErr_Clear();
Benjamin Peterson1184e262014-04-24 19:29:23 -0400431 if (m->md_dict) {
Benjamin Peterson027ce162014-04-24 19:39:18 -0400432 _Py_IDENTIFIER(__name__);
433 mod_name = _PyDict_GetItemId(m->md_dict, &PyId___name__);
Benjamin Peterson1184e262014-04-24 19:29:23 -0400434 if (mod_name) {
Ethan Furman7b9ff0e2014-04-24 14:47:47 -0700435 PyErr_Format(PyExc_AttributeError,
436 "module '%U' has no attribute '%U'", mod_name, name);
437 return NULL;
438 }
Benjamin Peterson1184e262014-04-24 19:29:23 -0400439 else if (PyErr_Occurred()) {
Ethan Furman7b9ff0e2014-04-24 14:47:47 -0700440 PyErr_Clear();
Benjamin Peterson1184e262014-04-24 19:29:23 -0400441 }
Ethan Furman7b9ff0e2014-04-24 14:47:47 -0700442 }
443 PyErr_Format(PyExc_AttributeError,
444 "module has no attribute '%U'", name);
445 return NULL;
446}
447
Neil Schemenauer10e31cf2001-01-02 15:58:27 +0000448static int
449module_traverse(PyModuleObject *m, visitproc visit, void *arg)
450{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000451 if (m->md_def && m->md_def->m_traverse) {
452 int res = m->md_def->m_traverse((PyObject*)m, visit, arg);
453 if (res)
454 return res;
455 }
456 Py_VISIT(m->md_dict);
457 return 0;
Neil Schemenauer10e31cf2001-01-02 15:58:27 +0000458}
459
Martin v. Löwis1a214512008-06-11 05:26:20 +0000460static int
461module_clear(PyModuleObject *m)
462{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000463 if (m->md_def && m->md_def->m_clear) {
464 int res = m->md_def->m_clear((PyObject*)m);
465 if (res)
466 return res;
467 }
468 Py_CLEAR(m->md_dict);
469 return 0;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000470}
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000471
Benjamin Peterson82b00c12011-05-24 11:09:06 -0500472static PyObject *
473module_dir(PyObject *self, PyObject *args)
474{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200475 _Py_IDENTIFIER(__dict__);
Benjamin Peterson82b00c12011-05-24 11:09:06 -0500476 PyObject *result = NULL;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +0200477 PyObject *dict = _PyObject_GetAttrId(self, &PyId___dict__);
Benjamin Peterson82b00c12011-05-24 11:09:06 -0500478
479 if (dict != NULL) {
480 if (PyDict_Check(dict))
481 result = PyDict_Keys(dict);
482 else {
483 const char *name = PyModule_GetName(self);
484 if (name)
485 PyErr_Format(PyExc_TypeError,
486 "%.200s.__dict__ is not a dictionary",
487 name);
488 }
489 }
490
491 Py_XDECREF(dict);
492 return result;
493}
494
495static PyMethodDef module_methods[] = {
496 {"__dir__", module_dir, METH_NOARGS,
Benjamin Petersonc7284122011-05-24 12:46:15 -0500497 PyDoc_STR("__dir__() -> list\nspecialized dir() implementation")},
Benjamin Peterson82b00c12011-05-24 11:09:06 -0500498 {0}
499};
500
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000501PyDoc_STRVAR(module_doc,
Guido van Rossumed3e09f2002-06-04 06:02:35 +0000502"module(name[, doc])\n\
503\n\
504Create a module object.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000505The name must be a string; the optional doc argument can have any type.");
Guido van Rossumed3e09f2002-06-04 06:02:35 +0000506
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000507PyTypeObject PyModule_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000508 PyVarObject_HEAD_INIT(&PyType_Type, 0)
509 "module", /* tp_name */
510 sizeof(PyModuleObject), /* tp_size */
511 0, /* tp_itemsize */
512 (destructor)module_dealloc, /* tp_dealloc */
513 0, /* tp_print */
514 0, /* tp_getattr */
515 0, /* tp_setattr */
516 0, /* tp_reserved */
517 (reprfunc)module_repr, /* tp_repr */
518 0, /* tp_as_number */
519 0, /* tp_as_sequence */
520 0, /* tp_as_mapping */
521 0, /* tp_hash */
522 0, /* tp_call */
523 0, /* tp_str */
Benjamin Peterson1184e262014-04-24 19:29:23 -0400524 (getattrofunc)module_getattro, /* tp_getattro */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000525 PyObject_GenericSetAttr, /* tp_setattro */
526 0, /* tp_as_buffer */
527 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
528 Py_TPFLAGS_BASETYPE, /* tp_flags */
529 module_doc, /* tp_doc */
530 (traverseproc)module_traverse, /* tp_traverse */
531 (inquiry)module_clear, /* tp_clear */
532 0, /* tp_richcompare */
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200533 offsetof(PyModuleObject, md_weaklist), /* tp_weaklistoffset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000534 0, /* tp_iter */
535 0, /* tp_iternext */
Benjamin Peterson82b00c12011-05-24 11:09:06 -0500536 module_methods, /* tp_methods */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000537 module_members, /* tp_members */
538 0, /* tp_getset */
539 0, /* tp_base */
540 0, /* tp_dict */
541 0, /* tp_descr_get */
542 0, /* tp_descr_set */
543 offsetof(PyModuleObject, md_dict), /* tp_dictoffset */
544 (initproc)module_init, /* tp_init */
545 PyType_GenericAlloc, /* tp_alloc */
546 PyType_GenericNew, /* tp_new */
547 PyObject_GC_Del, /* tp_free */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000548};