source: vendor/python/2.5/Objects/moduleobject.c@ 3225

Last change on this file since 3225 was 3225, checked in by bird, 19 years ago

Python 2.5

File size: 6.2 KB
Line 
1
2/* Module object implementation */
3
4#include "Python.h"
5#include "structmember.h"
6
7typedef struct {
8 PyObject_HEAD
9 PyObject *md_dict;
10} PyModuleObject;
11
12static PyMemberDef module_members[] = {
13 {"__dict__", T_OBJECT, offsetof(PyModuleObject, md_dict), READONLY},
14 {0}
15};
16
17PyObject *
18PyModule_New(const char *name)
19{
20 PyModuleObject *m;
21 PyObject *nameobj;
22 m = PyObject_GC_New(PyModuleObject, &PyModule_Type);
23 if (m == NULL)
24 return NULL;
25 nameobj = PyString_FromString(name);
26 m->md_dict = PyDict_New();
27 if (m->md_dict == NULL || nameobj == NULL)
28 goto fail;
29 if (PyDict_SetItemString(m->md_dict, "__name__", nameobj) != 0)
30 goto fail;
31 if (PyDict_SetItemString(m->md_dict, "__doc__", Py_None) != 0)
32 goto fail;
33 Py_DECREF(nameobj);
34 PyObject_GC_Track(m);
35 return (PyObject *)m;
36
37 fail:
38 Py_XDECREF(nameobj);
39 Py_DECREF(m);
40 return NULL;
41}
42
43PyObject *
44PyModule_GetDict(PyObject *m)
45{
46 PyObject *d;
47 if (!PyModule_Check(m)) {
48 PyErr_BadInternalCall();
49 return NULL;
50 }
51 d = ((PyModuleObject *)m) -> md_dict;
52 if (d == NULL)
53 ((PyModuleObject *)m) -> md_dict = d = PyDict_New();
54 return d;
55}
56
57char *
58PyModule_GetName(PyObject *m)
59{
60 PyObject *d;
61 PyObject *nameobj;
62 if (!PyModule_Check(m)) {
63 PyErr_BadArgument();
64 return NULL;
65 }
66 d = ((PyModuleObject *)m)->md_dict;
67 if (d == NULL ||
68 (nameobj = PyDict_GetItemString(d, "__name__")) == NULL ||
69 !PyString_Check(nameobj))
70 {
71 PyErr_SetString(PyExc_SystemError, "nameless module");
72 return NULL;
73 }
74 return PyString_AsString(nameobj);
75}
76
77char *
78PyModule_GetFilename(PyObject *m)
79{
80 PyObject *d;
81 PyObject *fileobj;
82 if (!PyModule_Check(m)) {
83 PyErr_BadArgument();
84 return NULL;
85 }
86 d = ((PyModuleObject *)m)->md_dict;
87 if (d == NULL ||
88 (fileobj = PyDict_GetItemString(d, "__file__")) == NULL ||
89 !PyString_Check(fileobj))
90 {
91 PyErr_SetString(PyExc_SystemError, "module filename missing");
92 return NULL;
93 }
94 return PyString_AsString(fileobj);
95}
96
97void
98_PyModule_Clear(PyObject *m)
99{
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). */
106
107 Py_ssize_t pos;
108 PyObject *key, *value;
109 PyObject *d;
110
111 d = ((PyModuleObject *)m)->md_dict;
112 if (d == NULL)
113 return;
114
115 /* First, clear only names starting with a single underscore */
116 pos = 0;
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);
124 }
125 }
126 }
127
128 /* Next, clear all names except for __builtins__ */
129 pos = 0;
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);
137 }
138 }
139 }
140
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'. */
144
145}
146
147/* Methods */
148
149static int
150module_init(PyModuleObject *m, PyObject *args, PyObject *kwds)
151{
152 static 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))
156 return -1;
157 dict = m->md_dict;