blob: 82eabf1b56dd270e323c2d08cf7dde8fb0209a66 [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 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00008 PyObject_HEAD
9 PyObject *md_dict;
10} PyModuleObject;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000011
Neil Schemenauerf23473f2001-10-21 22:28:58 +000012static PyMemberDef module_members[] = {
Tim Peters6d6c1a32001-08-02 04:15:00 +000013 {"__dict__", T_OBJECT, offsetof(PyModuleObject, md_dict), READONLY},
14 {0}
15};
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{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000020 PyModuleObject *m;
21 PyObject *nameobj;
Neil Schemenauere83c00e2001-08-29 23:54:21 +000022 m = PyObject_GC_New(PyModuleObject, &PyModule_Type);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000023 if (m == NULL)
24 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000025 nameobj = PyString_FromString(name);
26 m->md_dict = PyDict_New();
Guido van Rossumc45611d1993-11-17 22:58:56 +000027 if (m->md_dict == NULL || nameobj == NULL)
28 goto fail;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000029 if (PyDict_SetItemString(m->md_dict, "__name__", nameobj) != 0)
Guido van Rossumc45611d1993-11-17 22:58:56 +000030 goto fail;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000031 if (PyDict_SetItemString(m->md_dict, "__doc__", Py_None) != 0)
Guido van Rossum8b14b4c1995-01-07 11:59:29 +000032 goto fail;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000033 Py_DECREF(nameobj);
Neil Schemenauere83c00e2001-08-29 23:54:21 +000034 PyObject_GC_Track(m);
Guido van Rossumc0b618a1997-05-02 03:12:38 +000035 return (PyObject *)m;
Guido van Rossumc45611d1993-11-17 22:58:56 +000036
37 fail:
Guido van Rossumc0b618a1997-05-02 03:12:38 +000038 Py_XDECREF(nameobj);
39 Py_DECREF(m);
Guido van Rossumc45611d1993-11-17 22:58:56 +000040 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000041}
42
Guido van Rossumc0b618a1997-05-02 03:12:38 +000043PyObject *
Fred Drakeee238b92000-07-09 06:03:25 +000044PyModule_GetDict(PyObject *m)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000045{
Guido van Rossumcd637aa2002-03-12 20:37:02 +000046 PyObject *d;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000047 if (!PyModule_Check(m)) {
48 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000049 return NULL;
50 }
Guido van Rossumcd637aa2002-03-12 20:37:02 +000051 d = ((PyModuleObject *)m) -> md_dict;
52 if (d == NULL)
53 ((PyModuleObject *)m) -> md_dict = d = PyDict_New();
54 return d;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000055}
56
Guido van Rossum0558a201990-10-26 15:00:11 +000057char *
Fred Drakeee238b92000-07-09 06:03:25 +000058PyModule_GetName(PyObject *m)
Guido van Rossum0558a201990-10-26 15:00:11 +000059{
Guido van Rossumcd637aa2002-03-12 20:37:02 +000060 PyObject *d;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000061 PyObject *nameobj;
Guido van Rossum572dbf82007-04-27 23:53:51 +000062 char *s;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000063 if (!PyModule_Check(m)) {
64 PyErr_BadArgument();
Guido van Rossum0558a201990-10-26 15:00:11 +000065 return NULL;
66 }
Guido van Rossumcd637aa2002-03-12 20:37:02 +000067 d = ((PyModuleObject *)m)->md_dict;
68 if (d == NULL ||
69 (nameobj = PyDict_GetItemString(d, "__name__")) == NULL ||
Guido van Rossum572dbf82007-04-27 23:53:51 +000070 !(PyString_Check(nameobj) || PyUnicode_Check(nameobj)))
Guido van Rossumcd637aa2002-03-12 20:37:02 +000071 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000072 PyErr_SetString(PyExc_SystemError, "nameless module");
Guido van Rossumc45611d1993-11-17 22:58:56 +000073 return NULL;
74 }
Guido van Rossumf15a29f2007-05-04 00:41:39 +000075 if (PyUnicode_Check(nameobj)) {
76 nameobj = _PyUnicode_AsDefaultEncodedString(nameobj, NULL);
77 if (nameobj == NULL)
78 return NULL;
79 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000080 return PyString_AsString(nameobj);
Guido van Rossum0558a201990-10-26 15:00:11 +000081}
82
Guido van Rossum98cc19f1999-02-15 14:47:16 +000083char *
Fred Drakeee238b92000-07-09 06:03:25 +000084PyModule_GetFilename(PyObject *m)
Guido van Rossum98cc19f1999-02-15 14:47:16 +000085{
Guido van Rossumcd637aa2002-03-12 20:37:02 +000086 PyObject *d;
Guido van Rossum98cc19f1999-02-15 14:47:16 +000087 PyObject *fileobj;
88 if (!PyModule_Check(m)) {
89 PyErr_BadArgument();
90 return NULL;
91 }
Guido van Rossumcd637aa2002-03-12 20:37:02 +000092 d = ((PyModuleObject *)m)->md_dict;
93 if (d == NULL ||
94 (fileobj = PyDict_GetItemString(d, "__file__")) == NULL ||
95 !PyString_Check(fileobj))
96 {
Guido van Rossum98cc19f1999-02-15 14:47:16 +000097 PyErr_SetString(PyExc_SystemError, "module filename missing");
98 return NULL;
99 }
100 return PyString_AsString(fileobj);
101}
102
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000103void
Fred Drakeee238b92000-07-09 06:03:25 +0000104_PyModule_Clear(PyObject *m)
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000105{
106 /* To make the execution order of destructors for global
107 objects a bit more predictable, we first zap all objects
108 whose name starts with a single underscore, before we clear
109 the entire dictionary. We zap them by replacing them with
110 None, rather than deleting them from the dictionary, to
111 avoid rehashing the dictionary (to some extent). */
112
Martin v. Löwis18e16552006-02-15 17:27:45 +0000113 Py_ssize_t pos;
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000114 PyObject *key, *value;
115 PyObject *d;
116
117 d = ((PyModuleObject *)m)->md_dict;
Guido van Rossumcd637aa2002-03-12 20:37:02 +0000118 if (d == NULL)
119 return;
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000120
121 /* First, clear only names starting with a single underscore */
122 pos = 0;
123 while (PyDict_Next(d, &pos, &key, &value)) {
124 if (value != Py_None && PyString_Check(key)) {
125 char *s = PyString_AsString(key);
126 if (s[0] == '_' && s[1] != '_') {
127 if (Py_VerboseFlag > 1)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000128 PySys_WriteStderr("# clear[1] %s\n", s);
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000129 PyDict_SetItem(d, key, Py_None);
130 }
131 }
132 }
133
134 /* Next, clear all names except for __builtins__ */
135 pos = 0;
136 while (PyDict_Next(d, &pos, &key, &value)) {
137 if (value != Py_None && PyString_Check(key)) {
138 char *s = PyString_AsString(key);
139 if (s[0] != '_' || strcmp(s, "__builtins__") != 0) {
140 if (Py_VerboseFlag > 1)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000141 PySys_WriteStderr("# clear[2] %s\n", s);
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000142 PyDict_SetItem(d, key, Py_None);
143 }
144 }
145 }
146
147 /* Note: we leave __builtins__ in place, so that destructors
148 of non-global objects defined in this module can still use
149 builtins, in particularly 'None'. */
150
151}
152
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000153/* Methods */
154
Tim Peters6d6c1a32001-08-02 04:15:00 +0000155static int
Guido van Rossumc3a787e2002-06-04 05:52:47 +0000156module_init(PyModuleObject *m, PyObject *args, PyObject *kwds)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000157{
Martin v. Löwis15e62742006-02-27 16:46:16 +0000158 static char *kwlist[] = {"name", "doc", NULL};
Guido van Rossumc3a787e2002-06-04 05:52:47 +0000159 PyObject *dict, *name = Py_None, *doc = Py_None;
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000160 if (!PyArg_ParseTupleAndKeywords(args, kwds, "S|O:module.__init__",
161 kwlist, &name, &doc))
Guido van Rossumc3a787e2002-06-04 05:52:47 +0000162 return -1;
163 dict = m->md_dict;
164 if (dict == NULL) {
165 dict = PyDict_New();
166 if (dict == NULL)
167 return -1;
168 m->md_dict = dict;
169 }
170 if (PyDict_SetItemString(dict, "__name__", name) < 0)
171 return -1;
172 if (PyDict_SetItemString(dict, "__doc__", doc) < 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000173 return -1;
174 return 0;
175}
176
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000177static void
Fred Drakeee238b92000-07-09 06:03:25 +0000178module_dealloc(PyModuleObject *m)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000179{
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000180 PyObject_GC_UnTrack(m);
Guido van Rossum27e916f1995-01-26 00:39:00 +0000181 if (m->md_dict != NULL) {
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000182 _PyModule_Clear((PyObject *)m);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000183 Py_DECREF(m->md_dict);
Guido van Rossum27e916f1995-01-26 00:39:00 +0000184 }
Guido van Rossum9475a232001-10-05 20:51:39 +0000185 m->ob_type->tp_free((PyObject *)m);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000186}
187
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000188static PyObject *
Fred Drakeee238b92000-07-09 06:03:25 +0000189module_repr(PyModuleObject *m)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000190{
Guido van Rossum98cc19f1999-02-15 14:47:16 +0000191 char *name;
192 char *filename;
Barry Warsaw2907fe62001-08-16 20:39:24 +0000193
Guido van Rossum98cc19f1999-02-15 14:47:16 +0000194 name = PyModule_GetName((PyObject *)m);
Guido van Rossumc45611d1993-11-17 22:58:56 +0000195 if (name == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000196 PyErr_Clear();
Guido van Rossumc45611d1993-11-17 22:58:56 +0000197 name = "?";
198 }
Guido van Rossum98cc19f1999-02-15 14:47:16 +0000199 filename = PyModule_GetFilename((PyObject *)m);
200 if (filename == NULL) {
201 PyErr_Clear();
Barry Warsaw7ce36942001-08-24 18:34:26 +0000202 return PyString_FromFormat("<module '%s' (built-in)>", name);
Guido van Rossum98cc19f1999-02-15 14:47:16 +0000203 }
Barry Warsaw7ce36942001-08-24 18:34:26 +0000204 return PyString_FromFormat("<module '%s' from '%s'>", name, filename);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000205}
206
Neil Schemenauer10e31cf2001-01-02 15:58:27 +0000207/* We only need a traverse function, no clear function: If the module
208 is in a cycle, md_dict will be cleared as well, which will break
209 the cycle. */
210static int
211module_traverse(PyModuleObject *m, visitproc visit, void *arg)
212{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000213 Py_VISIT(m->md_dict);
Neil Schemenauer10e31cf2001-01-02 15:58:27 +0000214 return 0;
215}
216
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000217PyDoc_STRVAR(module_doc,
Guido van Rossumed3e09f2002-06-04 06:02:35 +0000218"module(name[, doc])\n\
219\n\
220Create a module object.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000221The name must be a string; the optional doc argument can have any type.");
Guido van Rossumed3e09f2002-06-04 06:02:35 +0000222
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000223PyTypeObject PyModule_Type = {
224 PyObject_HEAD_INIT(&PyType_Type)
Tim Petersd85e1022001-05-11 21:51:48 +0000225 0, /* ob_size */
226 "module", /* tp_name */
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000227 sizeof(PyModuleObject), /* tp_size */
Tim Petersd85e1022001-05-11 21:51:48 +0000228 0, /* tp_itemsize */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000229 (destructor)module_dealloc, /* tp_dealloc */
Tim Petersd85e1022001-05-11 21:51:48 +0000230 0, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000231 0, /* tp_getattr */
232 0, /* tp_setattr */
Tim Petersd85e1022001-05-11 21:51:48 +0000233 0, /* tp_compare */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000234 (reprfunc)module_repr, /* tp_repr */
Tim Petersd85e1022001-05-11 21:51:48 +0000235 0, /* tp_as_number */
236 0, /* tp_as_sequence */
237 0, /* tp_as_mapping */
238 0, /* tp_hash */
239 0, /* tp_call */
240 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000241 PyObject_GenericGetAttr, /* tp_getattro */
Neil Schemenauer75552942003-07-16 22:04:11 +0000242 PyObject_GenericSetAttr, /* tp_setattro */
Tim Petersd85e1022001-05-11 21:51:48 +0000243 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000244 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
Tim Peters6d6c1a32001-08-02 04:15:00 +0000245 Py_TPFLAGS_BASETYPE, /* tp_flags */
Guido van Rossumed3e09f2002-06-04 06:02:35 +0000246 module_doc, /* tp_doc */
Tim Petersd85e1022001-05-11 21:51:48 +0000247 (traverseproc)module_traverse, /* tp_traverse */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000248 0, /* tp_clear */
249 0, /* tp_richcompare */
250 0, /* tp_weaklistoffset */
251 0, /* tp_iter */
252 0, /* tp_iternext */
253 0, /* tp_methods */
254 module_members, /* tp_members */
255 0, /* tp_getset */
256 0, /* tp_base */
257 0, /* tp_dict */
258 0, /* tp_descr_get */
259 0, /* tp_descr_set */
260 offsetof(PyModuleObject, md_dict), /* tp_dictoffset */
261 (initproc)module_init, /* tp_init */
262 PyType_GenericAlloc, /* tp_alloc */
263 PyType_GenericNew, /* tp_new */
Neil Schemenauer99b5d282002-04-12 02:44:22 +0000264 PyObject_GC_Del, /* tp_free */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000265};