blob: d96d7bd16a1a4e92d02e84c9809eb47212c7e8f9 [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 Pitrou7f14f0d2010-05-09 16:14:21 +000010 PyObject_HEAD
11 PyObject *md_dict;
12 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[] = {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +000017 {"__dict__", T_OBJECT, offsetof(PyModuleObject, md_dict), READONLY},
18 {0}
Tim Peters6d6c1a32001-08-02 04:15:00 +000019};
20
Martin v. Löwis1a214512008-06-11 05:26:20 +000021static PyTypeObject moduledef_type = {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +000022 PyVarObject_HEAD_INIT(&PyType_Type, 0)
23 "moduledef", /* tp_name */
24 sizeof(struct PyModuleDef), /* tp_size */
25 0, /* tp_itemsize */
Martin v. Löwis1a214512008-06-11 05:26:20 +000026};
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{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +000032 PyModuleObject *m;
33 PyObject *nameobj;
34 m = PyObject_GC_New(PyModuleObject, &PyModule_Type);
35 if (m == NULL)
36 return NULL;
37 m->md_def = NULL;
38 m->md_state = NULL;
39 nameobj = PyUnicode_FromString(name);
40 m->md_dict = PyDict_New();
41 if (m->md_dict == NULL || nameobj == NULL)
42 goto fail;
43 if (PyDict_SetItemString(m->md_dict, "__name__", nameobj) != 0)
44 goto fail;
45 if (PyDict_SetItemString(m->md_dict, "__doc__", Py_None) != 0)
46 goto fail;
47 if (PyDict_SetItemString(m->md_dict, "__package__", Py_None) != 0)
48 goto fail;
49 Py_DECREF(nameobj);
50 PyObject_GC_Track(m);
51 return (PyObject *)m;
Guido van Rossumc45611d1993-11-17 22:58:56 +000052
53 fail:
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +000054 Py_XDECREF(nameobj);
55 Py_DECREF(m);
56 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{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +000066 PyObject *d, *v, *n;
67 PyMethodDef *ml;
68 const char* name;
69 PyModuleObject *m;
R. David Murray800dfee2010-12-14 23:30:42 +000070 PyInterpreterState *interp = PyThreadState_Get()->interp;
71 if (interp->modules == NULL)
72 Py_FatalError("Python import machinery not initialized");
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +000073 if (PyType_Ready(&moduledef_type) < 0)
74 return NULL;
75 if (module->m_base.m_index == 0) {
76 max_module_number++;
77 Py_REFCNT(module) = 1;
78 Py_TYPE(module) = &moduledef_type;
79 module->m_base.m_index = max_module_number;
80 }
81 name = module->m_name;
82 if (module_api_version != PYTHON_API_VERSION) {
83 char message[512];
84 PyOS_snprintf(message, sizeof(message),
85 api_version_warning, name,
86 PYTHON_API_VERSION, name,
87 module_api_version);
88 if (PyErr_WarnEx(PyExc_RuntimeWarning, message, 1))
89 return NULL;
90 }
91 /* Make sure name is fully qualified.
Martin v. Löwis1a214512008-06-11 05:26:20 +000092
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +000093 This is a bit of a hack: when the shared library is loaded,
94 the module name is "package.module", but the module calls
95 PyModule_Create*() with just "module" for the name. The shared
96 library loader squirrels away the true name of the module in
97 _Py_PackageContext, and PyModule_Create*() will substitute this
98 (if the name actually matches).
99 */
100 if (_Py_PackageContext != NULL) {
101 char *p = strrchr(_Py_PackageContext, '.');
102 if (p != NULL && strcmp(module->m_name, p+1) == 0) {
103 name = _Py_PackageContext;
104 _Py_PackageContext = NULL;
105 }
106 }
107 if ((m = (PyModuleObject*)PyModule_New(name)) == NULL)
108 return NULL;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000109
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000110 if (module->m_size > 0) {
111 m->md_state = PyMem_MALLOC(module->m_size);
112 if (!m->md_state) {
113 PyErr_NoMemory();
114 Py_DECREF(m);
115 return NULL;
116 }
117 memset(m->md_state, 0, module->m_size);
118 }
119
120 d = PyModule_GetDict((PyObject*)m);
121 if (module->m_methods != NULL) {
122 n = PyUnicode_FromString(name);
123 if (n == NULL)
124 return NULL;
125 for (ml = module->m_methods; ml->ml_name != NULL; ml++) {
126 if ((ml->ml_flags & METH_CLASS) ||
127 (ml->ml_flags & METH_STATIC)) {
128 PyErr_SetString(PyExc_ValueError,
129 "module functions cannot set"
130 " METH_CLASS or METH_STATIC");
131 Py_DECREF(n);
132 return NULL;
133 }
134 v = PyCFunction_NewEx(ml, (PyObject*)m, n);
135 if (v == NULL) {
136 Py_DECREF(n);
137 return NULL;
138 }
139 if (PyDict_SetItemString(d, ml->ml_name, v) != 0) {
140 Py_DECREF(v);
141 Py_DECREF(n);
142 return NULL;
143 }
144 Py_DECREF(v);
145 }
146 Py_DECREF(n);
147 }
148 if (module->m_doc != NULL) {
149 v = PyUnicode_FromString(module->m_doc);
150 if (v == NULL || PyDict_SetItemString(d, "__doc__", v) != 0) {
151 Py_XDECREF(v);
152 return NULL;
153 }
154 Py_DECREF(v);
155 }
156 m->md_def = module;
157 return (PyObject*)m;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000158}
159
160
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000161PyObject *
Fred Drakeee238b92000-07-09 06:03:25 +0000162PyModule_GetDict(PyObject *m)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000163{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000164 PyObject *d;
165 if (!PyModule_Check(m)) {
166 PyErr_BadInternalCall();
167 return NULL;
168 }
169 d = ((PyModuleObject *)m) -> md_dict;
170 if (d == NULL)
171 ((PyModuleObject *)m) -> md_dict = d = PyDict_New();
172 return d;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000173}
174
Neal Norwitz312e10d2007-08-26 02:21:42 +0000175const char *
Fred Drakeee238b92000-07-09 06:03:25 +0000176PyModule_GetName(PyObject *m)
Guido van Rossum0558a201990-10-26 15:00:11 +0000177{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000178 PyObject *d;
179 PyObject *nameobj;
180 if (!PyModule_Check(m)) {
181 PyErr_BadArgument();
182 return NULL;
183 }
184 d = ((PyModuleObject *)m)->md_dict;
185 if (d == NULL ||
186 (nameobj = PyDict_GetItemString(d, "__name__")) == NULL ||
187 !PyUnicode_Check(nameobj))
188 {
189 PyErr_SetString(PyExc_SystemError, "nameless module");
190 return NULL;
191 }
192 return _PyUnicode_AsString(nameobj);
Guido van Rossum0558a201990-10-26 15:00:11 +0000193}
194
Neal Norwitz312e10d2007-08-26 02:21:42 +0000195const char *
Fred Drakeee238b92000-07-09 06:03:25 +0000196PyModule_GetFilename(PyObject *m)
Guido van Rossum98cc19f1999-02-15 14:47:16 +0000197{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000198 PyObject *d;
199 PyObject *fileobj;
200 if (!PyModule_Check(m)) {
201 PyErr_BadArgument();
202 return NULL;
203 }
204 d = ((PyModuleObject *)m)->md_dict;
205 if (d == NULL ||
206 (fileobj = PyDict_GetItemString(d, "__file__")) == NULL ||
207 !PyUnicode_Check(fileobj))
208 {
209 PyErr_SetString(PyExc_SystemError, "module filename missing");
210 return NULL;
211 }
212 return _PyUnicode_AsString(fileobj);
Guido van Rossum98cc19f1999-02-15 14:47:16 +0000213}
214
Martin v. Löwis1a214512008-06-11 05:26:20 +0000215PyModuleDef*
216PyModule_GetDef(PyObject* m)
217{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000218 if (!PyModule_Check(m)) {
219 PyErr_BadArgument();
220 return NULL;
221 }
222 return ((PyModuleObject *)m)->md_def;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000223}
224
225void*
226PyModule_GetState(PyObject* m)
227{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000228 if (!PyModule_Check(m)) {
229 PyErr_BadArgument();
230 return NULL;
231 }
232 return ((PyModuleObject *)m)->md_state;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000233}
234
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000235void
Fred Drakeee238b92000-07-09 06:03:25 +0000236_PyModule_Clear(PyObject *m)
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000237{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000238 /* To make the execution order of destructors for global
239 objects a bit more predictable, we first zap all objects
240 whose name starts with a single underscore, before we clear
241 the entire dictionary. We zap them by replacing them with
242 None, rather than deleting them from the dictionary, to
243 avoid rehashing the dictionary (to some extent). */
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000244
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000245 Py_ssize_t pos;
246 PyObject *key, *value;
247 PyObject *d;
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000248
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000249 d = ((PyModuleObject *)m)->md_dict;
250 if (d == NULL)
251 return;
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000252
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000253 /* First, clear only names starting with a single underscore */
254 pos = 0;
255 while (PyDict_Next(d, &pos, &key, &value)) {
256 if (value != Py_None && PyUnicode_Check(key)) {
257 const char *s = _PyUnicode_AsString(key);
258 if (s[0] == '_' && s[1] != '_') {
259 if (Py_VerboseFlag > 1)
260 PySys_WriteStderr("# clear[1] %s\n", s);
261 PyDict_SetItem(d, key, Py_None);
262 }
263 }
264 }
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000265
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000266 /* Next, clear all names except for __builtins__ */
267 pos = 0;
268 while (PyDict_Next(d, &pos, &key, &value)) {
269 if (value != Py_None && PyUnicode_Check(key)) {
270 const char *s = _PyUnicode_AsString(key);
271 if (s[0] != '_' || strcmp(s, "__builtins__") != 0) {
272 if (Py_VerboseFlag > 1)
273 PySys_WriteStderr("# clear[2] %s\n", s);
274 PyDict_SetItem(d, key, Py_None);
275 }
276 }
277 }
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000278
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000279 /* Note: we leave __builtins__ in place, so that destructors
280 of non-global objects defined in this module can still use
281 builtins, in particularly 'None'. */
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000282
283}
284
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000285/* Methods */
286
Tim Peters6d6c1a32001-08-02 04:15:00 +0000287static int
Guido van Rossumc3a787e2002-06-04 05:52:47 +0000288module_init(PyModuleObject *m, PyObject *args, PyObject *kwds)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000289{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000290 static char *kwlist[] = {"name", "doc", NULL};
291 PyObject *dict, *name = Py_None, *doc = Py_None;
292 if (!PyArg_ParseTupleAndKeywords(args, kwds, "U|O:module.__init__",
293 kwlist, &name, &doc))
294 return -1;
295 dict = m->md_dict;
296 if (dict == NULL) {
297 dict = PyDict_New();
298 if (dict == NULL)
299 return -1;
300 m->md_dict = dict;
301 }
302 if (PyDict_SetItemString(dict, "__name__", name) < 0)
303 return -1;
304 if (PyDict_SetItemString(dict, "__doc__", doc) < 0)
305 return -1;
306 return 0;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000307}
308
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000309static void
Fred Drakeee238b92000-07-09 06:03:25 +0000310module_dealloc(PyModuleObject *m)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000311{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000312 PyObject_GC_UnTrack(m);
313 if (m->md_def && m->md_def->m_free)
314 m->md_def->m_free(m);
315 if (m->md_dict != NULL) {
Benjamin Peterson582162e2010-10-12 23:06:22 +0000316 _PyModule_Clear((PyObject *)m);
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000317 Py_DECREF(m->md_dict);
318 }
319 if (m->md_state != NULL)
320 PyMem_FREE(m->md_state);
321 Py_TYPE(m)->tp_free((PyObject *)m);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000322}
323
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000324static PyObject *
Fred Drakeee238b92000-07-09 06:03:25 +0000325module_repr(PyModuleObject *m)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000326{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000327 const char *name;
328 const char *filename;
Barry Warsaw2907fe62001-08-16 20:39:24 +0000329
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000330 name = PyModule_GetName((PyObject *)m);
331 if (name == NULL) {
332 PyErr_Clear();
333 name = "?";
334 }
335 filename = PyModule_GetFilename((PyObject *)m);
336 if (filename == NULL) {
337 PyErr_Clear();
338 return PyUnicode_FromFormat("<module '%s' (built-in)>", name);
339 }
340 return PyUnicode_FromFormat("<module '%s' from '%s'>", name, filename);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000341}
342
Neil Schemenauer10e31cf2001-01-02 15:58:27 +0000343static int
344module_traverse(PyModuleObject *m, visitproc visit, void *arg)
345{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000346 if (m->md_def && m->md_def->m_traverse) {
347 int res = m->md_def->m_traverse((PyObject*)m, visit, arg);
348 if (res)
349 return res;
350 }
351 Py_VISIT(m->md_dict);
352 return 0;
Neil Schemenauer10e31cf2001-01-02 15:58:27 +0000353}
354
Martin v. Löwis1a214512008-06-11 05:26:20 +0000355static int
356module_clear(PyModuleObject *m)
357{
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000358 if (m->md_def && m->md_def->m_clear) {
359 int res = m->md_def->m_clear((PyObject*)m);
360 if (res)
361 return res;
362 }
363 Py_CLEAR(m->md_dict);
364 return 0;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000365}
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000366
Martin v. Löwis1a214512008-06-11 05:26:20 +0000367
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000368PyDoc_STRVAR(module_doc,
Guido van Rossumed3e09f2002-06-04 06:02:35 +0000369"module(name[, doc])\n\
370\n\
371Create a module object.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000372The name must be a string; the optional doc argument can have any type.");
Guido van Rossumed3e09f2002-06-04 06:02:35 +0000373
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000374PyTypeObject PyModule_Type = {
Antoine Pitrou7f14f0d2010-05-09 16:14:21 +0000375 PyVarObject_HEAD_INIT(&PyType_Type, 0)
376 "module", /* tp_name */
377 sizeof(PyModuleObject), /* tp_size */
378 0, /* tp_itemsize */
379 (destructor)module_dealloc, /* tp_dealloc */
380 0, /* tp_print */
381 0, /* tp_getattr */
382 0, /* tp_setattr */
383 0, /* tp_reserved */
384 (reprfunc)module_repr, /* tp_repr */
385 0, /* tp_as_number */
386 0, /* tp_as_sequence */
387 0, /* tp_as_mapping */
388 0, /* tp_hash */
389 0, /* tp_call */
390 0, /* tp_str */
391 PyObject_GenericGetAttr, /* tp_getattro */
392 PyObject_GenericSetAttr, /* tp_setattro */
393 0, /* tp_as_buffer */
394 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
395 Py_TPFLAGS_BASETYPE, /* tp_flags */
396 module_doc, /* tp_doc */
397 (traverseproc)module_traverse, /* tp_traverse */
398 (inquiry)module_clear, /* tp_clear */
399 0, /* tp_richcompare */
400 0, /* tp_weaklistoffset */
401 0, /* tp_iter */
402 0, /* tp_iternext */
403 0, /* tp_methods */
404 module_members, /* tp_members */
405 0, /* tp_getset */
406 0, /* tp_base */
407 0, /* tp_dict */
408 0, /* tp_descr_get */
409 0, /* tp_descr_set */
410 offsetof(PyModuleObject, md_dict), /* tp_dictoffset */
411 (initproc)module_init, /* tp_init */
412 PyType_GenericAlloc, /* tp_alloc */
413 PyType_GenericNew, /* tp_new */
414 PyObject_GC_Del, /* tp_free */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000415};