blob: 08e9740edb421f14e05f101c7725b1a3616a25a7 [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
7typedef struct {
Antoine Pitrouc83ea132010-05-09 14:46:46 +00008 PyObject_HEAD
9 PyObject *md_dict;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000010} PyModuleObject;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000011
Neil Schemenauerf23473f2001-10-21 22:28:58 +000012static PyMemberDef module_members[] = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +000013 {"__dict__", T_OBJECT, offsetof(PyModuleObject, md_dict), READONLY},
14 {0}
Tim Peters6d6c1a32001-08-02 04:15:00 +000015};
16
Guido van Rossumc0b618a1997-05-02 03:12:38 +000017PyObject *
Jeremy Hyltonaf68c872005-12-10 18:50:16 +000018PyModule_New(const char *name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000019{
Antoine Pitrouc83ea132010-05-09 14:46:46 +000020 PyModuleObject *m;
21 PyObject *nameobj;
22 m = PyObject_GC_New(PyModuleObject, &PyModule_Type);
23 if (m == NULL)
24 return NULL;
25 nameobj = PyString_FromString(name);
26 m->md_dict = PyDict_New();
27 if (m->md_dict == NULL || nameobj == NULL)
28 goto fail;
29 if (PyDict_SetItemString(m->md_dict, "__name__", nameobj) != 0)
30 goto fail;
31 if (PyDict_SetItemString(m->md_dict, "__doc__", Py_None) != 0)
32 goto fail;
33 if (PyDict_SetItemString(m->md_dict, "__package__", Py_None) != 0)
34 goto fail;
35 Py_DECREF(nameobj);
36 PyObject_GC_Track(m);
37 return (PyObject *)m;
Guido van Rossumc45611d1993-11-17 22:58:56 +000038
39 fail:
Antoine Pitrouc83ea132010-05-09 14:46:46 +000040 Py_XDECREF(nameobj);
41 Py_DECREF(m);
42 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000043}
44
Guido van Rossumc0b618a1997-05-02 03:12:38 +000045PyObject *
Fred Drakeee238b92000-07-09 06:03:25 +000046PyModule_GetDict(PyObject *m)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000047{
Antoine Pitrouc83ea132010-05-09 14:46:46 +000048 PyObject *d;
49 if (!PyModule_Check(m)) {
50 PyErr_BadInternalCall();
51 return NULL;
52 }
53 d = ((PyModuleObject *)m) -> md_dict;
54 if (d == NULL)
55 ((PyModuleObject *)m) -> md_dict = d = PyDict_New();
56 return d;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000057}
58
Guido van Rossum0558a201990-10-26 15:00:11 +000059char *
Fred Drakeee238b92000-07-09 06:03:25 +000060PyModule_GetName(PyObject *m)
Guido van Rossum0558a201990-10-26 15:00:11 +000061{
Antoine Pitrouc83ea132010-05-09 14:46:46 +000062 PyObject *d;
63 PyObject *nameobj;
64 if (!PyModule_Check(m)) {
65 PyErr_BadArgument();
66 return NULL;
67 }
68 d = ((PyModuleObject *)m)->md_dict;
69 if (d == NULL ||
70 (nameobj = PyDict_GetItemString(d, "__name__")) == NULL ||
71 !PyString_Check(nameobj))
72 {
73 PyErr_SetString(PyExc_SystemError, "nameless module");
74 return NULL;
75 }
76 return PyString_AsString(nameobj);
Guido van Rossum0558a201990-10-26 15:00:11 +000077}
78
Guido van Rossum98cc19f1999-02-15 14:47:16 +000079char *
Fred Drakeee238b92000-07-09 06:03:25 +000080PyModule_GetFilename(PyObject *m)
Guido van Rossum98cc19f1999-02-15 14:47:16 +000081{
Antoine Pitrouc83ea132010-05-09 14:46:46 +000082 PyObject *d;
83 PyObject *fileobj;
84 if (!PyModule_Check(m)) {
85 PyErr_BadArgument();
86 return NULL;
87 }
88 d = ((PyModuleObject *)m)->md_dict;
89 if (d == NULL ||
90 (fileobj = PyDict_GetItemString(d, "__file__")) == NULL ||
91 !PyString_Check(fileobj))
92 {
93 PyErr_SetString(PyExc_SystemError, "module filename missing");
94 return NULL;
95 }
96 return PyString_AsString(fileobj);
Guido van Rossum98cc19f1999-02-15 14:47:16 +000097}
98
Guido van Rossumf1dc0611998-02-19 20:51:52 +000099void
Fred Drakeee238b92000-07-09 06:03:25 +0000100_PyModule_Clear(PyObject *m)
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000101{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000102 /* To make the execution order of destructors for global
103 objects a bit more predictable, we first zap all objects
104 whose name starts with a single underscore, before we clear
105 the entire dictionary. We zap them by replacing them with
106 None, rather than deleting them from the dictionary, to
107 avoid rehashing the dictionary (to some extent). */
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000108
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000109 Py_ssize_t pos;
110 PyObject *key, *value;
111 PyObject *d;
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000112
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000113 d = ((PyModuleObject *)m)->md_dict;
114 if (d == NULL)
115 return;
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000116
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000117 /* First, clear only names starting with a single underscore */
118 pos = 0;
119 while (PyDict_Next(d, &pos, &key, &value)) {
120 if (value != Py_None && PyString_Check(key)) {
121 char *s = PyString_AsString(key);
122 if (s[0] == '_' && s[1] != '_') {
123 if (Py_VerboseFlag > 1)
124 PySys_WriteStderr("# clear[1] %s\n", s);
125 PyDict_SetItem(d, key, Py_None);
126 }
127 }
128 }
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000129
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000130 /* Next, clear all names except for __builtins__ */
131 pos = 0;
132 while (PyDict_Next(d, &pos, &key, &value)) {
133 if (value != Py_None && PyString_Check(key)) {
134 char *s = PyString_AsString(key);
135 if (s[0] != '_' || strcmp(s, "__builtins__") != 0) {
136 if (Py_VerboseFlag > 1)
137 PySys_WriteStderr("# clear[2] %s\n", s);
138 PyDict_SetItem(d, key, Py_None);
139 }
140 }
141 }
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000142
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000143 /* Note: we leave __builtins__ in place, so that destructors
144 of non-global objects defined in this module can still use
145 builtins, in particularly 'None'. */
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000146
147}
148
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000149/* Methods */
150
Tim Peters6d6c1a32001-08-02 04:15:00 +0000151static int
Guido van Rossumc3a787e2002-06-04 05:52:47 +0000152module_init(PyModuleObject *m, PyObject *args, PyObject *kwds)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000153{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000154 static char *kwlist[] = {"name", "doc", NULL};
155 PyObject *dict, *name = Py_None, *doc = Py_None;
156 if (!PyArg_ParseTupleAndKeywords(args, kwds, "S|O:module.__init__",
157 kwlist, &name, &doc))
158 return -1;
159 dict = m->md_dict;
160 if (dict == NULL) {
161 dict = PyDict_New();
162 if (dict == NULL)
163 return -1;
164 m->md_dict = dict;
165 }
166 if (PyDict_SetItemString(dict, "__name__", name) < 0)
167 return -1;
168 if (PyDict_SetItemString(dict, "__doc__", doc) < 0)
169 return -1;
170 return 0;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000171}
172
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000173static void
Fred Drakeee238b92000-07-09 06:03:25 +0000174module_dealloc(PyModuleObject *m)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000175{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000176 PyObject_GC_UnTrack(m);
177 if (m->md_dict != NULL) {
Benjamin Petersondc954242010-10-12 23:02:35 +0000178 _PyModule_Clear((PyObject *)m);
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000179 Py_DECREF(m->md_dict);
180 }
181 Py_TYPE(m)->tp_free((PyObject *)m);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000182}
183
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000184static PyObject *
Fred Drakeee238b92000-07-09 06:03:25 +0000185module_repr(PyModuleObject *m)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000186{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000187 char *name;
188 char *filename;
Barry Warsaw2907fe62001-08-16 20:39:24 +0000189
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000190 name = PyModule_GetName((PyObject *)m);
191 if (name == NULL) {
192 PyErr_Clear();
193 name = "?";
194 }
195 filename = PyModule_GetFilename((PyObject *)m);
196 if (filename == NULL) {
197 PyErr_Clear();
198 return PyString_FromFormat("<module '%s' (built-in)>", name);
199 }
200 return PyString_FromFormat("<module '%s' from '%s'>", name, filename);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000201}
202
Neil Schemenauer10e31cf2001-01-02 15:58:27 +0000203/* We only need a traverse function, no clear function: If the module
204 is in a cycle, md_dict will be cleared as well, which will break
205 the cycle. */
206static int
207module_traverse(PyModuleObject *m, visitproc visit, void *arg)
208{
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000209 Py_VISIT(m->md_dict);
210 return 0;
Neil Schemenauer10e31cf2001-01-02 15:58:27 +0000211}
212
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000213PyDoc_STRVAR(module_doc,
Guido van Rossumed3e09f2002-06-04 06:02:35 +0000214"module(name[, doc])\n\
215\n\
216Create a module object.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000217The name must be a string; the optional doc argument can have any type.");
Guido van Rossumed3e09f2002-06-04 06:02:35 +0000218
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000219PyTypeObject PyModule_Type = {
Antoine Pitrouc83ea132010-05-09 14:46:46 +0000220 PyVarObject_HEAD_INIT(&PyType_Type, 0)
221 "module", /* tp_name */
222 sizeof(PyModuleObject), /* tp_size */
223 0, /* tp_itemsize */
224 (destructor)module_dealloc, /* tp_dealloc */
225 0, /* tp_print */
226 0, /* tp_getattr */
227 0, /* tp_setattr */
228 0, /* tp_compare */
229 (reprfunc)module_repr, /* tp_repr */
230 0, /* tp_as_number */
231 0, /* tp_as_sequence */
232 0, /* tp_as_mapping */
233 0, /* tp_hash */
234 0, /* tp_call */
235 0, /* tp_str */
236 PyObject_GenericGetAttr, /* tp_getattro */
237 PyObject_GenericSetAttr, /* tp_setattro */
238 0, /* tp_as_buffer */
239 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
240 Py_TPFLAGS_BASETYPE, /* tp_flags */
241 module_doc, /* tp_doc */
242 (traverseproc)module_traverse, /* tp_traverse */
243 0, /* tp_clear */
244 0, /* tp_richcompare */
245 0, /* tp_weaklistoffset */
246 0, /* tp_iter */
247 0, /* tp_iternext */
248 0, /* tp_methods */
249 module_members, /* tp_members */
250 0, /* tp_getset */
251 0, /* tp_base */
252 0, /* tp_dict */
253 0, /* tp_descr_get */
254 0, /* tp_descr_set */
255 offsetof(PyModuleObject, md_dict), /* tp_dictoffset */
256 (initproc)module_init, /* tp_init */
257 PyType_GenericAlloc, /* tp_alloc */
258 PyType_GenericNew, /* tp_new */
259 PyObject_GC_Del, /* tp_free */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000260};