blob: 2c095a096870aa2022fab6d247d85914c2250e58 [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;
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 Pitrouf95a1b32010-05-09 15:52:27 +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 Pitrouf95a1b32010-05-09 15:52:27 +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 Pitrouf95a1b32010-05-09 15:52:27 +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 Pitrouf95a1b32010-05-09 15:52:27 +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 +000059PyObject *
60PyModule_Create2(struct PyModuleDef* module, int module_api_version)
61{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000062 PyObject *d, *v, *n;
63 PyMethodDef *ml;
64 const char* name;
65 PyModuleObject *m;
66 if (!Py_IsInitialized())
67 Py_FatalError("Interpreter not initialized (version mismatch?)");
68 if (PyType_Ready(&moduledef_type) < 0)
69 return NULL;
70 if (module->m_base.m_index == 0) {
71 max_module_number++;
72 Py_REFCNT(module) = 1;
73 Py_TYPE(module) = &moduledef_type;
74 module->m_base.m_index = max_module_number;
75 }
76 name = module->m_name;
Martin v. Löwis4d0d4712010-12-03 20:14:31 +000077 if (module_api_version != PYTHON_API_VERSION && module_api_version != PYTHON_ABI_VERSION) {
Victor Stinner4a2b7a12010-08-13 14:03:48 +000078 int err;
79 err = PyErr_WarnFormat(PyExc_RuntimeWarning, 1,
80 "Python C API version mismatch for module %.100s: "
81 "This Python has API version %d, module %.100s has version %d.",
82 name,
83 PYTHON_API_VERSION, name, module_api_version);
84 if (err)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000085 return NULL;
86 }
87 /* Make sure name is fully qualified.
Martin v. Löwis1a214512008-06-11 05:26:20 +000088
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000089 This is a bit of a hack: when the shared library is loaded,
90 the module name is "package.module", but the module calls
91 PyModule_Create*() with just "module" for the name. The shared
92 library loader squirrels away the true name of the module in
93 _Py_PackageContext, and PyModule_Create*() will substitute this
94 (if the name actually matches).
95 */
96 if (_Py_PackageContext != NULL) {
97 char *p = strrchr(_Py_PackageContext, '.');
98 if (p != NULL && strcmp(module->m_name, p+1) == 0) {
99 name = _Py_PackageContext;
100 _Py_PackageContext = NULL;
101 }
102 }
103 if ((m = (PyModuleObject*)PyModule_New(name)) == NULL)
104 return NULL;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000105
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000106 if (module->m_size > 0) {
107 m->md_state = PyMem_MALLOC(module->m_size);
108 if (!m->md_state) {
109 PyErr_NoMemory();
110 Py_DECREF(m);
111 return NULL;
112 }
113 memset(m->md_state, 0, module->m_size);
114 }
115
116 d = PyModule_GetDict((PyObject*)m);
117 if (module->m_methods != NULL) {
118 n = PyUnicode_FromString(name);
119 if (n == NULL)
120 return NULL;
121 for (ml = module->m_methods; ml->ml_name != NULL; ml++) {
122 if ((ml->ml_flags & METH_CLASS) ||
123 (ml->ml_flags & METH_STATIC)) {
124 PyErr_SetString(PyExc_ValueError,
125 "module functions cannot set"
126 " METH_CLASS or METH_STATIC");
127 Py_DECREF(n);
128 return NULL;
129 }
130 v = PyCFunction_NewEx(ml, (PyObject*)m, n);
131 if (v == NULL) {
132 Py_DECREF(n);
133 return NULL;
134 }
135 if (PyDict_SetItemString(d, ml->ml_name, v) != 0) {
136 Py_DECREF(v);
137 Py_DECREF(n);
138 return NULL;
139 }
140 Py_DECREF(v);
141 }
142 Py_DECREF(n);
143 }
144 if (module->m_doc != NULL) {
145 v = PyUnicode_FromString(module->m_doc);
146 if (v == NULL || PyDict_SetItemString(d, "__doc__", v) != 0) {
147 Py_XDECREF(v);
148 return NULL;
149 }
150 Py_DECREF(v);
151 }
152 m->md_def = module;
153 return (PyObject*)m;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000154}
155
156
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000157PyObject *
Fred Drakeee238b92000-07-09 06:03:25 +0000158PyModule_GetDict(PyObject *m)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000159{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000160 PyObject *d;
161 if (!PyModule_Check(m)) {
162 PyErr_BadInternalCall();
163 return NULL;
164 }
165 d = ((PyModuleObject *)m) -> md_dict;
166 if (d == NULL)
167 ((PyModuleObject *)m) -> md_dict = d = PyDict_New();
168 return d;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000169}
170
Alexander Belopolsky532d0912010-12-10 18:14:16 +0000171const char *
172PyModule_GetName(PyObject *m)
Guido van Rossum0558a201990-10-26 15:00:11 +0000173{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000174 PyObject *d;
175 PyObject *nameobj;
176 if (!PyModule_Check(m)) {
177 PyErr_BadArgument();
178 return NULL;
179 }
180 d = ((PyModuleObject *)m)->md_dict;
181 if (d == NULL ||
182 (nameobj = PyDict_GetItemString(d, "__name__")) == NULL ||
183 !PyUnicode_Check(nameobj))
184 {
185 PyErr_SetString(PyExc_SystemError, "nameless module");
186 return NULL;
187 }
Alexander Belopolsky532d0912010-12-10 18:14:16 +0000188 return _PyUnicode_AsString(nameobj);
Guido van Rossum0558a201990-10-26 15:00:11 +0000189}
190
Victor Stinner6c00c142010-08-17 23:37:11 +0000191PyObject*
192PyModule_GetFilenameObject(PyObject *m)
Guido van Rossum98cc19f1999-02-15 14:47:16 +0000193{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000194 PyObject *d;
195 PyObject *fileobj;
196 if (!PyModule_Check(m)) {
197 PyErr_BadArgument();
198 return NULL;
199 }
200 d = ((PyModuleObject *)m)->md_dict;
201 if (d == NULL ||
202 (fileobj = PyDict_GetItemString(d, "__file__")) == NULL ||
203 !PyUnicode_Check(fileobj))
204 {
205 PyErr_SetString(PyExc_SystemError, "module filename missing");
206 return NULL;
207 }
Victor Stinner6c00c142010-08-17 23:37:11 +0000208 Py_INCREF(fileobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000209 return fileobj;
Victor Stinner8124feb2010-05-07 00:50:12 +0000210}
211
212const char *
213PyModule_GetFilename(PyObject *m)
214{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000215 PyObject *fileobj;
Victor Stinner6c00c142010-08-17 23:37:11 +0000216 char *utf8;
217 fileobj = PyModule_GetFilenameObject(m);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000218 if (fileobj == NULL)
219 return NULL;
Victor Stinner6c00c142010-08-17 23:37:11 +0000220 utf8 = _PyUnicode_AsString(fileobj);
221 Py_DECREF(fileobj);
222 return utf8;
Guido van Rossum98cc19f1999-02-15 14:47:16 +0000223}
224
Martin v. Löwis1a214512008-06-11 05:26:20 +0000225PyModuleDef*
226PyModule_GetDef(PyObject* m)
227{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000228 if (!PyModule_Check(m)) {
229 PyErr_BadArgument();
230 return NULL;
231 }
232 return ((PyModuleObject *)m)->md_def;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000233}
234
235void*
236PyModule_GetState(PyObject* m)
237{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000238 if (!PyModule_Check(m)) {
239 PyErr_BadArgument();
240 return NULL;
241 }
242 return ((PyModuleObject *)m)->md_state;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000243}
244
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000245void
Fred Drakeee238b92000-07-09 06:03:25 +0000246_PyModule_Clear(PyObject *m)
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000247{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000248 /* To make the execution order of destructors for global
249 objects a bit more predictable, we first zap all objects
250 whose name starts with a single underscore, before we clear
251 the entire dictionary. We zap them by replacing them with
252 None, rather than deleting them from the dictionary, to
253 avoid rehashing the dictionary (to some extent). */
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000254
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000255 Py_ssize_t pos;
256 PyObject *key, *value;
257 PyObject *d;
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000258
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000259 d = ((PyModuleObject *)m)->md_dict;
260 if (d == NULL)
261 return;
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000262
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000263 /* First, clear only names starting with a single underscore */
264 pos = 0;
265 while (PyDict_Next(d, &pos, &key, &value)) {
266 if (value != Py_None && PyUnicode_Check(key)) {
Victor Stinnerf3f22a22010-05-19 00:03:09 +0000267 Py_UNICODE *u = PyUnicode_AS_UNICODE(key);
268 if (u[0] == '_' && u[1] != '_') {
269 if (Py_VerboseFlag > 1) {
270 const char *s = _PyUnicode_AsString(key);
271 if (s != NULL)
272 PySys_WriteStderr("# clear[1] %s\n", s);
273 else
274 PyErr_Clear();
275 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000276 PyDict_SetItem(d, key, Py_None);
277 }
278 }
279 }
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000280
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000281 /* Next, clear all names except for __builtins__ */
282 pos = 0;
283 while (PyDict_Next(d, &pos, &key, &value)) {
284 if (value != Py_None && PyUnicode_Check(key)) {
Victor Stinnerf3f22a22010-05-19 00:03:09 +0000285 Py_UNICODE *u = PyUnicode_AS_UNICODE(key);
286 if (u[0] != '_'
287 || PyUnicode_CompareWithASCIIString(key, "__builtins__") != 0)
288 {
289 if (Py_VerboseFlag > 1) {
290 const char *s = _PyUnicode_AsString(key);
291 if (s != NULL)
292 PySys_WriteStderr("# clear[2] %s\n", s);
293 else
294 PyErr_Clear();
295 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000296 PyDict_SetItem(d, key, Py_None);
297 }
298 }
299 }
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000300
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000301 /* Note: we leave __builtins__ in place, so that destructors
302 of non-global objects defined in this module can still use
303 builtins, in particularly 'None'. */
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000304
305}
306
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000307/* Methods */
308
Tim Peters6d6c1a32001-08-02 04:15:00 +0000309static int
Guido van Rossumc3a787e2002-06-04 05:52:47 +0000310module_init(PyModuleObject *m, PyObject *args, PyObject *kwds)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000311{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000312 static char *kwlist[] = {"name", "doc", NULL};
313 PyObject *dict, *name = Py_None, *doc = Py_None;
314 if (!PyArg_ParseTupleAndKeywords(args, kwds, "U|O:module.__init__",
315 kwlist, &name, &doc))
316 return -1;
317 dict = m->md_dict;
318 if (dict == NULL) {
319 dict = PyDict_New();
320 if (dict == NULL)
321 return -1;
322 m->md_dict = dict;
323 }
324 if (PyDict_SetItemString(dict, "__name__", name) < 0)
325 return -1;
326 if (PyDict_SetItemString(dict, "__doc__", doc) < 0)
327 return -1;
328 return 0;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000329}
330
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000331static void
Fred Drakeee238b92000-07-09 06:03:25 +0000332module_dealloc(PyModuleObject *m)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000333{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000334 PyObject_GC_UnTrack(m);
335 if (m->md_def && m->md_def->m_free)
336 m->md_def->m_free(m);
337 if (m->md_dict != NULL) {
Benjamin Peterson5c4bfc42010-10-12 22:57:59 +0000338 _PyModule_Clear((PyObject *)m);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000339 Py_DECREF(m->md_dict);
340 }
341 if (m->md_state != NULL)
342 PyMem_FREE(m->md_state);
343 Py_TYPE(m)->tp_free((PyObject *)m);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000344}
345
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000346static PyObject *
Fred Drakeee238b92000-07-09 06:03:25 +0000347module_repr(PyModuleObject *m)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000348{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000349 const char *name;
Victor Stinner6c00c142010-08-17 23:37:11 +0000350 PyObject *filename, *repr;
Barry Warsaw2907fe62001-08-16 20:39:24 +0000351
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000352 name = PyModule_GetName((PyObject *)m);
353 if (name == NULL) {
354 PyErr_Clear();
355 name = "?";
356 }
Victor Stinner6c00c142010-08-17 23:37:11 +0000357 filename = PyModule_GetFilenameObject((PyObject *)m);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000358 if (filename == NULL) {
359 PyErr_Clear();
360 return PyUnicode_FromFormat("<module '%s' (built-in)>", name);
361 }
Victor Stinner6c00c142010-08-17 23:37:11 +0000362 repr = PyUnicode_FromFormat("<module '%s' from '%U'>", name, filename);
363 Py_DECREF(filename);
364 return repr;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000365}
366
Neil Schemenauer10e31cf2001-01-02 15:58:27 +0000367static int
368module_traverse(PyModuleObject *m, visitproc visit, void *arg)
369{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000370 if (m->md_def && m->md_def->m_traverse) {
371 int res = m->md_def->m_traverse((PyObject*)m, visit, arg);
372 if (res)
373 return res;
374 }
375 Py_VISIT(m->md_dict);
376 return 0;
Neil Schemenauer10e31cf2001-01-02 15:58:27 +0000377}
378
Martin v. Löwis1a214512008-06-11 05:26:20 +0000379static int
380module_clear(PyModuleObject *m)
381{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000382 if (m->md_def && m->md_def->m_clear) {
383 int res = m->md_def->m_clear((PyObject*)m);
384 if (res)
385 return res;
386 }
387 Py_CLEAR(m->md_dict);
388 return 0;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000389}
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000390
Martin v. Löwis1a214512008-06-11 05:26:20 +0000391
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000392PyDoc_STRVAR(module_doc,
Guido van Rossumed3e09f2002-06-04 06:02:35 +0000393"module(name[, doc])\n\
394\n\
395Create a module object.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000396The name must be a string; the optional doc argument can have any type.");
Guido van Rossumed3e09f2002-06-04 06:02:35 +0000397
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000398PyTypeObject PyModule_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000399 PyVarObject_HEAD_INIT(&PyType_Type, 0)
400 "module", /* tp_name */
401 sizeof(PyModuleObject), /* tp_size */
402 0, /* tp_itemsize */
403 (destructor)module_dealloc, /* tp_dealloc */
404 0, /* tp_print */
405 0, /* tp_getattr */
406 0, /* tp_setattr */
407 0, /* tp_reserved */
408 (reprfunc)module_repr, /* tp_repr */
409 0, /* tp_as_number */
410 0, /* tp_as_sequence */
411 0, /* tp_as_mapping */
412 0, /* tp_hash */
413 0, /* tp_call */
414 0, /* tp_str */
415 PyObject_GenericGetAttr, /* tp_getattro */
416 PyObject_GenericSetAttr, /* tp_setattro */
417 0, /* tp_as_buffer */
418 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
419 Py_TPFLAGS_BASETYPE, /* tp_flags */
420 module_doc, /* tp_doc */
421 (traverseproc)module_traverse, /* tp_traverse */
422 (inquiry)module_clear, /* tp_clear */
423 0, /* tp_richcompare */
424 0, /* tp_weaklistoffset */
425 0, /* tp_iter */
426 0, /* tp_iternext */
427 0, /* tp_methods */
428 module_members, /* tp_members */
429 0, /* tp_getset */
430 0, /* tp_base */
431 0, /* tp_dict */
432 0, /* tp_descr_get */
433 0, /* tp_descr_set */
434 offsetof(PyModuleObject, md_dict), /* tp_dictoffset */
435 (initproc)module_init, /* tp_init */
436 PyType_GenericAlloc, /* tp_alloc */
437 PyType_GenericNew, /* tp_new */
438 PyObject_GC_Del, /* tp_free */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000439};