blob: c9f00e9934cc7f36f6d29150e7202698cb662e82 [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;
Gregory P. Smithdd96db62008-06-09 04:58:54 +000025 nameobj = PyString_FromString(name);
Guido van Rossumc0b618a1997-05-02 03:12:38 +000026 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;
Nick Coghlanef01d822007-12-03 12:55:17 +000033 if (PyDict_SetItemString(m->md_dict, "__package__", Py_None) != 0)
34 goto fail;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000035 Py_DECREF(nameobj);
Neil Schemenauere83c00e2001-08-29 23:54:21 +000036 PyObject_GC_Track(m);
Guido van Rossumc0b618a1997-05-02 03:12:38 +000037 return (PyObject *)m;
Guido van Rossumc45611d1993-11-17 22:58:56 +000038
39 fail:
Guido van Rossumc0b618a1997-05-02 03:12:38 +000040 Py_XDECREF(nameobj);
41 Py_DECREF(m);
Guido van Rossumc45611d1993-11-17 22:58:56 +000042 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000043}
44
Guido van Rossumc0b618a1997-05-02 03:12:38 +000045PyObject *
Fred Drakeee238b92000-07-09 06:03:25 +000046PyModule_GetDict(PyObject *m)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000047{
Guido van Rossumcd637aa2002-03-12 20:37:02 +000048 PyObject *d;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000049 if (!PyModule_Check(m)) {
50 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000051 return NULL;
52 }
Guido van Rossumcd637aa2002-03-12 20:37:02 +000053 d = ((PyModuleObject *)m) -> md_dict;
54 if (d == NULL)
55 ((PyModuleObject *)m) -> md_dict = d = PyDict_New();
56 return d;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000057}
58
Guido van Rossum0558a201990-10-26 15:00:11 +000059char *
Fred Drakeee238b92000-07-09 06:03:25 +000060PyModule_GetName(PyObject *m)
Guido van Rossum0558a201990-10-26 15:00:11 +000061{
Guido van Rossumcd637aa2002-03-12 20:37:02 +000062 PyObject *d;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000063 PyObject *nameobj;
64 if (!PyModule_Check(m)) {
65 PyErr_BadArgument();
Guido van Rossum0558a201990-10-26 15:00:11 +000066 return NULL;
67 }
Guido van Rossumcd637aa2002-03-12 20:37:02 +000068 d = ((PyModuleObject *)m)->md_dict;
69 if (d == NULL ||
70 (nameobj = PyDict_GetItemString(d, "__name__")) == NULL ||
Gregory P. Smithdd96db62008-06-09 04:58:54 +000071 !PyString_Check(nameobj))
Guido van Rossumcd637aa2002-03-12 20:37:02 +000072 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000073 PyErr_SetString(PyExc_SystemError, "nameless module");
Guido van Rossumc45611d1993-11-17 22:58:56 +000074 return NULL;
75 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +000076 return PyString_AsString(nameobj);
Guido van Rossum0558a201990-10-26 15:00:11 +000077}
78
Guido van Rossum98cc19f1999-02-15 14:47:16 +000079char *
Fred Drakeee238b92000-07-09 06:03:25 +000080PyModule_GetFilename(PyObject *m)
Guido van Rossum98cc19f1999-02-15 14:47:16 +000081{
Guido van Rossumcd637aa2002-03-12 20:37:02 +000082 PyObject *d;
Guido van Rossum98cc19f1999-02-15 14:47:16 +000083 PyObject *fileobj;
84 if (!PyModule_Check(m)) {
85 PyErr_BadArgument();
86 return NULL;
87 }
Guido van Rossumcd637aa2002-03-12 20:37:02 +000088 d = ((PyModuleObject *)m)->md_dict;
89 if (d == NULL ||
90 (fileobj = PyDict_GetItemString(d, "__file__")) == NULL ||
Gregory P. Smithdd96db62008-06-09 04:58:54 +000091 !PyString_Check(fileobj))
Guido van Rossumcd637aa2002-03-12 20:37:02 +000092 {
Guido van Rossum98cc19f1999-02-15 14:47:16 +000093 PyErr_SetString(PyExc_SystemError, "module filename missing");
94 return NULL;
95 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +000096 return PyString_AsString(fileobj);
Guido van Rossum98cc19f1999-02-15 14:47:16 +000097}
98
Guido van Rossumf1dc0611998-02-19 20:51:52 +000099void
Fred Drakeee238b92000-07-09 06:03:25 +0000100_PyModule_Clear(PyObject *m)
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000101{
102 /* To make the execution order of destructors for global
103 objects a bit more predictable, we first zap all objects
104 whose name starts with a single underscore, before we clear
105 the entire dictionary. We zap them by replacing them with
106 None, rather than deleting them from the dictionary, to
107 avoid rehashing the dictionary (to some extent). */
108
Martin v. Löwis18e16552006-02-15 17:27:45 +0000109 Py_ssize_t pos;
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000110 PyObject *key, *value;
111 PyObject *d;
112
113 d = ((PyModuleObject *)m)->md_dict;
Guido van Rossumcd637aa2002-03-12 20:37:02 +0000114 if (d == NULL)
115 return;
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000116
117 /* First, clear only names starting with a single underscore */
118 pos = 0;
119 while (PyDict_Next(d, &pos, &key, &value)) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000120 if (value != Py_None && PyString_Check(key)) {
121 char *s = PyString_AsString(key);
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000122 if (s[0] == '_' && s[1] != '_') {
123 if (Py_VerboseFlag > 1)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000124 PySys_WriteStderr("# clear[1] %s\n", s);
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000125 PyDict_SetItem(d, key, Py_None);
126 }
127 }
128 }
129
130 /* Next, clear all names except for __builtins__ */
131 pos = 0;
132 while (PyDict_Next(d, &pos, &key, &value)) {
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000133 if (value != Py_None && PyString_Check(key)) {
134 char *s = PyString_AsString(key);
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000135 if (s[0] != '_' || strcmp(s, "__builtins__") != 0) {
136 if (Py_VerboseFlag > 1)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000137 PySys_WriteStderr("# clear[2] %s\n", s);
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000138 PyDict_SetItem(d, key, Py_None);
139 }
140 }
141 }
142
143 /* Note: we leave __builtins__ in place, so that destructors
144 of non-global objects defined in this module can still use
145 builtins, in particularly 'None'. */
146
147}
148
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000149/* Methods */
150
Tim Peters6d6c1a32001-08-02 04:15:00 +0000151static int
Guido van Rossumc3a787e2002-06-04 05:52:47 +0000152module_init(PyModuleObject *m, PyObject *args, PyObject *kwds)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000153{
Martin v. Löwis15e62742006-02-27 16:46:16 +0000154 static char *kwlist[] = {"name", "doc", NULL};
Guido van Rossumc3a787e2002-06-04 05:52:47 +0000155 PyObject *dict, *name = Py_None, *doc = Py_None;
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000156 if (!PyArg_ParseTupleAndKeywords(args, kwds, "S|O:module.__init__",
157 kwlist, &name, &doc))
Guido van Rossumc3a787e2002-06-04 05:52:47 +0000158 return -1;
159 dict = m->md_dict;
160 if (dict == NULL) {
161 dict = PyDict_New();
162 if (dict == NULL)
163 return -1;
164 m->md_dict = dict;
165 }
166 if (PyDict_SetItemString(dict, "__name__", name) < 0)
167 return -1;
168 if (PyDict_SetItemString(dict, "__doc__", doc) < 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000169 return -1;
170 return 0;
171}
172
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000173static void
Fred Drakeee238b92000-07-09 06:03:25 +0000174module_dealloc(PyModuleObject *m)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000175{
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000176 PyObject_GC_UnTrack(m);
Guido van Rossum27e916f1995-01-26 00:39:00 +0000177 if (m->md_dict != NULL) {
Benjamin Peterson196b0922009-10-15 15:44:46 +0000178 /* If we are the only ones holding a reference, we can clear
179 the dictionary. */
180 if (Py_REFCNT(m->md_dict) == 1)
181 _PyModule_Clear((PyObject *)m);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000182 Py_DECREF(m->md_dict);
Guido van Rossum27e916f1995-01-26 00:39:00 +0000183 }
Christian Heimese93237d2007-12-19 02:37:44 +0000184 Py_TYPE(m)->tp_free((PyObject *)m);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000185}
186
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000187static PyObject *
Fred Drakeee238b92000-07-09 06:03:25 +0000188module_repr(PyModuleObject *m)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000189{
Guido van Rossum98cc19f1999-02-15 14:47:16 +0000190 char *name;
191 char *filename;
Barry Warsaw2907fe62001-08-16 20:39:24 +0000192
Guido van Rossum98cc19f1999-02-15 14:47:16 +0000193 name = PyModule_GetName((PyObject *)m);
Guido van Rossumc45611d1993-11-17 22:58:56 +0000194 if (name == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000195 PyErr_Clear();
Guido van Rossumc45611d1993-11-17 22:58:56 +0000196 name = "?";
197 }
Guido van Rossum98cc19f1999-02-15 14:47:16 +0000198 filename = PyModule_GetFilename((PyObject *)m);
199 if (filename == NULL) {
200 PyErr_Clear();
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000201 return PyString_FromFormat("<module '%s' (built-in)>", name);
Guido van Rossum98cc19f1999-02-15 14:47:16 +0000202 }
Gregory P. Smithdd96db62008-06-09 04:58:54 +0000203 return PyString_FromFormat("<module '%s' from '%s'>", name, filename);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000204}
205
Neil Schemenauer10e31cf2001-01-02 15:58:27 +0000206/* We only need a traverse function, no clear function: If the module
207 is in a cycle, md_dict will be cleared as well, which will break
208 the cycle. */
209static int
210module_traverse(PyModuleObject *m, visitproc visit, void *arg)
211{
Thomas Woutersc6e55062006-04-15 21:47:09 +0000212 Py_VISIT(m->md_dict);
Neil Schemenauer10e31cf2001-01-02 15:58:27 +0000213 return 0;
214}
215
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000216PyDoc_STRVAR(module_doc,
Guido van Rossumed3e09f2002-06-04 06:02:35 +0000217"module(name[, doc])\n\
218\n\
219Create a module object.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000220The name must be a string; the optional doc argument can have any type.");
Guido van Rossumed3e09f2002-06-04 06:02:35 +0000221
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000222PyTypeObject PyModule_Type = {
Martin v. Löwis68192102007-07-21 06:55:02 +0000223 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Tim Petersd85e1022001-05-11 21:51:48 +0000224 "module", /* tp_name */
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000225 sizeof(PyModuleObject), /* tp_size */
Tim Petersd85e1022001-05-11 21:51:48 +0000226 0, /* tp_itemsize */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000227 (destructor)module_dealloc, /* tp_dealloc */
Tim Petersd85e1022001-05-11 21:51:48 +0000228 0, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000229 0, /* tp_getattr */
230 0, /* tp_setattr */
Tim Petersd85e1022001-05-11 21:51:48 +0000231 0, /* tp_compare */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000232 (reprfunc)module_repr, /* tp_repr */
Tim Petersd85e1022001-05-11 21:51:48 +0000233 0, /* tp_as_number */
234 0, /* tp_as_sequence */
235 0, /* tp_as_mapping */
236 0, /* tp_hash */
237 0, /* tp_call */
238 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000239 PyObject_GenericGetAttr, /* tp_getattro */
Neil Schemenauer75552942003-07-16 22:04:11 +0000240 PyObject_GenericSetAttr, /* tp_setattro */
Tim Petersd85e1022001-05-11 21:51:48 +0000241 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000242 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
Tim Peters6d6c1a32001-08-02 04:15:00 +0000243 Py_TPFLAGS_BASETYPE, /* tp_flags */
Guido van Rossumed3e09f2002-06-04 06:02:35 +0000244 module_doc, /* tp_doc */
Tim Petersd85e1022001-05-11 21:51:48 +0000245 (traverseproc)module_traverse, /* tp_traverse */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000246 0, /* tp_clear */
247 0, /* tp_richcompare */
248 0, /* tp_weaklistoffset */
249 0, /* tp_iter */
250 0, /* tp_iternext */
251 0, /* tp_methods */
252 module_members, /* tp_members */
253 0, /* tp_getset */
254 0, /* tp_base */
255 0, /* tp_dict */
256 0, /* tp_descr_get */
257 0, /* tp_descr_set */
258 offsetof(PyModuleObject, md_dict), /* tp_dictoffset */
259 (initproc)module_init, /* tp_init */
260 PyType_GenericAlloc, /* tp_alloc */
261 PyType_GenericNew, /* tp_new */
Neil Schemenauer99b5d282002-04-12 02:44:22 +0000262 PyObject_GC_Del, /* tp_free */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000263};