blob: 7b8e1b63c4af76a53b97f17edf58bbcd7fb1900b [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;
77 if (module_api_version != PYTHON_API_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
Neal Norwitz312e10d2007-08-26 02:21:42 +0000171const char *
Fred Drakeee238b92000-07-09 06:03:25 +0000172PyModule_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 }
188 return _PyUnicode_AsString(nameobj);
Guido van Rossum0558a201990-10-26 15:00:11 +0000189}
190
Victor Stinner8124feb2010-05-07 00:50:12 +0000191static PyObject*
192module_getfilename(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 }
208 return fileobj;
Victor Stinner8124feb2010-05-07 00:50:12 +0000209}
210
211const char *
212PyModule_GetFilename(PyObject *m)
213{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000214 PyObject *fileobj;
215 fileobj = module_getfilename(m);
216 if (fileobj == NULL)
217 return NULL;
218 return _PyUnicode_AsString(fileobj);
Guido van Rossum98cc19f1999-02-15 14:47:16 +0000219}
220
Martin v. Löwis1a214512008-06-11 05:26:20 +0000221PyModuleDef*
222PyModule_GetDef(PyObject* m)
223{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000224 if (!PyModule_Check(m)) {
225 PyErr_BadArgument();
226 return NULL;
227 }
228 return ((PyModuleObject *)m)->md_def;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000229}
230
231void*
232PyModule_GetState(PyObject* m)
233{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000234 if (!PyModule_Check(m)) {
235 PyErr_BadArgument();
236 return NULL;
237 }
238 return ((PyModuleObject *)m)->md_state;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000239}
240
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000241void
Fred Drakeee238b92000-07-09 06:03:25 +0000242_PyModule_Clear(PyObject *m)
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000243{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000244 /* To make the execution order of destructors for global
245 objects a bit more predictable, we first zap all objects
246 whose name starts with a single underscore, before we clear
247 the entire dictionary. We zap them by replacing them with
248 None, rather than deleting them from the dictionary, to
249 avoid rehashing the dictionary (to some extent). */
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000250
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000251 Py_ssize_t pos;
252 PyObject *key, *value;
253 PyObject *d;
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000254
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000255 d = ((PyModuleObject *)m)->md_dict;
256 if (d == NULL)
257 return;
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000258
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000259 /* First, clear only names starting with a single underscore */
260 pos = 0;
261 while (PyDict_Next(d, &pos, &key, &value)) {
262 if (value != Py_None && PyUnicode_Check(key)) {
Victor Stinnerf3f22a22010-05-19 00:03:09 +0000263 Py_UNICODE *u = PyUnicode_AS_UNICODE(key);
264 if (u[0] == '_' && u[1] != '_') {
265 if (Py_VerboseFlag > 1) {
266 const char *s = _PyUnicode_AsString(key);
267 if (s != NULL)
268 PySys_WriteStderr("# clear[1] %s\n", s);
269 else
270 PyErr_Clear();
271 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000272 PyDict_SetItem(d, key, Py_None);
273 }
274 }
275 }
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000276
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000277 /* Next, clear all names except for __builtins__ */
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] != '_'
283 || PyUnicode_CompareWithASCIIString(key, "__builtins__") != 0)
284 {
285 if (Py_VerboseFlag > 1) {
286 const char *s = _PyUnicode_AsString(key);
287 if (s != NULL)
288 PySys_WriteStderr("# clear[2] %s\n", s);
289 else
290 PyErr_Clear();
291 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000292 PyDict_SetItem(d, key, Py_None);
293 }
294 }
295 }
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000296
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000297 /* Note: we leave __builtins__ in place, so that destructors
298 of non-global objects defined in this module can still use
299 builtins, in particularly 'None'. */
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000300
301}
302
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000303/* Methods */
304
Tim Peters6d6c1a32001-08-02 04:15:00 +0000305static int
Guido van Rossumc3a787e2002-06-04 05:52:47 +0000306module_init(PyModuleObject *m, PyObject *args, PyObject *kwds)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000307{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000308 static char *kwlist[] = {"name", "doc", NULL};
309 PyObject *dict, *name = Py_None, *doc = Py_None;
310 if (!PyArg_ParseTupleAndKeywords(args, kwds, "U|O:module.__init__",
311 kwlist, &name, &doc))
312 return -1;
313 dict = m->md_dict;
314 if (dict == NULL) {
315 dict = PyDict_New();
316 if (dict == NULL)
317 return -1;
318 m->md_dict = dict;
319 }
320 if (PyDict_SetItemString(dict, "__name__", name) < 0)
321 return -1;
322 if (PyDict_SetItemString(dict, "__doc__", doc) < 0)
323 return -1;
324 return 0;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000325}
326
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000327static void
Fred Drakeee238b92000-07-09 06:03:25 +0000328module_dealloc(PyModuleObject *m)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000329{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000330 PyObject_GC_UnTrack(m);
331 if (m->md_def && m->md_def->m_free)
332 m->md_def->m_free(m);
333 if (m->md_dict != NULL) {
334 /* If we are the only ones holding a reference, we can clear
335 the dictionary. */
336 if (Py_REFCNT(m->md_dict) == 1)
337 _PyModule_Clear((PyObject *)m);
338 Py_DECREF(m->md_dict);
339 }
340 if (m->md_state != NULL)
341 PyMem_FREE(m->md_state);
342 Py_TYPE(m)->tp_free((PyObject *)m);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000343}
344
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000345static PyObject *
Fred Drakeee238b92000-07-09 06:03:25 +0000346module_repr(PyModuleObject *m)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000347{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000348 const char *name;
349 PyObject *filename;
Barry Warsaw2907fe62001-08-16 20:39:24 +0000350
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000351 name = PyModule_GetName((PyObject *)m);
352 if (name == NULL) {
353 PyErr_Clear();
354 name = "?";
355 }
356 filename = module_getfilename((PyObject *)m);
357 if (filename == NULL) {
358 PyErr_Clear();
359 return PyUnicode_FromFormat("<module '%s' (built-in)>", name);
360 }
361 return PyUnicode_FromFormat("<module '%s' from '%U'>", name, filename);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000362}
363
Neil Schemenauer10e31cf2001-01-02 15:58:27 +0000364static int
365module_traverse(PyModuleObject *m, visitproc visit, void *arg)
366{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000367 if (m->md_def && m->md_def->m_traverse) {
368 int res = m->md_def->m_traverse((PyObject*)m, visit, arg);
369 if (res)
370 return res;
371 }
372 Py_VISIT(m->md_dict);
373 return 0;
Neil Schemenauer10e31cf2001-01-02 15:58:27 +0000374}
375
Martin v. Löwis1a214512008-06-11 05:26:20 +0000376static int
377module_clear(PyModuleObject *m)
378{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000379 if (m->md_def && m->md_def->m_clear) {
380 int res = m->md_def->m_clear((PyObject*)m);
381 if (res)
382 return res;
383 }
384 Py_CLEAR(m->md_dict);
385 return 0;
Martin v. Löwis1a214512008-06-11 05:26:20 +0000386}
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000387
Martin v. Löwis1a214512008-06-11 05:26:20 +0000388
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000389PyDoc_STRVAR(module_doc,
Guido van Rossumed3e09f2002-06-04 06:02:35 +0000390"module(name[, doc])\n\
391\n\
392Create a module object.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000393The name must be a string; the optional doc argument can have any type.");
Guido van Rossumed3e09f2002-06-04 06:02:35 +0000394
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000395PyTypeObject PyModule_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000396 PyVarObject_HEAD_INIT(&PyType_Type, 0)
397 "module", /* tp_name */
398 sizeof(PyModuleObject), /* tp_size */
399 0, /* tp_itemsize */
400 (destructor)module_dealloc, /* tp_dealloc */
401 0, /* tp_print */
402 0, /* tp_getattr */
403 0, /* tp_setattr */
404 0, /* tp_reserved */
405 (reprfunc)module_repr, /* tp_repr */
406 0, /* tp_as_number */
407 0, /* tp_as_sequence */
408 0, /* tp_as_mapping */
409 0, /* tp_hash */
410 0, /* tp_call */
411 0, /* tp_str */
412 PyObject_GenericGetAttr, /* tp_getattro */
413 PyObject_GenericSetAttr, /* tp_setattro */
414 0, /* tp_as_buffer */
415 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
416 Py_TPFLAGS_BASETYPE, /* tp_flags */
417 module_doc, /* tp_doc */
418 (traverseproc)module_traverse, /* tp_traverse */
419 (inquiry)module_clear, /* tp_clear */
420 0, /* tp_richcompare */
421 0, /* tp_weaklistoffset */
422 0, /* tp_iter */
423 0, /* tp_iternext */
424 0, /* tp_methods */
425 module_members, /* tp_members */
426 0, /* tp_getset */
427 0, /* tp_base */
428 0, /* tp_dict */
429 0, /* tp_descr_get */
430 0, /* tp_descr_set */
431 offsetof(PyModuleObject, md_dict), /* tp_dictoffset */
432 (initproc)module_init, /* tp_init */
433 PyType_GenericAlloc, /* tp_alloc */
434 PyType_GenericNew, /* tp_new */
435 PyObject_GC_Del, /* tp_free */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000436};