blob: 23b630c89137bfa96d5082ac426a7d18f609305c [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00002Copyright (c) 2000, BeOpen.com.
3Copyright (c) 1995-2000, Corporation for National Research Initiatives.
4Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
5All rights reserved.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00006
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007See the file "Misc/COPYRIGHT" for information on usage and
8redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009******************************************************************/
10
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000011/* Module object implementation */
12
Guido van Rossumc0b618a1997-05-02 03:12:38 +000013#include "Python.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000014
15typedef struct {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000016 PyObject_HEAD
17 PyObject *md_dict;
18} PyModuleObject;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000019
Guido van Rossumc0b618a1997-05-02 03:12:38 +000020PyObject *
21PyModule_New(name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000022 char *name;
23{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000024 PyModuleObject *m;
25 PyObject *nameobj;
26 m = PyObject_NEW(PyModuleObject, &PyModule_Type);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000027 if (m == NULL)
28 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000029 nameobj = PyString_FromString(name);
30 m->md_dict = PyDict_New();
Guido van Rossumc45611d1993-11-17 22:58:56 +000031 if (m->md_dict == NULL || nameobj == NULL)
32 goto fail;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000033 if (PyDict_SetItemString(m->md_dict, "__name__", nameobj) != 0)
Guido van Rossumc45611d1993-11-17 22:58:56 +000034 goto fail;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000035 if (PyDict_SetItemString(m->md_dict, "__doc__", Py_None) != 0)
Guido van Rossum8b14b4c1995-01-07 11:59:29 +000036 goto fail;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000037 Py_DECREF(nameobj);
38 return (PyObject *)m;
Guido van Rossumc45611d1993-11-17 22:58:56 +000039
40 fail:
Guido van Rossumc0b618a1997-05-02 03:12:38 +000041 Py_XDECREF(nameobj);
42 Py_DECREF(m);
Guido van Rossumc45611d1993-11-17 22:58:56 +000043 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000044}
45
Guido van Rossumc0b618a1997-05-02 03:12:38 +000046PyObject *
47PyModule_GetDict(m)
48 PyObject *m;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000049{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000050 if (!PyModule_Check(m)) {
51 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000052 return NULL;
53 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000054 return ((PyModuleObject *)m) -> md_dict;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000055}
56
Guido van Rossum0558a201990-10-26 15:00:11 +000057char *
Guido van Rossumc0b618a1997-05-02 03:12:38 +000058PyModule_GetName(m)
59 PyObject *m;
Guido van Rossum0558a201990-10-26 15:00:11 +000060{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000061 PyObject *nameobj;
62 if (!PyModule_Check(m)) {
63 PyErr_BadArgument();
Guido van Rossum0558a201990-10-26 15:00:11 +000064 return NULL;
65 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000066 nameobj = PyDict_GetItemString(((PyModuleObject *)m)->md_dict,
67 "__name__");
68 if (nameobj == NULL || !PyString_Check(nameobj)) {
69 PyErr_SetString(PyExc_SystemError, "nameless module");
Guido van Rossumc45611d1993-11-17 22:58:56 +000070 return NULL;
71 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000072 return PyString_AsString(nameobj);
Guido van Rossum0558a201990-10-26 15:00:11 +000073}
74
Guido van Rossum98cc19f1999-02-15 14:47:16 +000075char *
76PyModule_GetFilename(m)
77 PyObject *m;
78{
79 PyObject *fileobj;
80 if (!PyModule_Check(m)) {
81 PyErr_BadArgument();
82 return NULL;
83 }
84 fileobj = PyDict_GetItemString(((PyModuleObject *)m)->md_dict,
85 "__file__");
86 if (fileobj == NULL || !PyString_Check(fileobj)) {
87 PyErr_SetString(PyExc_SystemError, "module filename missing");
88 return NULL;
89 }
90 return PyString_AsString(fileobj);
91}
92
Guido van Rossumf1dc0611998-02-19 20:51:52 +000093void
94_PyModule_Clear(m)
95 PyObject *m;
96{
97 /* To make the execution order of destructors for global
98 objects a bit more predictable, we first zap all objects
99 whose name starts with a single underscore, before we clear
100 the entire dictionary. We zap them by replacing them with
101 None, rather than deleting them from the dictionary, to
102 avoid rehashing the dictionary (to some extent). */
103
104 int pos;
105 PyObject *key, *value;
106 PyObject *d;
107
108 d = ((PyModuleObject *)m)->md_dict;
109
110 /* First, clear only names starting with a single underscore */
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] == '_' && s[1] != '_') {
116 if (Py_VerboseFlag > 1)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000117 PySys_WriteStderr("# clear[1] %s\n", s);
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000118 PyDict_SetItem(d, key, Py_None);
119 }
120 }
121 }
122
123 /* Next, clear all names except for __builtins__ */
124 pos = 0;
125 while (PyDict_Next(d, &pos, &key, &value)) {
126 if (value != Py_None && PyString_Check(key)) {
127 char *s = PyString_AsString(key);
128 if (s[0] != '_' || strcmp(s, "__builtins__") != 0) {
129 if (Py_VerboseFlag > 1)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000130 PySys_WriteStderr("# clear[2] %s\n", s);
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000131 PyDict_SetItem(d, key, Py_None);
132 }
133 }
134 }
135
136 /* Note: we leave __builtins__ in place, so that destructors
137 of non-global objects defined in this module can still use
138 builtins, in particularly 'None'. */
139
140}
141
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000142/* Methods */
143
144static void
Guido van Rossum3f5da241990-12-20 15:06:42 +0000145module_dealloc(m)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000146 PyModuleObject *m;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000147{
Guido van Rossum27e916f1995-01-26 00:39:00 +0000148 if (m->md_dict != NULL) {
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000149 _PyModule_Clear((PyObject *)m);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000150 Py_DECREF(m->md_dict);
Guido van Rossum27e916f1995-01-26 00:39:00 +0000151 }
Guido van Rossumb18618d2000-05-03 23:44:39 +0000152 PyObject_DEL(m);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000153}
154
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000155static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000156module_repr(m)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000157 PyModuleObject *m;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000158{
Guido van Rossum98cc19f1999-02-15 14:47:16 +0000159 char buf[400];
160 char *name;
161 char *filename;
162 name = PyModule_GetName((PyObject *)m);
Guido van Rossumc45611d1993-11-17 22:58:56 +0000163 if (name == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000164 PyErr_Clear();
Guido van Rossumc45611d1993-11-17 22:58:56 +0000165 name = "?";
166 }
Guido van Rossum98cc19f1999-02-15 14:47:16 +0000167 filename = PyModule_GetFilename((PyObject *)m);
168 if (filename == NULL) {
169 PyErr_Clear();
170 sprintf(buf, "<module '%.80s' (built-in)>", name);
171 } else {
172 sprintf(buf, "<module '%.80s' from '%.255s'>", name, filename);
173 }
174
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000175 return PyString_FromString(buf);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000176}
177
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000178static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000179module_getattr(m, name)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000180 PyModuleObject *m;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000181 char *name;
182{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000183 PyObject *res;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000184 if (strcmp(name, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000185 Py_INCREF(m->md_dict);
Guido van Rossume87203a1990-10-21 22:12:30 +0000186 return m->md_dict;
187 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000188 res = PyDict_GetItemString(m->md_dict, name);
Guido van Rossum2b654f71990-10-14 20:03:32 +0000189 if (res == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000190 PyErr_SetString(PyExc_AttributeError, name);
Guido van Rossum0add15f1997-05-09 01:07:15 +0000191 else
192 Py_INCREF(res);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000193 return res;
194}
195
196static int
Guido van Rossum3f5da241990-12-20 15:06:42 +0000197module_setattr(m, name, v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000198 PyModuleObject *m;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000199 char *name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000200 PyObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000201{
Guido van Rossumc45611d1993-11-17 22:58:56 +0000202 if (name[0] == '_' && strcmp(name, "__dict__") == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000203 PyErr_SetString(PyExc_TypeError,
204 "read-only special attribute");
Guido van Rossumc45611d1993-11-17 22:58:56 +0000205 return -1;
Guido van Rossume87203a1990-10-21 22:12:30 +0000206 }
Guido van Rossum94472a01992-09-04 09:45:18 +0000207 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000208 int rv = PyDict_DelItemString(m->md_dict, name);
Guido van Rossum94472a01992-09-04 09:45:18 +0000209 if (rv < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000210 PyErr_SetString(PyExc_AttributeError,
Guido van Rossum94472a01992-09-04 09:45:18 +0000211 "delete non-existing module attribute");
212 return rv;
213 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000214 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000215 return PyDict_SetItemString(m->md_dict, name, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000216}
217
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000218PyTypeObject PyModule_Type = {
219 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000220 0, /*ob_size*/
221 "module", /*tp_name*/
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000222 sizeof(PyModuleObject), /*tp_size*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000223 0, /*tp_itemsize*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000224 (destructor)module_dealloc, /*tp_dealloc*/
Guido van Rossum7066dd71992-09-17 17:54:56 +0000225 0, /*tp_print*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000226 (getattrfunc)module_getattr, /*tp_getattr*/
227 (setattrfunc)module_setattr, /*tp_setattr*/
Guido van Rossum3f5da241990-12-20 15:06:42 +0000228 0, /*tp_compare*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000229 (reprfunc)module_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000230};