blob: 6628fe993641d7b3f30a2637187dc5c6677652ef [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"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00005
6typedef struct {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00007 PyObject_HEAD
8 PyObject *md_dict;
9} PyModuleObject;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000010
Guido van Rossumc0b618a1997-05-02 03:12:38 +000011PyObject *
Fred Drakeee238b92000-07-09 06:03:25 +000012PyModule_New(char *name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000013{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000014 PyModuleObject *m;
15 PyObject *nameobj;
16 m = PyObject_NEW(PyModuleObject, &PyModule_Type);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000017 if (m == NULL)
18 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000019 nameobj = PyString_FromString(name);
20 m->md_dict = PyDict_New();
Neil Schemenauer10e31cf2001-01-02 15:58:27 +000021 PyObject_GC_Init(m);
Guido van Rossumc45611d1993-11-17 22:58:56 +000022 if (m->md_dict == NULL || nameobj == NULL)
23 goto fail;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000024 if (PyDict_SetItemString(m->md_dict, "__name__", nameobj) != 0)
Guido van Rossumc45611d1993-11-17 22:58:56 +000025 goto fail;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000026 if (PyDict_SetItemString(m->md_dict, "__doc__", Py_None) != 0)
Guido van Rossum8b14b4c1995-01-07 11:59:29 +000027 goto fail;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000028 Py_DECREF(nameobj);
29 return (PyObject *)m;
Guido van Rossumc45611d1993-11-17 22:58:56 +000030
31 fail:
Guido van Rossumc0b618a1997-05-02 03:12:38 +000032 Py_XDECREF(nameobj);
33 Py_DECREF(m);
Guido van Rossumc45611d1993-11-17 22:58:56 +000034 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000035}
36
Guido van Rossumc0b618a1997-05-02 03:12:38 +000037PyObject *
Fred Drakeee238b92000-07-09 06:03:25 +000038PyModule_GetDict(PyObject *m)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000039{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000040 if (!PyModule_Check(m)) {
41 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000042 return NULL;
43 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000044 return ((PyModuleObject *)m) -> md_dict;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000045}
46
Guido van Rossum0558a201990-10-26 15:00:11 +000047char *
Fred Drakeee238b92000-07-09 06:03:25 +000048PyModule_GetName(PyObject *m)
Guido van Rossum0558a201990-10-26 15:00:11 +000049{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000050 PyObject *nameobj;
51 if (!PyModule_Check(m)) {
52 PyErr_BadArgument();
Guido van Rossum0558a201990-10-26 15:00:11 +000053 return NULL;
54 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000055 nameobj = PyDict_GetItemString(((PyModuleObject *)m)->md_dict,
56 "__name__");
57 if (nameobj == NULL || !PyString_Check(nameobj)) {
58 PyErr_SetString(PyExc_SystemError, "nameless module");
Guido van Rossumc45611d1993-11-17 22:58:56 +000059 return NULL;
60 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000061 return PyString_AsString(nameobj);
Guido van Rossum0558a201990-10-26 15:00:11 +000062}
63
Guido van Rossum98cc19f1999-02-15 14:47:16 +000064char *
Fred Drakeee238b92000-07-09 06:03:25 +000065PyModule_GetFilename(PyObject *m)
Guido van Rossum98cc19f1999-02-15 14:47:16 +000066{
67 PyObject *fileobj;
68 if (!PyModule_Check(m)) {
69 PyErr_BadArgument();
70 return NULL;
71 }
72 fileobj = PyDict_GetItemString(((PyModuleObject *)m)->md_dict,
73 "__file__");
74 if (fileobj == NULL || !PyString_Check(fileobj)) {
75 PyErr_SetString(PyExc_SystemError, "module filename missing");
76 return NULL;
77 }
78 return PyString_AsString(fileobj);
79}
80
Guido van Rossumf1dc0611998-02-19 20:51:52 +000081void
Fred Drakeee238b92000-07-09 06:03:25 +000082_PyModule_Clear(PyObject *m)
Guido van Rossumf1dc0611998-02-19 20:51:52 +000083{
84 /* To make the execution order of destructors for global
85 objects a bit more predictable, we first zap all objects
86 whose name starts with a single underscore, before we clear
87 the entire dictionary. We zap them by replacing them with
88 None, rather than deleting them from the dictionary, to
89 avoid rehashing the dictionary (to some extent). */
90
91 int pos;
92 PyObject *key, *value;
93 PyObject *d;
94
95 d = ((PyModuleObject *)m)->md_dict;
96
97 /* First, clear only names starting with a single underscore */
98 pos = 0;
99 while (PyDict_Next(d, &pos, &key, &value)) {
100 if (value != Py_None && PyString_Check(key)) {
101 char *s = PyString_AsString(key);
102 if (s[0] == '_' && s[1] != '_') {
103 if (Py_VerboseFlag > 1)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000104 PySys_WriteStderr("# clear[1] %s\n", s);
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000105 PyDict_SetItem(d, key, Py_None);
106 }
107 }
108 }
109
110 /* Next, clear all names except for __builtins__ */
111 pos = 0;
112 while (PyDict_Next(d, &pos, &key, &value)) {
113 if (value != Py_None && PyString_Check(key)) {
114 char *s = PyString_AsString(key);
115 if (s[0] != '_' || strcmp(s, "__builtins__") != 0) {
116 if (Py_VerboseFlag > 1)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000117 PySys_WriteStderr("# clear[2] %s\n", s);
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000118 PyDict_SetItem(d, key, Py_None);
119 }
120 }
121 }
122
123 /* Note: we leave __builtins__ in place, so that destructors
124 of non-global objects defined in this module can still use
125 builtins, in particularly 'None'. */
126
127}
128
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000129/* Methods */
130
131static void
Fred Drakeee238b92000-07-09 06:03:25 +0000132module_dealloc(PyModuleObject *m)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000133{
Neil Schemenauer10e31cf2001-01-02 15:58:27 +0000134 PyObject_GC_Fini(m);
Guido van Rossum27e916f1995-01-26 00:39:00 +0000135 if (m->md_dict != NULL) {
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000136 _PyModule_Clear((PyObject *)m);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000137 Py_DECREF(m->md_dict);
Guido van Rossum27e916f1995-01-26 00:39:00 +0000138 }
Neil Schemenauer10e31cf2001-01-02 15:58:27 +0000139 PyObject_DEL(PyObject_AS_GC(m));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000140}
141
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000142static PyObject *
Fred Drakeee238b92000-07-09 06:03:25 +0000143module_repr(PyModuleObject *m)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000144{
Guido van Rossum98cc19f1999-02-15 14:47:16 +0000145 char buf[400];
146 char *name;
147 char *filename;
148 name = PyModule_GetName((PyObject *)m);
Guido van Rossumc45611d1993-11-17 22:58:56 +0000149 if (name == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000150 PyErr_Clear();
Guido van Rossumc45611d1993-11-17 22:58:56 +0000151 name = "?";
152 }
Guido van Rossum98cc19f1999-02-15 14:47:16 +0000153 filename = PyModule_GetFilename((PyObject *)m);
154 if (filename == NULL) {
155 PyErr_Clear();
156 sprintf(buf, "<module '%.80s' (built-in)>", name);
157 } else {
158 sprintf(buf, "<module '%.80s' from '%.255s'>", name, filename);
159 }
160
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000161 return PyString_FromString(buf);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000162}
163
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000164static PyObject *
Tim Petersd85e1022001-05-11 21:51:48 +0000165module_getattro(PyModuleObject *m, PyObject *name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000166{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000167 PyObject *res;
Tim Petersd85e1022001-05-11 21:51:48 +0000168 char *sname = PyString_AsString(name);
169
170 if (sname[0] == '_' && strcmp(sname, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000171 Py_INCREF(m->md_dict);
Guido van Rossume87203a1990-10-21 22:12:30 +0000172 return m->md_dict;
173 }
Tim Petersd85e1022001-05-11 21:51:48 +0000174 res = PyDict_GetItem(m->md_dict, name);
Fred Drake661ea262000-10-24 19:57:45 +0000175 if (res == NULL) {
Tim Petersd85e1022001-05-11 21:51:48 +0000176 char *modname = PyModule_GetName((PyObject *)m);
Fred Drake661ea262000-10-24 19:57:45 +0000177 if (modname == NULL) {
178 PyErr_Clear();
179 modname = "?";
180 }
181 PyErr_Format(PyExc_AttributeError,
182 "'%.50s' module has no attribute '%.400s'",
183 modname, name);
184 }
Guido van Rossum0add15f1997-05-09 01:07:15 +0000185 else
186 Py_INCREF(res);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000187 return res;
188}
189
190static int
Tim Petersd85e1022001-05-11 21:51:48 +0000191module_setattro(PyModuleObject *m, PyObject *name, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000192{
Tim Petersd85e1022001-05-11 21:51:48 +0000193 char *sname = PyString_AsString(name);
194 if (sname[0] == '_' && strcmp(sname, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000195 PyErr_SetString(PyExc_TypeError,
196 "read-only special attribute");
Guido van Rossumc45611d1993-11-17 22:58:56 +0000197 return -1;
Guido van Rossume87203a1990-10-21 22:12:30 +0000198 }
Guido van Rossum94472a01992-09-04 09:45:18 +0000199 if (v == NULL) {
Tim Petersd85e1022001-05-11 21:51:48 +0000200 int rv = PyDict_DelItem(m->md_dict, name);
Fred Drake661ea262000-10-24 19:57:45 +0000201 if (rv < 0) {
Tim Petersd85e1022001-05-11 21:51:48 +0000202 char *modname = PyModule_GetName((PyObject *)m);
Fred Drake661ea262000-10-24 19:57:45 +0000203 if (modname == NULL) {
204 PyErr_Clear();
205 modname = "?";
206 }
207 PyErr_Format(PyExc_AttributeError,
208 "'%.50s' module has no attribute '%.400s'",
Tim Petersd85e1022001-05-11 21:51:48 +0000209 modname, sname);
Fred Drake661ea262000-10-24 19:57:45 +0000210 }
Guido van Rossum94472a01992-09-04 09:45:18 +0000211 return rv;
212 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000213 else
Tim Petersd85e1022001-05-11 21:51:48 +0000214 return PyDict_SetItem(m->md_dict, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000215}
216
Neil Schemenauer10e31cf2001-01-02 15:58:27 +0000217/* We only need a traverse function, no clear function: If the module
218 is in a cycle, md_dict will be cleared as well, which will break
219 the cycle. */
220static int
221module_traverse(PyModuleObject *m, visitproc visit, void *arg)
222{
223 if (m->md_dict != NULL)
224 return visit(m->md_dict, arg);
225 return 0;
226}
227
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000228PyTypeObject PyModule_Type = {
229 PyObject_HEAD_INIT(&PyType_Type)
Tim Petersd85e1022001-05-11 21:51:48 +0000230 0, /* ob_size */
231 "module", /* tp_name */
232 sizeof(PyModuleObject) + PyGC_HEAD_SIZE,/* tp_size */
233 0, /* tp_itemsize */
234 (destructor)module_dealloc, /* tp_dealloc */
235 0, /* tp_print */
236 0, /* tp_getattr */
237 0, /* tp_setattr */
238 0, /* tp_compare */
239 (reprfunc)module_repr, /* tp_repr */
240 0, /* tp_as_number */
241 0, /* tp_as_sequence */
242 0, /* tp_as_mapping */
243 0, /* tp_hash */
244 0, /* tp_call */
245 0, /* tp_str */
246 (getattrofunc)module_getattro, /* tp_getattro */
247 (setattrofunc)module_setattro, /* tp_setattro */
248 0, /* tp_as_buffer */
249 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /* tp_flags */
250 0, /* tp_doc */
251 (traverseproc)module_traverse, /* tp_traverse */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000252};