blob: f9c9228c6cc518c856fffeb3b001e660575e901c [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 *
Fred Drakeee238b92000-07-09 06:03:25 +0000165module_getattr(PyModuleObject *m, char *name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000166{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000167 PyObject *res;
Fred Drake661ea262000-10-24 19:57:45 +0000168 char* modname;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000169 if (strcmp(name, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000170 Py_INCREF(m->md_dict);
Guido van Rossume87203a1990-10-21 22:12:30 +0000171 return m->md_dict;
172 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000173 res = PyDict_GetItemString(m->md_dict, name);
Fred Drake661ea262000-10-24 19:57:45 +0000174 if (res == NULL) {
175 modname = PyModule_GetName((PyObject *)m);
176 if (modname == NULL) {
177 PyErr_Clear();
178 modname = "?";
179 }
180 PyErr_Format(PyExc_AttributeError,
181 "'%.50s' module has no attribute '%.400s'",
182 modname, name);
183 }
Guido van Rossum0add15f1997-05-09 01:07:15 +0000184 else
185 Py_INCREF(res);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000186 return res;
187}
188
189static int
Fred Drakeee238b92000-07-09 06:03:25 +0000190module_setattr(PyModuleObject *m, char *name, PyObject *v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000191{
Fred Drake661ea262000-10-24 19:57:45 +0000192 char* modname;
Guido van Rossumc45611d1993-11-17 22:58:56 +0000193 if (name[0] == '_' && strcmp(name, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000194 PyErr_SetString(PyExc_TypeError,
195 "read-only special attribute");
Guido van Rossumc45611d1993-11-17 22:58:56 +0000196 return -1;
Guido van Rossume87203a1990-10-21 22:12:30 +0000197 }
Guido van Rossum94472a01992-09-04 09:45:18 +0000198 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000199 int rv = PyDict_DelItemString(m->md_dict, name);
Fred Drake661ea262000-10-24 19:57:45 +0000200 if (rv < 0) {
201 modname = PyModule_GetName((PyObject *)m);
202 if (modname == NULL) {
203 PyErr_Clear();
204 modname = "?";
205 }
206 PyErr_Format(PyExc_AttributeError,
207 "'%.50s' module has no attribute '%.400s'",
208 modname, name);
209 }
Guido van Rossum94472a01992-09-04 09:45:18 +0000210 return rv;
211 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000212 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000213 return PyDict_SetItemString(m->md_dict, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000214}
215
Neil Schemenauer10e31cf2001-01-02 15:58:27 +0000216/* We only need a traverse function, no clear function: If the module
217 is in a cycle, md_dict will be cleared as well, which will break
218 the cycle. */
219static int
220module_traverse(PyModuleObject *m, visitproc visit, void *arg)
221{
222 if (m->md_dict != NULL)
223 return visit(m->md_dict, arg);
224 return 0;
225}
226
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000227PyTypeObject PyModule_Type = {
228 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000229 0, /*ob_size*/
230 "module", /*tp_name*/
Neil Schemenauer10e31cf2001-01-02 15:58:27 +0000231 sizeof(PyModuleObject) + PyGC_HEAD_SIZE, /*tp_size*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000232 0, /*tp_itemsize*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000233 (destructor)module_dealloc, /*tp_dealloc*/
Guido van Rossum7066dd71992-09-17 17:54:56 +0000234 0, /*tp_print*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000235 (getattrfunc)module_getattr, /*tp_getattr*/
236 (setattrfunc)module_setattr, /*tp_setattr*/
Guido van Rossum3f5da241990-12-20 15:06:42 +0000237 0, /*tp_compare*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000238 (reprfunc)module_repr, /*tp_repr*/
Neil Schemenauer10e31cf2001-01-02 15:58:27 +0000239 0, /*tp_as_number*/
240 0, /*tp_as_sequence*/
241 0, /*tp_as_mapping*/
242 0, /* tp_hash */
243 0, /* tp_call */
244 0, /* tp_str */
245 0, /* tp_getattro */
246 0, /* tp_setattro */
247 0, /* tp_as_buffer */
248 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /*tp_flags*/
249 0, /* tp_doc */
250 (traverseproc)module_traverse, /* tp_traverse */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000251};