blob: 228ffeeae1f023a8e1fdf1a90afbc069780e8934 [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 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000010 PyObject_HEAD
11 PyObject *md_dict;
Martin v. Löwis1a214512008-06-11 05:26:20 +000012 struct PyModuleDef *md_def;
13 void *md_state;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000014} PyModuleObject;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000015
Neil Schemenauerf23473f2001-10-21 22:28:58 +000016static PyMemberDef module_members[] = {
Tim Peters6d6c1a32001-08-02 04:15:00 +000017 {"__dict__", T_OBJECT, offsetof(PyModuleObject, md_dict), READONLY},
18 {0}
19};
20
Martin v. Löwis1a214512008-06-11 05:26:20 +000021static PyTypeObject moduledef_type = {
22 PyVarObject_HEAD_INIT(&PyType_Type, 0)
23 "moduledef", /* tp_name */
24 sizeof(struct PyModuleDef), /* tp_size */
25 0, /* tp_itemsize */
26};
27
28
Guido van Rossumc0b618a1997-05-02 03:12:38 +000029PyObject *
Jeremy Hyltonaf68c872005-12-10 18:50:16 +000030PyModule_New(const char *name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000031{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000032 PyModuleObject *m;
33 PyObject *nameobj;
Neil Schemenauere83c00e2001-08-29 23:54:21 +000034 m = PyObject_GC_New(PyModuleObject, &PyModule_Type);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000035 if (m == NULL)
36 return NULL;
Martin v. Löwis1a214512008-06-11 05:26:20 +000037 m->md_def = NULL;
38 m->md_state = NULL;
Martin v. Löwis5b222132007-06-10 09:51:05 +000039 nameobj = PyUnicode_FromString(name);
Guido van Rossumc0b618a1997-05-02 03:12:38 +000040 m->md_dict = PyDict_New();
Guido van Rossumc45611d1993-11-17 22:58:56 +000041 if (m->md_dict == NULL || nameobj == NULL)
42 goto fail;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000043 if (PyDict_SetItemString(m->md_dict, "__name__", nameobj) != 0)
Guido van Rossumc45611d1993-11-17 22:58:56 +000044 goto fail;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000045 if (PyDict_SetItemString(m->md_dict, "__doc__", Py_None) != 0)
Guido van Rossum8b14b4c1995-01-07 11:59:29 +000046 goto fail;
Christian Heimescbf3b5c2007-12-03 21:02:03 +000047 if (PyDict_SetItemString(m->md_dict, "__package__", Py_None) != 0)
48 goto fail;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000049 Py_DECREF(nameobj);
Neil Schemenauere83c00e2001-08-29 23:54:21 +000050 PyObject_GC_Track(m);
Guido van Rossumc0b618a1997-05-02 03:12:38 +000051 return (PyObject *)m;
Guido van Rossumc45611d1993-11-17 22:58:56 +000052
53 fail:
Guido van Rossumc0b618a1997-05-02 03:12:38 +000054 Py_XDECREF(nameobj);
55 Py_DECREF(m);
Guido van Rossumc45611d1993-11-17 22:58:56 +000056 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000057}
58
Martin v. Löwis1a214512008-06-11 05:26:20 +000059static char api_version_warning[] =
60"Python C API version mismatch for module %.100s:\
61 This Python has API version %d, module %.100s has version %d.";
62
63PyObject *
64PyModule_Create2(struct PyModuleDef* module, int module_api_version)
65{
66 PyObject *d, *v, *n;
67 PyMethodDef *ml;
68 const char* name;
69 PyModuleObject *m;
70 if (!Py_IsInitialized())
71 Py_FatalError("Interpreter not initialized (version mismatch?)");
72 if (PyType_Ready(&moduledef_type) < 0)
73 return NULL;
74 if (module->m_base.m_index == 0) {
75 max_module_number++;
76 Py_REFCNT(module) = 1;
77 Py_TYPE(module) = &moduledef_type;
78 module->m_base.m_index = max_module_number;
79 }
80 name = module->m_name;
81 if (module_api_version != PYTHON_API_VERSION) {
82 char message[512];
83 PyOS_snprintf(message, sizeof(message),
84 api_version_warning, name,
85 PYTHON_API_VERSION, name,
86 module_api_version);
87 if (PyErr_WarnEx(PyExc_RuntimeWarning, message, 1))
88 return NULL;
89 }
90 /* Make sure name is fully qualified.
91
92 This is a bit of a hack: when the shared library is loaded,
93 the module name is "package.module", but the module calls
94 Py_InitModule*() with just "module" for the name. The shared
95 library loader squirrels away the true name of the module in
96 _Py_PackageContext, and Py_InitModule*() will substitute this
97 (if the name actually matches).
98 */
99 if (_Py_PackageContext != NULL) {
100 char *p = strrchr(_Py_PackageContext, '.');
101 if (p != NULL && strcmp(module->m_name, p+1) == 0) {
102 name = _Py_PackageContext;
103 _Py_PackageContext = NULL;
104 }
105 }
106 if ((m = (PyModuleObject*)PyModule_New(name)) == NULL)
107 return NULL;
108
109 if (module->m_size > 0) {
110 m->md_state = PyMem_MALLOC(module->m_size);
111 if (!m->md_state) {
112 PyErr_NoMemory();
113 Py_DECREF(m);
114 return NULL;
115 }
116 }
117
118 d = PyModule_GetDict((PyObject*)m);
119 if (module->m_methods != NULL) {
120 n = PyUnicode_FromString(name);
121 if (n == NULL)
122 return NULL;
123 for (ml = module->m_methods; ml->ml_name != NULL; ml++) {
124 if ((ml->ml_flags & METH_CLASS) ||
125 (ml->ml_flags & METH_STATIC)) {
126 PyErr_SetString(PyExc_ValueError,
127 "module functions cannot set"
128 " METH_CLASS or METH_STATIC");
129 Py_DECREF(n);
130 return NULL;
131 }
132 v = PyCFunction_NewEx(ml, (PyObject*)m, n);
133 if (v == NULL) {
134 Py_DECREF(n);
135 return NULL;
136 }
137 if (PyDict_SetItemString(d, ml->ml_name, v) != 0) {
138 Py_DECREF(v);
139 Py_DECREF(n);
140 return NULL;
141 }
142 Py_DECREF(v);
143 }
144 Py_DECREF(n);
145 }
146 if (module->m_doc != NULL) {
147 v = PyUnicode_FromString(module->m_doc);
148 if (v == NULL || PyDict_SetItemString(d, "__doc__", v) != 0) {
149 Py_XDECREF(v);
150 return NULL;
151 }
152 Py_DECREF(v);
153 }
154 m->md_def = module;
155 return (PyObject*)m;
156}
157
158
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000159PyObject *
Fred Drakeee238b92000-07-09 06:03:25 +0000160PyModule_GetDict(PyObject *m)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000161{
Guido van Rossumcd637aa2002-03-12 20:37:02 +0000162 PyObject *d;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000163 if (!PyModule_Check(m)) {
164 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000165 return NULL;
166 }
Guido van Rossumcd637aa2002-03-12 20:37:02 +0000167 d = ((PyModuleObject *)m) -> md_dict;
168 if (d == NULL)
169 ((PyModuleObject *)m) -> md_dict = d = PyDict_New();
170 return d;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000171}
172
Neal Norwitz312e10d2007-08-26 02:21:42 +0000173const char *
Fred Drakeee238b92000-07-09 06:03:25 +0000174PyModule_GetName(PyObject *m)
Guido van Rossum0558a201990-10-26 15:00:11 +0000175{
Guido van Rossumcd637aa2002-03-12 20:37:02 +0000176 PyObject *d;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000177 PyObject *nameobj;
178 if (!PyModule_Check(m)) {
179 PyErr_BadArgument();
Guido van Rossum0558a201990-10-26 15:00:11 +0000180 return NULL;
181 }
Guido van Rossumcd637aa2002-03-12 20:37:02 +0000182 d = ((PyModuleObject *)m)->md_dict;
183 if (d == NULL ||
184 (nameobj = PyDict_GetItemString(d, "__name__")) == NULL ||
Neal Norwitzed2b7392007-08-26 04:51:10 +0000185 !PyUnicode_Check(nameobj))
Guido van Rossumcd637aa2002-03-12 20:37:02 +0000186 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000187 PyErr_SetString(PyExc_SystemError, "nameless module");
Guido van Rossumc45611d1993-11-17 22:58:56 +0000188 return NULL;
189 }
Neal Norwitzed2b7392007-08-26 04:51:10 +0000190 return PyUnicode_AsString(nameobj);
Guido van Rossum0558a201990-10-26 15:00:11 +0000191}
192
Neal Norwitz312e10d2007-08-26 02:21:42 +0000193const char *
Fred Drakeee238b92000-07-09 06:03:25 +0000194PyModule_GetFilename(PyObject *m)
Guido van Rossum98cc19f1999-02-15 14:47:16 +0000195{
Guido van Rossumcd637aa2002-03-12 20:37:02 +0000196 PyObject *d;
Guido van Rossum98cc19f1999-02-15 14:47:16 +0000197 PyObject *fileobj;
198 if (!PyModule_Check(m)) {
199 PyErr_BadArgument();
200 return NULL;
201 }
Guido van Rossumcd637aa2002-03-12 20:37:02 +0000202 d = ((PyModuleObject *)m)->md_dict;
203 if (d == NULL ||
204 (fileobj = PyDict_GetItemString(d, "__file__")) == NULL ||
Guido van Rossum00bc0e02007-10-15 02:52:41 +0000205 !PyUnicode_Check(fileobj))
Guido van Rossumcd637aa2002-03-12 20:37:02 +0000206 {
Guido van Rossum98cc19f1999-02-15 14:47:16 +0000207 PyErr_SetString(PyExc_SystemError, "module filename missing");
208 return NULL;
209 }
Guido van Rossum00bc0e02007-10-15 02:52:41 +0000210 return PyUnicode_AsString(fileobj);
Guido van Rossum98cc19f1999-02-15 14:47:16 +0000211}
212
Martin v. Löwis1a214512008-06-11 05:26:20 +0000213PyModuleDef*
214PyModule_GetDef(PyObject* m)
215{
216 if (!PyModule_Check(m)) {
217 PyErr_BadArgument();
218 return NULL;
219 }
220 return ((PyModuleObject *)m)->md_def;
221}
222
223void*
224PyModule_GetState(PyObject* m)
225{
226 if (!PyModule_Check(m)) {
227 PyErr_BadArgument();
228 return NULL;
229 }
230 return ((PyModuleObject *)m)->md_state;
231}
232
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000233void
Fred Drakeee238b92000-07-09 06:03:25 +0000234_PyModule_Clear(PyObject *m)
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000235{
236 /* To make the execution order of destructors for global
237 objects a bit more predictable, we first zap all objects
238 whose name starts with a single underscore, before we clear
239 the entire dictionary. We zap them by replacing them with
240 None, rather than deleting them from the dictionary, to
241 avoid rehashing the dictionary (to some extent). */
242
Martin v. Löwis18e16552006-02-15 17:27:45 +0000243 Py_ssize_t pos;
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000244 PyObject *key, *value;
245 PyObject *d;
246
247 d = ((PyModuleObject *)m)->md_dict;
Guido van Rossumcd637aa2002-03-12 20:37:02 +0000248 if (d == NULL)
249 return;
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000250
251 /* First, clear only names starting with a single underscore */
252 pos = 0;
253 while (PyDict_Next(d, &pos, &key, &value)) {
Neal Norwitz312e10d2007-08-26 02:21:42 +0000254 if (value != Py_None && PyUnicode_Check(key)) {
255 const char *s = PyUnicode_AsString(key);
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000256 if (s[0] == '_' && s[1] != '_') {
257 if (Py_VerboseFlag > 1)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000258 PySys_WriteStderr("# clear[1] %s\n", s);
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000259 PyDict_SetItem(d, key, Py_None);
260 }
261 }
262 }
263
264 /* Next, clear all names except for __builtins__ */
265 pos = 0;
266 while (PyDict_Next(d, &pos, &key, &value)) {
Neal Norwitz312e10d2007-08-26 02:21:42 +0000267 if (value != Py_None && PyUnicode_Check(key)) {
268 const char *s = PyUnicode_AsString(key);
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000269 if (s[0] != '_' || strcmp(s, "__builtins__") != 0) {
270 if (Py_VerboseFlag > 1)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000271 PySys_WriteStderr("# clear[2] %s\n", s);
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000272 PyDict_SetItem(d, key, Py_None);
273 }
274 }
275 }
276
277 /* Note: we leave __builtins__ in place, so that destructors
278 of non-global objects defined in this module can still use
279 builtins, in particularly 'None'. */
280
281}
282
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000283/* Methods */
284
Tim Peters6d6c1a32001-08-02 04:15:00 +0000285static int
Guido van Rossumc3a787e2002-06-04 05:52:47 +0000286module_init(PyModuleObject *m, PyObject *args, PyObject *kwds)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000287{
Martin v. Löwis15e62742006-02-27 16:46:16 +0000288 static char *kwlist[] = {"name", "doc", NULL};
Guido van Rossumc3a787e2002-06-04 05:52:47 +0000289 PyObject *dict, *name = Py_None, *doc = Py_None;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000290 if (!PyArg_ParseTupleAndKeywords(args, kwds, "U|O:module.__init__",
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000291 kwlist, &name, &doc))
Guido van Rossumc3a787e2002-06-04 05:52:47 +0000292 return -1;
293 dict = m->md_dict;
294 if (dict == NULL) {
295 dict = PyDict_New();
296 if (dict == NULL)
297 return -1;
298 m->md_dict = dict;
299 }
300 if (PyDict_SetItemString(dict, "__name__", name) < 0)
301 return -1;
302 if (PyDict_SetItemString(dict, "__doc__", doc) < 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000303 return -1;
304 return 0;
305}
306
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000307static void
Fred Drakeee238b92000-07-09 06:03:25 +0000308module_dealloc(PyModuleObject *m)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000309{
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000310 PyObject_GC_UnTrack(m);
Martin v. Löwis1a214512008-06-11 05:26:20 +0000311 if (m->md_def && m->md_def->m_free)
312 m->md_def->m_free(m);
Guido van Rossum27e916f1995-01-26 00:39:00 +0000313 if (m->md_dict != NULL) {
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000314 _PyModule_Clear((PyObject *)m);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000315 Py_DECREF(m->md_dict);
Guido van Rossum27e916f1995-01-26 00:39:00 +0000316 }
Christian Heimes90aa7642007-12-19 02:45:37 +0000317 Py_TYPE(m)->tp_free((PyObject *)m);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000318}
319
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000320static PyObject *
Fred Drakeee238b92000-07-09 06:03:25 +0000321module_repr(PyModuleObject *m)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000322{
Neal Norwitz312e10d2007-08-26 02:21:42 +0000323 const char *name;
324 const char *filename;
Barry Warsaw2907fe62001-08-16 20:39:24 +0000325
Guido van Rossum98cc19f1999-02-15 14:47:16 +0000326 name = PyModule_GetName((PyObject *)m);
Guido van Rossumc45611d1993-11-17 22:58:56 +0000327 if (name == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000328 PyErr_Clear();
Guido van Rossumc45611d1993-11-17 22:58:56 +0000329 name = "?";
330 }
Guido van Rossum98cc19f1999-02-15 14:47:16 +0000331 filename = PyModule_GetFilename((PyObject *)m);
332 if (filename == NULL) {
333 PyErr_Clear();
Walter Dörwald1ab83302007-05-18 17:15:44 +0000334 return PyUnicode_FromFormat("<module '%s' (built-in)>", name);
Guido van Rossum98cc19f1999-02-15 14:47:16 +0000335 }
Walter Dörwald1ab83302007-05-18 17:15:44 +0000336 return PyUnicode_FromFormat("<module '%s' from '%s'>", name, filename);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000337}
338
Neil Schemenauer10e31cf2001-01-02 15:58:27 +0000339static int
340module_traverse(PyModuleObject *m, visitproc visit, void *arg)
341{
Martin v. Löwis1a214512008-06-11 05:26:20 +0000342 if (m->md_def && m->md_def->m_traverse) {
343 int res = m->md_def->m_traverse((PyObject*)m, visit, arg);
344 if (res)
345 return res;
346 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000347 Py_VISIT(m->md_dict);
Neil Schemenauer10e31cf2001-01-02 15:58:27 +0000348 return 0;
349}
350
Martin v. Löwis1a214512008-06-11 05:26:20 +0000351static int
352module_clear(PyModuleObject *m)
353{
354 if (m->md_def && m->md_def->m_clear) {
355 int res = m->md_def->m_clear((PyObject*)m);
356 if (res)
357 return res;
358 }
359 Py_CLEAR(m->md_dict);
360 return 0;
361}
362
363
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000364PyDoc_STRVAR(module_doc,
Guido van Rossumed3e09f2002-06-04 06:02:35 +0000365"module(name[, doc])\n\
366\n\
367Create a module object.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000368The name must be a string; the optional doc argument can have any type.");
Guido van Rossumed3e09f2002-06-04 06:02:35 +0000369
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000370PyTypeObject PyModule_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000371 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Tim Petersd85e1022001-05-11 21:51:48 +0000372 "module", /* tp_name */
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000373 sizeof(PyModuleObject), /* tp_size */
Tim Petersd85e1022001-05-11 21:51:48 +0000374 0, /* tp_itemsize */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000375 (destructor)module_dealloc, /* tp_dealloc */
Tim Petersd85e1022001-05-11 21:51:48 +0000376 0, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000377 0, /* tp_getattr */
378 0, /* tp_setattr */
Tim Petersd85e1022001-05-11 21:51:48 +0000379 0, /* tp_compare */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000380 (reprfunc)module_repr, /* tp_repr */
Tim Petersd85e1022001-05-11 21:51:48 +0000381 0, /* tp_as_number */
382 0, /* tp_as_sequence */
383 0, /* tp_as_mapping */
384 0, /* tp_hash */
385 0, /* tp_call */
386 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000387 PyObject_GenericGetAttr, /* tp_getattro */
Neil Schemenauer75552942003-07-16 22:04:11 +0000388 PyObject_GenericSetAttr, /* tp_setattro */
Tim Petersd85e1022001-05-11 21:51:48 +0000389 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000390 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
Tim Peters6d6c1a32001-08-02 04:15:00 +0000391 Py_TPFLAGS_BASETYPE, /* tp_flags */
Guido van Rossumed3e09f2002-06-04 06:02:35 +0000392 module_doc, /* tp_doc */
Tim Petersd85e1022001-05-11 21:51:48 +0000393 (traverseproc)module_traverse, /* tp_traverse */
Martin v. Löwis1a214512008-06-11 05:26:20 +0000394 (inquiry)module_clear, /* tp_clear */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000395 0, /* tp_richcompare */
396 0, /* tp_weaklistoffset */
397 0, /* tp_iter */
398 0, /* tp_iternext */
399 0, /* tp_methods */
400 module_members, /* tp_members */
401 0, /* tp_getset */
402 0, /* tp_base */
403 0, /* tp_dict */
404 0, /* tp_descr_get */
405 0, /* tp_descr_set */
406 offsetof(PyModuleObject, md_dict), /* tp_dictoffset */
407 (initproc)module_init, /* tp_init */
408 PyType_GenericAlloc, /* tp_alloc */
409 PyType_GenericNew, /* tp_new */
Neil Schemenauer99b5d282002-04-12 02:44:22 +0000410 PyObject_GC_Del, /* tp_free */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000411};