2 /* Module object implementation */
5 #include "structmember.h"
12 static PyMemberDef module_members
[] = {
13 {"__dict__", T_OBJECT
, offsetof(PyModuleObject
, md_dict
), READONLY
},
18 PyModule_New(const char *name
)
22 m
= PyObject_GC_New(PyModuleObject
, &PyModule_Type
);
25 nameobj
= PyString_FromString(name
);
26 m
->md_dict
= PyDict_New();
27 if (m
->md_dict
== NULL
|| nameobj
== NULL
)
29 if (PyDict_SetItemString(m
->md_dict
, "__name__", nameobj
) != 0)
31 if (PyDict_SetItemString(m
->md_dict
, "__doc__", Py_None
) != 0)
33 if (PyDict_SetItemString(m
->md_dict
, "__package__", Py_None
) != 0)
46 PyModule_GetDict(PyObject
*m
)
49 if (!PyModule_Check(m
)) {
50 PyErr_BadInternalCall();
53 d
= ((PyModuleObject
*)m
) -> md_dict
;
55 ((PyModuleObject
*)m
) -> md_dict
= d
= PyDict_New();
60 PyModule_GetName(PyObject
*m
)
64 if (!PyModule_Check(m
)) {
68 d
= ((PyModuleObject
*)m
)->md_dict
;
70 (nameobj
= PyDict_GetItemString(d
, "__name__")) == NULL
||
71 !PyString_Check(nameobj
))
73 PyErr_SetString(PyExc_SystemError
, "nameless module");
76 return PyString_AsString(nameobj
);
80 PyModule_GetFilename(PyObject
*m
)
84 if (!PyModule_Check(m
)) {
88 d
= ((PyModuleObject
*)m
)->md_dict
;
90 (fileobj
= PyDict_GetItemString(d
, "__file__")) == NULL
||
91 !PyString_Check(fileobj
))
93 PyErr_SetString(PyExc_SystemError
, "module filename missing");
96 return PyString_AsString(fileobj
);
100 _PyModule_Clear(PyObject
*m
)
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). */
110 PyObject
*key
, *value
;
113 d
= ((PyModuleObject
*)m
)->md_dict
;
117 /* First, clear only names starting with a single underscore */
119 while (PyDict_Next(d
, &pos
, &key
, &value
)) {
120 if (value
!= Py_None
&& PyString_Check(key
)) {
121 char *s
= PyString_AsString(key
);
122 if (s
[0] == '_' && s
[1] != '_') {
123 if (Py_VerboseFlag
> 1)
124 PySys_WriteStderr("# clear[1] %s\n", s
);
125 if (PyDict_SetItem(d
, key
, Py_None
) != 0)
131 /* Next, clear all names except for __builtins__ */
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] != '_' || strcmp(s
, "__builtins__") != 0) {
137 if (Py_VerboseFlag
> 1)
138 PySys_WriteStderr("# clear[2] %s\n", s
);
139 if (PyDict_SetItem(d
, key
, Py_None
) != 0)
145 /* Note: we leave __builtins__ in place, so that destructors
146 of non-global objects defined in this module can still use
147 builtins, in particularly 'None'. */
154 module_init(PyModuleObject
*m
, PyObject
*args
, PyObject
*kwds
)
156 static char *kwlist
[] = {"name", "doc", NULL
};
157 PyObject
*dict
, *name
= Py_None
, *doc
= Py_None
;
158 if (!PyArg_ParseTupleAndKeywords(args
, kwds
, "S|O:module.__init__",
159 kwlist
, &name
, &doc
))
168 if (PyDict_SetItemString(dict
, "__name__", name
) < 0)
170 if (PyDict_SetItemString(dict
, "__doc__", doc
) < 0)
176 module_dealloc(PyModuleObject
*m
)
178 PyObject_GC_UnTrack(m
);
179 if (m
->md_dict
!= NULL
) {
180 _PyModule_Clear((PyObject
*)m
);
181 Py_DECREF(m
->md_dict
);
183 Py_TYPE(m
)->tp_free((PyObject
*)m
);
187 module_repr(PyModuleObject
*m
)
192 name
= PyModule_GetName((PyObject
*)m
);
197 filename
= PyModule_GetFilename((PyObject
*)m
);
198 if (filename
== NULL
) {
200 return PyString_FromFormat("<module '%s' (built-in)>", name
);
202 return PyString_FromFormat("<module '%s' from '%s'>", name
, filename
);
205 /* We only need a traverse function, no clear function: If the module
206 is in a cycle, md_dict will be cleared as well, which will break
209 module_traverse(PyModuleObject
*m
, visitproc visit
, void *arg
)
211 Py_VISIT(m
->md_dict
);
215 PyDoc_STRVAR(module_doc
,
216 "module(name[, doc])\n\
218 Create a module object.\n\
219 The name must be a string; the optional doc argument can have any type.");
221 PyTypeObject PyModule_Type
= {
222 PyVarObject_HEAD_INIT(&PyType_Type
, 0)
223 "module", /* tp_name */
224 sizeof(PyModuleObject
), /* tp_size */
226 (destructor
)module_dealloc
, /* tp_dealloc */
231 (reprfunc
)module_repr
, /* tp_repr */
232 0, /* tp_as_number */
233 0, /* tp_as_sequence */
234 0, /* tp_as_mapping */
238 PyObject_GenericGetAttr
, /* tp_getattro */
239 PyObject_GenericSetAttr
, /* tp_setattro */
240 0, /* tp_as_buffer */
241 Py_TPFLAGS_DEFAULT
| Py_TPFLAGS_HAVE_GC
|
242 Py_TPFLAGS_BASETYPE
, /* tp_flags */
243 module_doc
, /* tp_doc */
244 (traverseproc
)module_traverse
, /* tp_traverse */
246 0, /* tp_richcompare */
247 0, /* tp_weaklistoffset */
251 module_members
, /* tp_members */
255 0, /* tp_descr_get */
256 0, /* tp_descr_set */
257 offsetof(PyModuleObject
, md_dict
), /* tp_dictoffset */
258 (initproc
)module_init
, /* tp_init */
259 PyType_GenericAlloc
, /* tp_alloc */
260 PyType_GenericNew
, /* tp_new */
261 PyObject_GC_Del
, /* tp_free */