blob: f31b5da26d57eb26092b73414d1ade7d632b46f3 [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;
R. David Murrayce4b1702010-12-14 23:06:25 +000066 PyInterpreterState *interp = PyThreadState_Get()->interp;
67 if (interp->modules == NULL)
68 Py_FatalError("Python import machinery not initialized");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000069 if (PyType_Ready(&moduledef_type) < 0)
70 return NULL;
71 if (module->m_base.m_index == 0) {
72 max_module_number++;
73 Py_REFCNT(module) = 1;
74 Py_TYPE(module) = &moduledef_type;
75 module->m_base.m_index = max_module_number;
76 }
77 name = module->m_name;
Martin v. Löwis4d0d4712010-12-03 20:14:31 +000078 if (module_api_version != PYTHON_API_VERSION && module_api_version != PYTHON_ABI_VERSION) {
Victor Stinner4a2b7a12010-08-13 14:03:48 +000079 int err;
80 err = PyErr_WarnFormat(PyExc_RuntimeWarning, 1,
81 "Python C API version mismatch for module %.100s: "
82 "This Python has API version %d, module %.100s has version %d.",
83 name,
84 PYTHON_API_VERSION, name, module_api_version);
85 if (err)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000086 return NULL;
87 }
88 /* Make sure name is fully qualified.
Martin v. Löwis1a214512008-06-11 05:26:20 +000089
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000090 This is a bit of a hack: when the shared library is loaded,
91 the module name is "package.module", but the module calls
92 PyModule_Create*() with just "module" for the name. The shared
93 library loader squirrels away the true name of the module in
94 _Py_PackageContext, and PyModule_Create*() will substitute this
95 (if the name actually matches).
96 */
97 if (_Py_PackageContext != NULL) {
98 char *p = strrchr(_Py_PackageContext, '.');
99 if (p != NULL && strcmp(module->m_name, p+1) == 0) {
100 name = _Py_PackageContext;
101 _Py_PackageContext = NULL;
102 }
103 }
104 if ((m = (PyModuleObject*)PyModule_New(name)) == NULL)
105 return NULL;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000106
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000107 if (module->m_size > 0) {
108 m->md_state = PyMem_MALLOC(module->m_size);
109 if (!m->md_state) {
110 PyErr_NoMemory();
111 Py_DECREF(m);
112 return NULL;
113 }
114 memset(m->md_state, 0, module->m_size);
115 }
116
117 d = PyModule_GetDict((PyObject*)m);
118 if (module->m_methods != NULL) {
119 n = PyUnicode_FromString(name);
120 if (n == NULL)
121 return NULL;
122 for (ml = module->m_methods; ml->ml_name != NULL; ml++) {
123 if ((ml->ml_flags & METH_CLASS) ||
124 (ml->ml_flags & METH_STATIC)) {
125 PyErr_SetString(PyExc_ValueError,
126 "module functions cannot set"
127 " METH_CLASS or METH_STATIC");
128 Py_DECREF(n);
129 return NULL;
130 }
131 v = PyCFunction_NewEx(ml, (PyObject*)m, n);
132 if (v == NULL) {
133 Py_DECREF(n);
134 return NULL;
135 }
136 if (PyDict_SetItemString(d, ml->ml_name, v) != 0) {
137 Py_DECREF(v);
138 Py_DECREF(n);
139 return NULL;
140 }
141 Py_DECREF(v);
142 }
143 Py_DECREF(n);
144 }
145 if (module->m_doc != NULL) {
146 v = PyUnicode_FromString(module->m_doc);
147 if (v == NULL || PyDict_SetItemString(d, "__doc__", v) != 0) {
148 Py_XDECREF(v);
149 return NULL;
150 }
151 Py_DECREF(v);
152 }
153 m->md_def = module;
154 return (PyObject*)m;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000155}
156
157
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000158PyObject *
Fred Drakeee238b92000-07-09 06:03:25 +0000159PyModule_GetDict(PyObject *m)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000160{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000161 PyObject *d;
162 if (!PyModule_Check(m)) {
163 PyErr_BadInternalCall();
164 return NULL;
165 }
166 d = ((PyModuleObject *)m) -> md_dict;
167 if (d == NULL)
168 ((PyModuleObject *)m) -> md_dict = d = PyDict_New();
169 return d;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000170}
171
Alexander Belopolsky532d0912010-12-10 18:14:16 +0000172const char *
173PyModule_GetName(PyObject *m)
Guido van Rossum0558a201990-10-26 15:00:11 +0000174{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000175 PyObject *d;
176 PyObject *nameobj;
177 if (!PyModule_Check(m)) {
178 PyErr_BadArgument();
179 return NULL;
180 }
181 d = ((PyModuleObject *)m)->md_dict;
182 if (d == NULL ||
183 (nameobj = PyDict_GetItemString(d, "__name__")) == NULL ||
184 !PyUnicode_Check(nameobj))
185 {
186 PyErr_SetString(PyExc_SystemError, "nameless module");
187 return NULL;
188 }
Alexander Belopolsky532d0912010-12-10 18:14:16 +0000189 return _PyUnicode_AsString(nameobj);
Guido van Rossum0558a201990-10-26 15:00:11 +0000190}
191
Victor Stinner6c00c142010-08-17 23:37:11 +0000192PyObject*
193PyModule_GetFilenameObject(PyObject *m)
Guido van Rossum98cc19f1999-02-15 14:47:16 +0000194{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000195 PyObject *d;
196 PyObject *fileobj;
197 if (!PyModule_Check(m)) {
198 PyErr_BadArgument();
199 return NULL;
200 }
201 d = ((PyModuleObject *)m)->md_dict;
202 if (d == NULL ||
203 (fileobj = PyDict_GetItemString(d, "__file__")) == NULL ||
204 !PyUnicode_Check(fileobj))
205 {
206 PyErr_SetString(PyExc_SystemError, "module filename missing");
207 return NULL;
208 }
Victor Stinner6c00c142010-08-17 23:37:11 +0000209 Py_INCREF(fileobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000210 return fileobj;
Victor Stinner8124feb2010-05-07 00:50:12 +0000211}
212
213const char *
214PyModule_GetFilename(PyObject *m)
215{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000216 PyObject *fileobj;
Victor Stinner6c00c142010-08-17 23:37:11 +0000217 char *utf8;
218 fileobj = PyModule_GetFilenameObject(m);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000219 if (fileobj == NULL)
220 return NULL;
Victor Stinner6c00c142010-08-17 23:37:11 +0000221 utf8 = _PyUnicode_AsString(fileobj);
222 Py_DECREF(fileobj);
223 return utf8;
Guido van Rossum98cc19f1999-02-15 14:47:16 +0000224}
225
Martin v. Löwis1a214512008-06-11 05:26:20 +0000226PyModuleDef*
227PyModule_GetDef(PyObject* m)
228{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000229 if (!PyModule_Check(m)) {
230 PyErr_BadArgument();
231 return NULL;
232 }
233 return ((PyModuleObject *)m)->md_def;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000234}
235
236void*
237PyModule_GetState(PyObject* m)
238{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000239 if (!PyModule_Check(m)) {
240 PyErr_BadArgument();
241 return NULL;
242 }
243 return ((PyModuleObject *)m)->md_state;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000244}
245
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000246void
Fred Drakeee238b92000-07-09 06:03:25 +0000247_PyModule_Clear(PyObject *m)
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000248{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000249 /* To make the execution order of destructors for global
250 objects a bit more predictable, we first zap all objects
251 whose name starts with a single underscore, before we clear
252 the entire dictionary. We zap them by replacing them with
253 None, rather than deleting them from the dictionary, to
254 avoid rehashing the dictionary (to some extent). */
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000255
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000256 Py_ssize_t pos;
257 PyObject *key, *value;
258 PyObject *d;
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000259
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000260 d = ((PyModuleObject *)m)->md_dict;
261 if (d == NULL)
262 return;
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000263
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000264 /* First, clear only names starting with a single underscore */
265 pos = 0;
266 while (PyDict_Next(d, &pos, &key, &value)) {
267 if (value != Py_None && PyUnicode_Check(key)) {
Victor Stinnerf3f22a22010-05-19 00:03:09 +0000268 Py_UNICODE *u = PyUnicode_AS_UNICODE(key);
269 if (u[0] == '_' && u[1] != '_') {
270 if (Py_VerboseFlag > 1) {
271 const char *s = _PyUnicode_AsString(key);
272 if (s != NULL)
273 PySys_WriteStderr("# clear[1] %s\n", s);
274 else
275 PyErr_Clear();
276 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000277 PyDict_SetItem(d, key, Py_None);
278 }
279 }
280 }
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000281
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000282 /* Next, clear all names except for __builtins__ */
283 pos = 0;
284 while (PyDict_Next(d, &pos, &key, &value)) {
285 if (value != Py_None && PyUnicode_Check(key)) {
Victor Stinnerf3f22a22010-05-19 00:03:09 +0000286 Py_UNICODE *u = PyUnicode_AS_UNICODE(key);
287 if (u[0] != '_'
288 || PyUnicode_CompareWithASCIIString(key, "__builtins__") != 0)
289 {
290 if (Py_VerboseFlag > 1) {
291 const char *s = _PyUnicode_AsString(key);
292 if (s != NULL)
293 PySys_WriteStderr("# clear[2] %s\n", s);
294 else
295 PyErr_Clear();
296 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000297 PyDict_SetItem(d, key, Py_None);
298 }
299 }
300 }
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000301
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000302 /* Note: we leave __builtins__ in place, so that destructors
303 of non-global objects defined in this module can still use
304 builtins, in particularly 'None'. */
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000305
306}
307
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000308/* Methods */
309
Tim Peters6d6c1a32001-08-02 04:15:00 +0000310static int
Guido van Rossumc3a787e2002-06-04 05:52:47 +0000311module_init(PyModuleObject *m, PyObject *args, PyObject *kwds)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000312{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000313 static char *kwlist[] = {"name", "doc", NULL};
314 PyObject *dict, *name = Py_None, *doc = Py_None;
315 if (!PyArg_ParseTupleAndKeywords(args, kwds, "U|O:module.__init__",
316 kwlist, &name, &doc))
317 return -1;
318 dict = m->md_dict;
319 if (dict == NULL) {
320 dict = PyDict_New();
321 if (dict == NULL)
322 return -1;
323 m->md_dict = dict;
324 }
325 if (PyDict_SetItemString(dict, "__name__", name) < 0)
326 return -1;
327 if (PyDict_SetItemString(dict, "__doc__", doc) < 0)
328 return -1;
329 return 0;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000330}
331
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000332static void
Fred Drakeee238b92000-07-09 06:03:25 +0000333module_dealloc(PyModuleObject *m)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000334{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000335 PyObject_GC_UnTrack(m);
336 if (m->md_def && m->md_def->m_free)
337 m->md_def->m_free(m);
338 if (m->md_dict != NULL) {
Benjamin Peterson5c4bfc42010-10-12 22:57:59 +0000339 _PyModule_Clear((PyObject *)m);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000340 Py_DECREF(m->md_dict);
341 }
342 if (m->md_state != NULL)
343 PyMem_FREE(m->md_state);
344 Py_TYPE(m)->tp_free((PyObject *)m);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000345}
346
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000347static PyObject *
Fred Drakeee238b92000-07-09 06:03:25 +0000348module_repr(PyModuleObject *m)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000349{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000350 const char *name;
Victor Stinner6c00c142010-08-17 23:37:11 +0000351 PyObject *filename, *repr;
Barry Warsaw2907fe62001-08-16 20:39:24 +0000352
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000353 name = PyModule_GetName((PyObject *)m);
354 if (name == NULL) {
355 PyErr_Clear();
356 name = "?";
357 }
Victor Stinner6c00c142010-08-17 23:37:11 +0000358 filename = PyModule_GetFilenameObject((PyObject *)m);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000359 if (filename == NULL) {
360 PyErr_Clear();
361 return PyUnicode_FromFormat("<module '%s' (built-in)>", name);
362 }
Victor Stinner6c00c142010-08-17 23:37:11 +0000363 repr = PyUnicode_FromFormat("<module '%s' from '%U'>", name, filename);
364 Py_DECREF(filename);
365 return repr;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000366}
367
Neil Schemenauer10e31cf2001-01-02 15:58:27 +0000368static int
369module_traverse(PyModuleObject *m, visitproc visit, void *arg)
370{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000371 if (m->md_def && m->md_def->m_traverse) {
372 int res = m->md_def->m_traverse((PyObject*)m, visit, arg);
373 if (res)
374 return res;
375 }
376 Py_VISIT(m->md_dict);
377 return 0;
Neil Schemenauer10e31cf2001-01-02 15:58:27 +0000378}
379
Martin v. Löwis1a214512008-06-11 05:26:20 +0000380static int
381module_clear(PyModuleObject *m)
382{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000383 if (m->md_def && m->md_def->m_clear) {
384 int res = m->md_def->m_clear((PyObject*)m);
385 if (res)
386 return res;
387 }
388 Py_CLEAR(m->md_dict);
389 return 0;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000390}
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000391
Martin v. Löwis1a214512008-06-11 05:26:20 +0000392
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000393PyDoc_STRVAR(module_doc,
Guido van Rossumed3e09f2002-06-04 06:02:35 +0000394"module(name[, doc])\n\
395\n\
396Create a module object.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000397The name must be a string; the optional doc argument can have any type.");
Guido van Rossumed3e09f2002-06-04 06:02:35 +0000398
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000399PyTypeObject PyModule_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000400 PyVarObject_HEAD_INIT(&PyType_Type, 0)
401 "module", /* tp_name */
402 sizeof(PyModuleObject), /* tp_size */
403 0, /* tp_itemsize */
404 (destructor)module_dealloc, /* tp_dealloc */
405 0, /* tp_print */
406 0, /* tp_getattr */
407 0, /* tp_setattr */
408 0, /* tp_reserved */
409 (reprfunc)module_repr, /* tp_repr */
410 0, /* tp_as_number */
411 0, /* tp_as_sequence */
412 0, /* tp_as_mapping */
413 0, /* tp_hash */
414 0, /* tp_call */
415 0, /* tp_str */
416 PyObject_GenericGetAttr, /* tp_getattro */
417 PyObject_GenericSetAttr, /* tp_setattro */
418 0, /* tp_as_buffer */
419 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
420 Py_TPFLAGS_BASETYPE, /* tp_flags */
421 module_doc, /* tp_doc */
422 (traverseproc)module_traverse, /* tp_traverse */
423 (inquiry)module_clear, /* tp_clear */
424 0, /* tp_richcompare */
425 0, /* tp_weaklistoffset */
426 0, /* tp_iter */
427 0, /* tp_iternext */
428 0, /* tp_methods */
429 module_members, /* tp_members */
430 0, /* tp_getset */
431 0, /* tp_base */
432 0, /* tp_dict */
433 0, /* tp_descr_get */
434 0, /* tp_descr_set */
435 offsetof(PyModuleObject, md_dict), /* tp_dictoffset */
436 (initproc)module_init, /* tp_init */
437 PyType_GenericAlloc, /* tp_alloc */
438 PyType_GenericNew, /* tp_new */
439 PyObject_GC_Del, /* tp_free */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000440};