blob: f509932a306bee9ae977377da62e2a04ceb79fd9 [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{
35 if (md_dict == NULL)
36 return -1;
37 if (doc == NULL)
38 doc = Py_None;
39
40 if (PyDict_SetItemString(md_dict, "__name__", name) != 0)
41 return -1;
42 if (PyDict_SetItemString(md_dict, "__doc__", doc) != 0)
43 return -1;
44 if (PyDict_SetItemString(md_dict, "__package__", Py_None) != 0)
45 return -1;
46 if (PyDict_SetItemString(md_dict, "__loader__", Py_None) != 0)
47 return -1;
Eric Snowb523f842013-11-22 09:05:39 -070048 if (PyDict_SetItemString(md_dict, "__spec__", Py_None) != 0)
49 return -1;
Antoine Pitroudcedaf62013-07-31 23:14:08 +020050 if (PyUnicode_CheckExact(name)) {
51 Py_INCREF(name);
52 Py_XDECREF(mod->md_name);
53 mod->md_name = name;
54 }
Brett Cannon4c14b5d2013-05-04 13:56:58 -040055
56 return 0;
57}
58
59
Guido van Rossumc0b618a1997-05-02 03:12:38 +000060PyObject *
Victor Stinner0639b562011-03-04 12:57:07 +000061PyModule_NewObject(PyObject *name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000062{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000063 PyModuleObject *m;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000064 m = PyObject_GC_New(PyModuleObject, &PyModule_Type);
65 if (m == NULL)
66 return NULL;
67 m->md_def = NULL;
68 m->md_state = NULL;
Antoine Pitroudcedaf62013-07-31 23:14:08 +020069 m->md_weaklist = NULL;
70 m->md_name = NULL;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000071 m->md_dict = PyDict_New();
Antoine Pitroudcedaf62013-07-31 23:14:08 +020072 if (module_init_dict(m, m->md_dict, name, NULL) != 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000073 goto fail;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000074 PyObject_GC_Track(m);
75 return (PyObject *)m;
Guido van Rossumc45611d1993-11-17 22:58:56 +000076
77 fail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000078 Py_DECREF(m);
79 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000080}
81
Martin v. Löwis1a214512008-06-11 05:26:20 +000082PyObject *
Victor Stinner0639b562011-03-04 12:57:07 +000083PyModule_New(const char *name)
84{
85 PyObject *nameobj, *module;
86 nameobj = PyUnicode_FromString(name);
87 if (nameobj == NULL)
88 return NULL;
89 module = PyModule_NewObject(nameobj);
90 Py_DECREF(nameobj);
91 return module;
92}
93
94
95PyObject *
Martin v. Löwis1a214512008-06-11 05:26:20 +000096PyModule_Create2(struct PyModuleDef* module, int module_api_version)
97{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000098 PyObject *d, *v, *n;
99 PyMethodDef *ml;
100 const char* name;
101 PyModuleObject *m;
R. David Murrayce4b1702010-12-14 23:06:25 +0000102 PyInterpreterState *interp = PyThreadState_Get()->interp;
103 if (interp->modules == NULL)
104 Py_FatalError("Python import machinery not initialized");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000105 if (PyType_Ready(&moduledef_type) < 0)
106 return NULL;
107 if (module->m_base.m_index == 0) {
108 max_module_number++;
109 Py_REFCNT(module) = 1;
110 Py_TYPE(module) = &moduledef_type;
111 module->m_base.m_index = max_module_number;
112 }
113 name = module->m_name;
Martin v. Löwis4d0d4712010-12-03 20:14:31 +0000114 if (module_api_version != PYTHON_API_VERSION && module_api_version != PYTHON_ABI_VERSION) {
Victor Stinner4a2b7a12010-08-13 14:03:48 +0000115 int err;
116 err = PyErr_WarnFormat(PyExc_RuntimeWarning, 1,
117 "Python C API version mismatch for module %.100s: "
118 "This Python has API version %d, module %.100s has version %d.",
119 name,
120 PYTHON_API_VERSION, name, module_api_version);
121 if (err)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000122 return NULL;
123 }
124 /* Make sure name is fully qualified.
Martin v. Löwis1a214512008-06-11 05:26:20 +0000125
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000126 This is a bit of a hack: when the shared library is loaded,
127 the module name is "package.module", but the module calls
128 PyModule_Create*() with just "module" for the name. The shared
129 library loader squirrels away the true name of the module in
130 _Py_PackageContext, and PyModule_Create*() will substitute this
131 (if the name actually matches).
132 */
133 if (_Py_PackageContext != NULL) {
134 char *p = strrchr(_Py_PackageContext, '.');
135 if (p != NULL && strcmp(module->m_name, p+1) == 0) {
136 name = _Py_PackageContext;
137 _Py_PackageContext = NULL;
138 }
139 }
140 if ((m = (PyModuleObject*)PyModule_New(name)) == NULL)
141 return NULL;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000142
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000143 if (module->m_size > 0) {
144 m->md_state = PyMem_MALLOC(module->m_size);
145 if (!m->md_state) {
146 PyErr_NoMemory();
147 Py_DECREF(m);
148 return NULL;
149 }
150 memset(m->md_state, 0, module->m_size);
151 }
152
153 d = PyModule_GetDict((PyObject*)m);
154 if (module->m_methods != NULL) {
155 n = PyUnicode_FromString(name);
Meador Inge29e49d62012-07-19 13:45:43 -0500156 if (n == NULL) {
157 Py_DECREF(m);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000158 return NULL;
Meador Inge29e49d62012-07-19 13:45:43 -0500159 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000160 for (ml = module->m_methods; ml->ml_name != NULL; ml++) {
161 if ((ml->ml_flags & METH_CLASS) ||
162 (ml->ml_flags & METH_STATIC)) {
163 PyErr_SetString(PyExc_ValueError,
164 "module functions cannot set"
165 " METH_CLASS or METH_STATIC");
166 Py_DECREF(n);
Meador Inge29e49d62012-07-19 13:45:43 -0500167 Py_DECREF(m);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000168 return NULL;
169 }
170 v = PyCFunction_NewEx(ml, (PyObject*)m, n);
171 if (v == NULL) {
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 if (PyDict_SetItemString(d, ml->ml_name, v) != 0) {
177 Py_DECREF(v);
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 Py_DECREF(v);
183 }
184 Py_DECREF(n);
185 }
186 if (module->m_doc != NULL) {
187 v = PyUnicode_FromString(module->m_doc);
188 if (v == NULL || PyDict_SetItemString(d, "__doc__", v) != 0) {
189 Py_XDECREF(v);
Meador Inge29e49d62012-07-19 13:45:43 -0500190 Py_DECREF(m);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000191 return NULL;
192 }
193 Py_DECREF(v);
194 }
195 m->md_def = module;
196 return (PyObject*)m;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000197}
198
199
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000200PyObject *
Fred Drakeee238b92000-07-09 06:03:25 +0000201PyModule_GetDict(PyObject *m)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000202{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000203 PyObject *d;
204 if (!PyModule_Check(m)) {
205 PyErr_BadInternalCall();
206 return NULL;
207 }
208 d = ((PyModuleObject *)m) -> md_dict;
209 if (d == NULL)
210 ((PyModuleObject *)m) -> md_dict = d = PyDict_New();
211 return d;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000212}
213
Victor Stinnerbd475112011-02-23 00:21:43 +0000214PyObject*
215PyModule_GetNameObject(PyObject *m)
Guido van Rossum0558a201990-10-26 15:00:11 +0000216{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000217 PyObject *d;
Victor Stinnerbd475112011-02-23 00:21:43 +0000218 PyObject *name;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000219 if (!PyModule_Check(m)) {
220 PyErr_BadArgument();
221 return NULL;
222 }
223 d = ((PyModuleObject *)m)->md_dict;
224 if (d == NULL ||
Victor Stinnerbd475112011-02-23 00:21:43 +0000225 (name = PyDict_GetItemString(d, "__name__")) == NULL ||
226 !PyUnicode_Check(name))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000227 {
228 PyErr_SetString(PyExc_SystemError, "nameless module");
229 return NULL;
230 }
Victor Stinnerbd475112011-02-23 00:21:43 +0000231 Py_INCREF(name);
232 return name;
233}
234
235const char *
236PyModule_GetName(PyObject *m)
237{
238 PyObject *name = PyModule_GetNameObject(m);
239 if (name == NULL)
240 return NULL;
241 Py_DECREF(name); /* module dict has still a reference */
242 return _PyUnicode_AsString(name);
Guido van Rossum0558a201990-10-26 15:00:11 +0000243}
244
Victor Stinner6c00c142010-08-17 23:37:11 +0000245PyObject*
246PyModule_GetFilenameObject(PyObject *m)
Guido van Rossum98cc19f1999-02-15 14:47:16 +0000247{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000248 PyObject *d;
249 PyObject *fileobj;
250 if (!PyModule_Check(m)) {
251 PyErr_BadArgument();
252 return NULL;
253 }
254 d = ((PyModuleObject *)m)->md_dict;
255 if (d == NULL ||
256 (fileobj = PyDict_GetItemString(d, "__file__")) == NULL ||
257 !PyUnicode_Check(fileobj))
258 {
259 PyErr_SetString(PyExc_SystemError, "module filename missing");
260 return NULL;
261 }
Victor Stinner6c00c142010-08-17 23:37:11 +0000262 Py_INCREF(fileobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000263 return fileobj;
Victor Stinner8124feb2010-05-07 00:50:12 +0000264}
265
266const char *
267PyModule_GetFilename(PyObject *m)
268{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000269 PyObject *fileobj;
Victor Stinner6c00c142010-08-17 23:37:11 +0000270 char *utf8;
271 fileobj = PyModule_GetFilenameObject(m);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000272 if (fileobj == NULL)
273 return NULL;
Victor Stinner6c00c142010-08-17 23:37:11 +0000274 utf8 = _PyUnicode_AsString(fileobj);
Victor Stinnerbd475112011-02-23 00:21:43 +0000275 Py_DECREF(fileobj); /* module dict has still a reference */
Victor Stinner6c00c142010-08-17 23:37:11 +0000276 return utf8;
Guido van Rossum98cc19f1999-02-15 14:47:16 +0000277}
278
Martin v. Löwis1a214512008-06-11 05:26:20 +0000279PyModuleDef*
280PyModule_GetDef(PyObject* m)
281{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000282 if (!PyModule_Check(m)) {
283 PyErr_BadArgument();
284 return NULL;
285 }
286 return ((PyModuleObject *)m)->md_def;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000287}
288
289void*
290PyModule_GetState(PyObject* m)
291{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000292 if (!PyModule_Check(m)) {
293 PyErr_BadArgument();
294 return NULL;
295 }
296 return ((PyModuleObject *)m)->md_state;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000297}
298
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000299void
Fred Drakeee238b92000-07-09 06:03:25 +0000300_PyModule_Clear(PyObject *m)
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000301{
Serhiy Storchaka013bb912014-02-10 18:21:34 +0200302 PyObject *d = ((PyModuleObject *)m)->md_dict;
303 if (d != NULL)
304 _PyModule_ClearDict(d);
305}
306
307void
308_PyModule_ClearDict(PyObject *d)
309{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000310 /* To make the execution order of destructors for global
311 objects a bit more predictable, we first zap all objects
312 whose name starts with a single underscore, before we clear
313 the entire dictionary. We zap them by replacing them with
314 None, rather than deleting them from the dictionary, to
315 avoid rehashing the dictionary (to some extent). */
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000316
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000317 Py_ssize_t pos;
318 PyObject *key, *value;
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000319
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000320 /* First, clear only names starting with a single underscore */
321 pos = 0;
322 while (PyDict_Next(d, &pos, &key, &value)) {
323 if (value != Py_None && PyUnicode_Check(key)) {
Brett Cannon62228db2012-04-29 14:38:11 -0400324 if (PyUnicode_READ_CHAR(key, 0) == '_' &&
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200325 PyUnicode_READ_CHAR(key, 1) != '_') {
Victor Stinnerf3f22a22010-05-19 00:03:09 +0000326 if (Py_VerboseFlag > 1) {
327 const char *s = _PyUnicode_AsString(key);
328 if (s != NULL)
329 PySys_WriteStderr("# clear[1] %s\n", s);
330 else
331 PyErr_Clear();
332 }
Serhiy Storchaka3b4ce692014-02-12 09:55:45 +0200333 if (PyDict_SetItem(d, key, Py_None) != 0)
334 PyErr_Clear();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000335 }
336 }
337 }
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000338
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000339 /* Next, clear all names except for __builtins__ */
340 pos = 0;
341 while (PyDict_Next(d, &pos, &key, &value)) {
342 if (value != Py_None && PyUnicode_Check(key)) {
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200343 if (PyUnicode_READ_CHAR(key, 0) != '_' ||
344 PyUnicode_CompareWithASCIIString(key, "__builtins__") != 0)
Victor Stinnerf3f22a22010-05-19 00:03:09 +0000345 {
346 if (Py_VerboseFlag > 1) {
347 const char *s = _PyUnicode_AsString(key);
348 if (s != NULL)
349 PySys_WriteStderr("# clear[2] %s\n", s);
350 else
351 PyErr_Clear();
352 }
Serhiy Storchaka3b4ce692014-02-12 09:55:45 +0200353 if (PyDict_SetItem(d, key, Py_None) != 0)
354 PyErr_Clear();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000355 }
356 }
357 }
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000358
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000359 /* Note: we leave __builtins__ in place, so that destructors
360 of non-global objects defined in this module can still use
361 builtins, in particularly 'None'. */
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000362
363}
364
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000365/* Methods */
366
Tim Peters6d6c1a32001-08-02 04:15:00 +0000367static int
Guido van Rossumc3a787e2002-06-04 05:52:47 +0000368module_init(PyModuleObject *m, PyObject *args, PyObject *kwds)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000369{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000370 static char *kwlist[] = {"name", "doc", NULL};
371 PyObject *dict, *name = Py_None, *doc = Py_None;
372 if (!PyArg_ParseTupleAndKeywords(args, kwds, "U|O:module.__init__",
373 kwlist, &name, &doc))
374 return -1;
375 dict = m->md_dict;
376 if (dict == NULL) {
377 dict = PyDict_New();
378 if (dict == NULL)
379 return -1;
380 m->md_dict = dict;
381 }
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200382 if (module_init_dict(m, dict, name, doc) < 0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000383 return -1;
384 return 0;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000385}
386
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000387static void
Fred Drakeee238b92000-07-09 06:03:25 +0000388module_dealloc(PyModuleObject *m)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000389{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000390 PyObject_GC_UnTrack(m);
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200391 if (Py_VerboseFlag && m->md_name) {
392 PySys_FormatStderr("# destroy %S\n", m->md_name);
393 }
394 if (m->md_weaklist != NULL)
395 PyObject_ClearWeakRefs((PyObject *) m);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000396 if (m->md_def && m->md_def->m_free)
397 m->md_def->m_free(m);
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200398 Py_XDECREF(m->md_dict);
399 Py_XDECREF(m->md_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000400 if (m->md_state != NULL)
401 PyMem_FREE(m->md_state);
402 Py_TYPE(m)->tp_free((PyObject *)m);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000403}
404
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000405static PyObject *
Fred Drakeee238b92000-07-09 06:03:25 +0000406module_repr(PyModuleObject *m)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000407{
Eric Snowb523f842013-11-22 09:05:39 -0700408 PyThreadState *tstate = PyThreadState_GET();
409 PyInterpreterState *interp = tstate->interp;
Barry Warsaw2907fe62001-08-16 20:39:24 +0000410
Eric Snowb523f842013-11-22 09:05:39 -0700411 return PyObject_CallMethod(interp->importlib, "_module_repr", "O", m);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000412}
413
Neil Schemenauer10e31cf2001-01-02 15:58:27 +0000414static int
415module_traverse(PyModuleObject *m, visitproc visit, void *arg)
416{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000417 if (m->md_def && m->md_def->m_traverse) {
418 int res = m->md_def->m_traverse((PyObject*)m, visit, arg);
419 if (res)
420 return res;
421 }
422 Py_VISIT(m->md_dict);
423 return 0;
Neil Schemenauer10e31cf2001-01-02 15:58:27 +0000424}
425
Martin v. Löwis1a214512008-06-11 05:26:20 +0000426static int
427module_clear(PyModuleObject *m)
428{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000429 if (m->md_def && m->md_def->m_clear) {
430 int res = m->md_def->m_clear((PyObject*)m);
431 if (res)
432 return res;
433 }
434 Py_CLEAR(m->md_dict);
435 return 0;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000436}
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000437
Benjamin Peterson82b00c12011-05-24 11:09:06 -0500438static PyObject *
439module_dir(PyObject *self, PyObject *args)
440{
Martin v. Löwisbd928fe2011-10-14 10:20:37 +0200441 _Py_IDENTIFIER(__dict__);
Benjamin Peterson82b00c12011-05-24 11:09:06 -0500442 PyObject *result = NULL;
Martin v. Löwis1ee1b6f2011-10-10 18:11:30 +0200443 PyObject *dict = _PyObject_GetAttrId(self, &PyId___dict__);
Benjamin Peterson82b00c12011-05-24 11:09:06 -0500444
445 if (dict != NULL) {
446 if (PyDict_Check(dict))
447 result = PyDict_Keys(dict);
448 else {
449 const char *name = PyModule_GetName(self);
450 if (name)
451 PyErr_Format(PyExc_TypeError,
452 "%.200s.__dict__ is not a dictionary",
453 name);
454 }
455 }
456
457 Py_XDECREF(dict);
458 return result;
459}
460
461static PyMethodDef module_methods[] = {
462 {"__dir__", module_dir, METH_NOARGS,
Benjamin Petersonc7284122011-05-24 12:46:15 -0500463 PyDoc_STR("__dir__() -> list\nspecialized dir() implementation")},
Benjamin Peterson82b00c12011-05-24 11:09:06 -0500464 {0}
465};
466
Martin v. Löwis1a214512008-06-11 05:26:20 +0000467
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000468PyDoc_STRVAR(module_doc,
Guido van Rossumed3e09f2002-06-04 06:02:35 +0000469"module(name[, doc])\n\
470\n\
471Create a module object.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000472The name must be a string; the optional doc argument can have any type.");
Guido van Rossumed3e09f2002-06-04 06:02:35 +0000473
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000474PyTypeObject PyModule_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000475 PyVarObject_HEAD_INIT(&PyType_Type, 0)
476 "module", /* tp_name */
477 sizeof(PyModuleObject), /* tp_size */
478 0, /* tp_itemsize */
479 (destructor)module_dealloc, /* tp_dealloc */
480 0, /* tp_print */
481 0, /* tp_getattr */
482 0, /* tp_setattr */
483 0, /* tp_reserved */
484 (reprfunc)module_repr, /* tp_repr */
485 0, /* tp_as_number */
486 0, /* tp_as_sequence */
487 0, /* tp_as_mapping */
488 0, /* tp_hash */
489 0, /* tp_call */
490 0, /* tp_str */
491 PyObject_GenericGetAttr, /* tp_getattro */
492 PyObject_GenericSetAttr, /* tp_setattro */
493 0, /* tp_as_buffer */
494 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
495 Py_TPFLAGS_BASETYPE, /* tp_flags */
496 module_doc, /* tp_doc */
497 (traverseproc)module_traverse, /* tp_traverse */
498 (inquiry)module_clear, /* tp_clear */
499 0, /* tp_richcompare */
Antoine Pitroudcedaf62013-07-31 23:14:08 +0200500 offsetof(PyModuleObject, md_weaklist), /* tp_weaklistoffset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000501 0, /* tp_iter */
502 0, /* tp_iternext */
Benjamin Peterson82b00c12011-05-24 11:09:06 -0500503 module_methods, /* tp_methods */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000504 module_members, /* tp_members */
505 0, /* tp_getset */
506 0, /* tp_base */
507 0, /* tp_dict */
508 0, /* tp_descr_get */
509 0, /* tp_descr_set */
510 offsetof(PyModuleObject, md_dict), /* tp_dictoffset */
511 (initproc)module_init, /* tp_init */
512 PyType_GenericAlloc, /* tp_alloc */
513 PyType_GenericNew, /* tp_new */
514 PyObject_GC_Del, /* tp_free */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000515};