blob: 8b22b7dc95a26f7f1ad3f30fbdae632a2956fe9b [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 Belopolskyfc557892010-12-10 18:11:24 +0000171PyObject *
172PyModule_GetNameObject(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 Belopolskyfc557892010-12-10 18:11:24 +0000188 Py_INCREF(nameobj);
189 return nameobj;
190}
191
192const char *
193PyModule_GetName(PyObject *m)
194{
195 PyObject *nameobj;
196 char *utf8;
197 nameobj = PyModule_GetNameObject(m);
198 if (nameobj == NULL)
199 return NULL;
200 utf8 = _PyUnicode_AsString(nameobj);
201 Py_DECREF(nameobj);
202 return utf8;
Guido van Rossum0558a201990-10-26 15:00:11 +0000203}
204
Victor Stinner6c00c142010-08-17 23:37:11 +0000205PyObject*
206PyModule_GetFilenameObject(PyObject *m)
Guido van Rossum98cc19f1999-02-15 14:47:16 +0000207{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000208 PyObject *d;
209 PyObject *fileobj;
210 if (!PyModule_Check(m)) {
211 PyErr_BadArgument();
212 return NULL;
213 }
214 d = ((PyModuleObject *)m)->md_dict;
215 if (d == NULL ||
216 (fileobj = PyDict_GetItemString(d, "__file__")) == NULL ||
217 !PyUnicode_Check(fileobj))
218 {
219 PyErr_SetString(PyExc_SystemError, "module filename missing");
220 return NULL;
221 }
Victor Stinner6c00c142010-08-17 23:37:11 +0000222 Py_INCREF(fileobj);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000223 return fileobj;
Victor Stinner8124feb2010-05-07 00:50:12 +0000224}
225
226const char *
227PyModule_GetFilename(PyObject *m)
228{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000229 PyObject *fileobj;
Victor Stinner6c00c142010-08-17 23:37:11 +0000230 char *utf8;
231 fileobj = PyModule_GetFilenameObject(m);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000232 if (fileobj == NULL)
233 return NULL;
Victor Stinner6c00c142010-08-17 23:37:11 +0000234 utf8 = _PyUnicode_AsString(fileobj);
235 Py_DECREF(fileobj);
236 return utf8;
Guido van Rossum98cc19f1999-02-15 14:47:16 +0000237}
238
Martin v. Löwis1a214512008-06-11 05:26:20 +0000239PyModuleDef*
240PyModule_GetDef(PyObject* m)
241{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000242 if (!PyModule_Check(m)) {
243 PyErr_BadArgument();
244 return NULL;
245 }
246 return ((PyModuleObject *)m)->md_def;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000247}
248
249void*
250PyModule_GetState(PyObject* m)
251{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000252 if (!PyModule_Check(m)) {
253 PyErr_BadArgument();
254 return NULL;
255 }
256 return ((PyModuleObject *)m)->md_state;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000257}
258
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000259void
Fred Drakeee238b92000-07-09 06:03:25 +0000260_PyModule_Clear(PyObject *m)
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000261{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000262 /* To make the execution order of destructors for global
263 objects a bit more predictable, we first zap all objects
264 whose name starts with a single underscore, before we clear
265 the entire dictionary. We zap them by replacing them with
266 None, rather than deleting them from the dictionary, to
267 avoid rehashing the dictionary (to some extent). */
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000268
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000269 Py_ssize_t pos;
270 PyObject *key, *value;
271 PyObject *d;
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000272
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000273 d = ((PyModuleObject *)m)->md_dict;
274 if (d == NULL)
275 return;
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000276
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000277 /* First, clear only names starting with a single underscore */
278 pos = 0;
279 while (PyDict_Next(d, &pos, &key, &value)) {
280 if (value != Py_None && PyUnicode_Check(key)) {
Victor Stinnerf3f22a22010-05-19 00:03:09 +0000281 Py_UNICODE *u = PyUnicode_AS_UNICODE(key);
282 if (u[0] == '_' && u[1] != '_') {
283 if (Py_VerboseFlag > 1) {
284 const char *s = _PyUnicode_AsString(key);
285 if (s != NULL)
286 PySys_WriteStderr("# clear[1] %s\n", s);
287 else
288 PyErr_Clear();
289 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000290 PyDict_SetItem(d, key, Py_None);
291 }
292 }
293 }
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000294
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000295 /* Next, clear all names except for __builtins__ */
296 pos = 0;
297 while (PyDict_Next(d, &pos, &key, &value)) {
298 if (value != Py_None && PyUnicode_Check(key)) {
Victor Stinnerf3f22a22010-05-19 00:03:09 +0000299 Py_UNICODE *u = PyUnicode_AS_UNICODE(key);
300 if (u[0] != '_'
301 || PyUnicode_CompareWithASCIIString(key, "__builtins__") != 0)
302 {
303 if (Py_VerboseFlag > 1) {
304 const char *s = _PyUnicode_AsString(key);
305 if (s != NULL)
306 PySys_WriteStderr("# clear[2] %s\n", s);
307 else
308 PyErr_Clear();
309 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000310 PyDict_SetItem(d, key, Py_None);
311 }
312 }
313 }
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000314
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000315 /* Note: we leave __builtins__ in place, so that destructors
316 of non-global objects defined in this module can still use
317 builtins, in particularly 'None'. */
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000318
319}
320
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000321/* Methods */
322
Tim Peters6d6c1a32001-08-02 04:15:00 +0000323static int
Guido van Rossumc3a787e2002-06-04 05:52:47 +0000324module_init(PyModuleObject *m, PyObject *args, PyObject *kwds)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000325{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000326 static char *kwlist[] = {"name", "doc", NULL};
327 PyObject *dict, *name = Py_None, *doc = Py_None;
328 if (!PyArg_ParseTupleAndKeywords(args, kwds, "U|O:module.__init__",
329 kwlist, &name, &doc))
330 return -1;
331 dict = m->md_dict;
332 if (dict == NULL) {
333 dict = PyDict_New();
334 if (dict == NULL)
335 return -1;
336 m->md_dict = dict;
337 }
338 if (PyDict_SetItemString(dict, "__name__", name) < 0)
339 return -1;
340 if (PyDict_SetItemString(dict, "__doc__", doc) < 0)
341 return -1;
342 return 0;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000343}
344
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000345static void
Fred Drakeee238b92000-07-09 06:03:25 +0000346module_dealloc(PyModuleObject *m)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000347{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000348 PyObject_GC_UnTrack(m);
349 if (m->md_def && m->md_def->m_free)
350 m->md_def->m_free(m);
351 if (m->md_dict != NULL) {
Benjamin Peterson5c4bfc42010-10-12 22:57:59 +0000352 _PyModule_Clear((PyObject *)m);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000353 Py_DECREF(m->md_dict);
354 }
355 if (m->md_state != NULL)
356 PyMem_FREE(m->md_state);
357 Py_TYPE(m)->tp_free((PyObject *)m);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000358}
359
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000360static PyObject *
Fred Drakeee238b92000-07-09 06:03:25 +0000361module_repr(PyModuleObject *m)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000362{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000363 const char *name;
Victor Stinner6c00c142010-08-17 23:37:11 +0000364 PyObject *filename, *repr;
Barry Warsaw2907fe62001-08-16 20:39:24 +0000365
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000366 name = PyModule_GetName((PyObject *)m);
367 if (name == NULL) {
368 PyErr_Clear();
369 name = "?";
370 }
Victor Stinner6c00c142010-08-17 23:37:11 +0000371 filename = PyModule_GetFilenameObject((PyObject *)m);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000372 if (filename == NULL) {
373 PyErr_Clear();
374 return PyUnicode_FromFormat("<module '%s' (built-in)>", name);
375 }
Victor Stinner6c00c142010-08-17 23:37:11 +0000376 repr = PyUnicode_FromFormat("<module '%s' from '%U'>", name, filename);
377 Py_DECREF(filename);
378 return repr;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000379}
380
Neil Schemenauer10e31cf2001-01-02 15:58:27 +0000381static int
382module_traverse(PyModuleObject *m, visitproc visit, void *arg)
383{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000384 if (m->md_def && m->md_def->m_traverse) {
385 int res = m->md_def->m_traverse((PyObject*)m, visit, arg);
386 if (res)
387 return res;
388 }
389 Py_VISIT(m->md_dict);
390 return 0;
Neil Schemenauer10e31cf2001-01-02 15:58:27 +0000391}
392
Martin v. Löwis1a214512008-06-11 05:26:20 +0000393static int
394module_clear(PyModuleObject *m)
395{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000396 if (m->md_def && m->md_def->m_clear) {
397 int res = m->md_def->m_clear((PyObject*)m);
398 if (res)
399 return res;
400 }
401 Py_CLEAR(m->md_dict);
402 return 0;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000403}
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000404
Martin v. Löwis1a214512008-06-11 05:26:20 +0000405
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000406PyDoc_STRVAR(module_doc,
Guido van Rossumed3e09f2002-06-04 06:02:35 +0000407"module(name[, doc])\n\
408\n\
409Create a module object.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000410The name must be a string; the optional doc argument can have any type.");
Guido van Rossumed3e09f2002-06-04 06:02:35 +0000411
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000412PyTypeObject PyModule_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000413 PyVarObject_HEAD_INIT(&PyType_Type, 0)
414 "module", /* tp_name */
415 sizeof(PyModuleObject), /* tp_size */
416 0, /* tp_itemsize */
417 (destructor)module_dealloc, /* tp_dealloc */
418 0, /* tp_print */
419 0, /* tp_getattr */
420 0, /* tp_setattr */
421 0, /* tp_reserved */
422 (reprfunc)module_repr, /* tp_repr */
423 0, /* tp_as_number */
424 0, /* tp_as_sequence */
425 0, /* tp_as_mapping */
426 0, /* tp_hash */
427 0, /* tp_call */
428 0, /* tp_str */
429 PyObject_GenericGetAttr, /* tp_getattro */
430 PyObject_GenericSetAttr, /* tp_setattro */
431 0, /* tp_as_buffer */
432 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
433 Py_TPFLAGS_BASETYPE, /* tp_flags */
434 module_doc, /* tp_doc */
435 (traverseproc)module_traverse, /* tp_traverse */
436 (inquiry)module_clear, /* tp_clear */
437 0, /* tp_richcompare */
438 0, /* tp_weaklistoffset */
439 0, /* tp_iter */
440 0, /* tp_iternext */
441 0, /* tp_methods */
442 module_members, /* tp_members */
443 0, /* tp_getset */
444 0, /* tp_base */
445 0, /* tp_dict */
446 0, /* tp_descr_get */
447 0, /* tp_descr_set */
448 offsetof(PyModuleObject, md_dict), /* tp_dictoffset */
449 (initproc)module_init, /* tp_init */
450 PyType_GenericAlloc, /* tp_alloc */
451 PyType_GenericNew, /* tp_new */
452 PyObject_GC_Del, /* tp_free */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000453};