blob: 7dfca731e51981706a686d200a26874e2a92dd90 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum6610ad91995-01-04 19:07:38 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossumf70e43a1991-02-19 12:39:46 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000029
30******************************************************************/
31
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000032/* Module object implementation */
33
Guido van Rossumc0b618a1997-05-02 03:12:38 +000034#include "Python.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000035
36typedef struct {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000037 PyObject_HEAD
38 PyObject *md_dict;
39} PyModuleObject;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000040
Guido van Rossumc0b618a1997-05-02 03:12:38 +000041PyObject *
42PyModule_New(name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000043 char *name;
44{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000045 PyModuleObject *m;
46 PyObject *nameobj;
47 m = PyObject_NEW(PyModuleObject, &PyModule_Type);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000048 if (m == NULL)
49 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000050 nameobj = PyString_FromString(name);
51 m->md_dict = PyDict_New();
Guido van Rossumc45611d1993-11-17 22:58:56 +000052 if (m->md_dict == NULL || nameobj == NULL)
53 goto fail;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000054 if (PyDict_SetItemString(m->md_dict, "__name__", nameobj) != 0)
Guido van Rossumc45611d1993-11-17 22:58:56 +000055 goto fail;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000056 if (PyDict_SetItemString(m->md_dict, "__doc__", Py_None) != 0)
Guido van Rossum8b14b4c1995-01-07 11:59:29 +000057 goto fail;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000058 Py_DECREF(nameobj);
59 return (PyObject *)m;
Guido van Rossumc45611d1993-11-17 22:58:56 +000060
61 fail:
Guido van Rossumc0b618a1997-05-02 03:12:38 +000062 Py_XDECREF(nameobj);
63 Py_DECREF(m);
Guido van Rossumc45611d1993-11-17 22:58:56 +000064 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000065}
66
Guido van Rossumc0b618a1997-05-02 03:12:38 +000067PyObject *
68PyModule_GetDict(m)
69 PyObject *m;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000070{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000071 if (!PyModule_Check(m)) {
72 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000073 return NULL;
74 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000075 return ((PyModuleObject *)m) -> md_dict;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000076}
77
Guido van Rossum0558a201990-10-26 15:00:11 +000078char *
Guido van Rossumc0b618a1997-05-02 03:12:38 +000079PyModule_GetName(m)
80 PyObject *m;
Guido van Rossum0558a201990-10-26 15:00:11 +000081{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000082 PyObject *nameobj;
83 if (!PyModule_Check(m)) {
84 PyErr_BadArgument();
Guido van Rossum0558a201990-10-26 15:00:11 +000085 return NULL;
86 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000087 nameobj = PyDict_GetItemString(((PyModuleObject *)m)->md_dict,
88 "__name__");
89 if (nameobj == NULL || !PyString_Check(nameobj)) {
90 PyErr_SetString(PyExc_SystemError, "nameless module");
Guido van Rossumc45611d1993-11-17 22:58:56 +000091 return NULL;
92 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000093 return PyString_AsString(nameobj);
Guido van Rossum0558a201990-10-26 15:00:11 +000094}
95
Guido van Rossum98cc19f1999-02-15 14:47:16 +000096char *
97PyModule_GetFilename(m)
98 PyObject *m;
99{
100 PyObject *fileobj;
101 if (!PyModule_Check(m)) {
102 PyErr_BadArgument();
103 return NULL;
104 }
105 fileobj = PyDict_GetItemString(((PyModuleObject *)m)->md_dict,
106 "__file__");
107 if (fileobj == NULL || !PyString_Check(fileobj)) {
108 PyErr_SetString(PyExc_SystemError, "module filename missing");
109 return NULL;
110 }
111 return PyString_AsString(fileobj);
112}
113
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000114void
115_PyModule_Clear(m)
116 PyObject *m;
117{
118 /* To make the execution order of destructors for global
119 objects a bit more predictable, we first zap all objects
120 whose name starts with a single underscore, before we clear
121 the entire dictionary. We zap them by replacing them with
122 None, rather than deleting them from the dictionary, to
123 avoid rehashing the dictionary (to some extent). */
124
125 int pos;
126 PyObject *key, *value;
127 PyObject *d;
128
129 d = ((PyModuleObject *)m)->md_dict;
130
131 /* First, clear only names starting with a single underscore */
132 pos = 0;
133 while (PyDict_Next(d, &pos, &key, &value)) {
134 if (value != Py_None && PyString_Check(key)) {
135 char *s = PyString_AsString(key);
136 if (s[0] == '_' && s[1] != '_') {
137 if (Py_VerboseFlag > 1)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000138 PySys_WriteStderr("# clear[1] %s\n", s);
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000139 PyDict_SetItem(d, key, Py_None);
140 }
141 }
142 }
143
144 /* Next, clear all names except for __builtins__ */
145 pos = 0;
146 while (PyDict_Next(d, &pos, &key, &value)) {
147 if (value != Py_None && PyString_Check(key)) {
148 char *s = PyString_AsString(key);
149 if (s[0] != '_' || strcmp(s, "__builtins__") != 0) {
150 if (Py_VerboseFlag > 1)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000151 PySys_WriteStderr("# clear[2] %s\n", s);
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000152 PyDict_SetItem(d, key, Py_None);
153 }
154 }
155 }
156
157 /* Note: we leave __builtins__ in place, so that destructors
158 of non-global objects defined in this module can still use
159 builtins, in particularly 'None'. */
160
161}
162
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000163/* Methods */
164
165static void
Guido van Rossum3f5da241990-12-20 15:06:42 +0000166module_dealloc(m)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000167 PyModuleObject *m;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000168{
Guido van Rossum27e916f1995-01-26 00:39:00 +0000169 if (m->md_dict != NULL) {
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000170 _PyModule_Clear((PyObject *)m);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000171 Py_DECREF(m->md_dict);
Guido van Rossum27e916f1995-01-26 00:39:00 +0000172 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000173 free((char *)m);
174}
175
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000176static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000177module_repr(m)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000178 PyModuleObject *m;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000179{
Guido van Rossum98cc19f1999-02-15 14:47:16 +0000180 char buf[400];
181 char *name;
182 char *filename;
183 name = PyModule_GetName((PyObject *)m);
Guido van Rossumc45611d1993-11-17 22:58:56 +0000184 if (name == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000185 PyErr_Clear();
Guido van Rossumc45611d1993-11-17 22:58:56 +0000186 name = "?";
187 }
Guido van Rossum98cc19f1999-02-15 14:47:16 +0000188 filename = PyModule_GetFilename((PyObject *)m);
189 if (filename == NULL) {
190 PyErr_Clear();
191 sprintf(buf, "<module '%.80s' (built-in)>", name);
192 } else {
193 sprintf(buf, "<module '%.80s' from '%.255s'>", name, filename);
194 }
195
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000196 return PyString_FromString(buf);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000197}
198
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000199static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000200module_getattr(m, name)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000201 PyModuleObject *m;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000202 char *name;
203{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000204 PyObject *res;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000205 if (strcmp(name, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000206 Py_INCREF(m->md_dict);
Guido van Rossume87203a1990-10-21 22:12:30 +0000207 return m->md_dict;
208 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000209 res = PyDict_GetItemString(m->md_dict, name);
Guido van Rossum2b654f71990-10-14 20:03:32 +0000210 if (res == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000211 PyErr_SetString(PyExc_AttributeError, name);
Guido van Rossum0add15f1997-05-09 01:07:15 +0000212 else
213 Py_INCREF(res);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000214 return res;
215}
216
217static int
Guido van Rossum3f5da241990-12-20 15:06:42 +0000218module_setattr(m, name, v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000219 PyModuleObject *m;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000220 char *name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000221 PyObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000222{
Guido van Rossumc45611d1993-11-17 22:58:56 +0000223 if (name[0] == '_' && strcmp(name, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000224 PyErr_SetString(PyExc_TypeError,
225 "read-only special attribute");
Guido van Rossumc45611d1993-11-17 22:58:56 +0000226 return -1;
Guido van Rossume87203a1990-10-21 22:12:30 +0000227 }
Guido van Rossum94472a01992-09-04 09:45:18 +0000228 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000229 int rv = PyDict_DelItemString(m->md_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000230 if (rv < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000231 PyErr_SetString(PyExc_AttributeError,
Guido van Rossum94472a01992-09-04 09:45:18 +0000232 "delete non-existing module attribute");
233 return rv;
234 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000235 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000236 return PyDict_SetItemString(m->md_dict, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000237}
238
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000239PyTypeObject PyModule_Type = {
240 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000241 0, /*ob_size*/
242 "module", /*tp_name*/
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000243 sizeof(PyModuleObject), /*tp_size*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000244 0, /*tp_itemsize*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000245 (destructor)module_dealloc, /*tp_dealloc*/
Guido van Rossum7066dd71992-09-17 17:54:56 +0000246 0, /*tp_print*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000247 (getattrfunc)module_getattr, /*tp_getattr*/
248 (setattrfunc)module_setattr, /*tp_setattr*/
Guido van Rossum3f5da241990-12-20 15:06:42 +0000249 0, /*tp_compare*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000250 (reprfunc)module_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000251};