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)
44 PyModule_GetDict(PyObject
*m
)
47 if (!PyModule_Check(m
)) {
48 PyErr_BadInternalCall();
51 d
= ((PyModuleObject
*)m
) -> md_dict
;
53 ((PyModuleObject
*)m
) -> md_dict
= d
= PyDict_New();
58 PyModule_GetName(PyObject
*m
)
62 if (!PyModule_Check(m
)) {
66 d
= ((PyModuleObject
*)m
)->md_dict
;
68 (nameobj
= PyDict_GetItemString(d
, "__name__")) == NULL
||
69 !PyString_Check(nameobj
))
71 PyErr_SetString(PyExc_SystemError
, "nameless module");
74 return PyString_AsString(nameobj
);
78 PyModule_GetFilename(PyObject
*m
)
82 if (!PyModule_Check(m
)) {
86 d
= ((PyModuleObject
*)m
)->md_dict
;
88 (fileobj
= PyDict_GetItemString(d
, "__file__")) == NULL
||
89 !PyString_Check(fileobj
))
91 PyErr_SetString(PyExc_SystemError
, "module filename missing");
94 return PyString_AsString(fileobj
);
98 _PyModule_Clear(PyObject
*m
)
100 /* To make the execution order of destructors for global
101 objects a bit more predictable, we first zap all objects
102 whose name starts with a single underscore, before we clear
103 the entire dictionary. We zap them by replacing them with
104 None, rather than deleting them from the dictionary, to
105 avoid rehashing the dictionary (to some extent). */
108 PyObject
*key
, *value
;
111 d
= ((PyModuleObject
*)m
)->md_dict
;
115 /* First, clear only names starting with a single underscore */
117 while (PyDict_Next(d
, &pos
, &key
, &value
)) {
118 if (value
!= Py_None
&& PyString_Check(key
)) {
119 char *s
= PyString_AsString(key
);
120 if (s
[0] == '_' && s
[1] != '_') {
121 if (Py_VerboseFlag
> 1)
122 PySys_WriteStderr("# clear[1] %s\n", s
);
123 PyDict_SetItem(d
, key
, Py_None
);
128 /* Next, clear all names except for __builtins__ */
130 while (PyDict_Next(d
, &pos
, &key
, &value
)) {
131 if (value
!= Py_None
&& PyString_Check(key
)) {
132 char *s
= PyString_AsString(key
);
133 if (s
[0] != '_' || strcmp(s
, "__builtins__") != 0) {
134 if (Py_VerboseFlag
> 1)
135 PySys_WriteStderr("# clear[2] %s\n", s
);
136 PyDict_SetItem(d
, key
, Py_None
);
141 /* Note: we leave __builtins__ in place, so that destructors
142 of non-global objects defined in this module can still use
143 builtins, in particularly 'None'. */
150 module_init(PyModuleObject
*m
, PyObject
*args
, PyObject
*kwds
)
152 static const char *kwlist
[] = {"name", "doc", NULL
};
153 PyObject
*dict
, *name
= Py_None
, *doc
= Py_None
;
154 if (!PyArg_ParseTupleAndKeywords(args
, kwds
, "S|O:module.__init__",
155 kwlist
, &name
, &doc
))
164 if (PyDict_SetItemString(dict
, "__name__", name
) < 0)
166 if (PyDict_SetItemString(dict
, "__doc__", doc
) < 0)
172 module_dealloc(PyModuleObject
*m
)
174 PyObject_GC_UnTrack(m
);
175 if (m
->md_dict
!= NULL
) {
176 _PyModule_Clear((PyObject
*)m
);
177 Py_DECREF(m
->md_dict
);
179 m
->ob_type
->tp_free((PyObject
*)m
);
183 module_repr(PyModuleObject
*m
)
188 name
= PyModule_GetName((PyObject
*)m
);
193 filename
= PyModule_GetFilename((PyObject
*)m
);
194 if (filename
== NULL
) {
196 return PyString_FromFormat("<module '%s' (built-in)>", name
);
198 return PyString_FromFormat("<module '%s' from '%s'>", name
, filename
);
201 /* We only need a traverse function, no clear function: If the module
202 is in a cycle, md_dict will be cleared as well, which will break
205 module_traverse(PyModuleObject
*m
, visitproc visit
, void *arg
)
207 if (m
->md_dict
!= NULL
)
208 return visit(m
->md_dict
, arg
);
212 PyDoc_STRVAR(module_doc
,
213 "module(name[, doc])\n\
215 Create a module object.\n\
216 The name must be a string; the optional doc argument can have any type.");
218 PyTypeObject PyModule_Type
= {
219 PyObject_HEAD_INIT(&PyType_Type
)
221 "module", /* tp_name */
222 sizeof(PyModuleObject
), /* tp_size */
224 (destructor
)module_dealloc
, /* tp_dealloc */
229 (reprfunc
)module_repr
, /* tp_repr */
230 0, /* tp_as_number */
231 0, /* tp_as_sequence */
232 0, /* tp_as_mapping */
236 PyObject_GenericGetAttr
, /* tp_getattro */
237 PyObject_GenericSetAttr
, /* tp_setattro */
238 0, /* tp_as_buffer */
239 Py_TPFLAGS_DEFAULT
| Py_TPFLAGS_HAVE_GC
|
240 Py_TPFLAGS_BASETYPE
, /* tp_flags */
241 module_doc
, /* tp_doc */
242 (traverseproc
)module_traverse
, /* tp_traverse */
244 0, /* tp_richcompare */
245 0, /* tp_weaklistoffset */
249 module_members
, /* tp_members */
253 0, /* tp_descr_get */
254 0, /* tp_descr_set */
255 offsetof(PyModuleObject
, md_dict
), /* tp_dictoffset */
256 (initproc
)module_init
, /* tp_init */
257 PyType_GenericAlloc
, /* tp_alloc */
258 PyType_GenericNew
, /* tp_new */
259 PyObject_GC_Del
, /* tp_free */