blob: feac861b5cc3ecd27e6ea397dd61798b55009aeb [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
Martin v. Löwis1a214512008-06-11 05:26:20 +00007static Py_ssize_t max_module_number;
8
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00009typedef struct {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000010 PyObject_HEAD
11 PyObject *md_dict;
Martin v. Löwis1a214512008-06-11 05:26:20 +000012 struct PyModuleDef *md_def;
13 void *md_state;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000014} PyModuleObject;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000015
Neil Schemenauerf23473f2001-10-21 22:28:58 +000016static PyMemberDef module_members[] = {
Tim Peters6d6c1a32001-08-02 04:15:00 +000017 {"__dict__", T_OBJECT, offsetof(PyModuleObject, md_dict), READONLY},
18 {0}
19};
20
Martin v. Löwis1a214512008-06-11 05:26:20 +000021static PyTypeObject moduledef_type = {
22 PyVarObject_HEAD_INIT(&PyType_Type, 0)
23 "moduledef", /* tp_name */
24 sizeof(struct PyModuleDef), /* tp_size */
25 0, /* tp_itemsize */
26};
27
28
Guido van Rossumc0b618a1997-05-02 03:12:38 +000029PyObject *
Jeremy Hyltonaf68c872005-12-10 18:50:16 +000030PyModule_New(const char *name)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000031{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000032 PyModuleObject *m;
33 PyObject *nameobj;
Neil Schemenauere83c00e2001-08-29 23:54:21 +000034 m = PyObject_GC_New(PyModuleObject, &PyModule_Type);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000035 if (m == NULL)
36 return NULL;
Martin v. Löwis1a214512008-06-11 05:26:20 +000037 m->md_def = NULL;
38 m->md_state = NULL;
Martin v. Löwis5b222132007-06-10 09:51:05 +000039 nameobj = PyUnicode_FromString(name);
Guido van Rossumc0b618a1997-05-02 03:12:38 +000040 m->md_dict = PyDict_New();
Guido van Rossumc45611d1993-11-17 22:58:56 +000041 if (m->md_dict == NULL || nameobj == NULL)
42 goto fail;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000043 if (PyDict_SetItemString(m->md_dict, "__name__", nameobj) != 0)
Guido van Rossumc45611d1993-11-17 22:58:56 +000044 goto fail;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000045 if (PyDict_SetItemString(m->md_dict, "__doc__", Py_None) != 0)
Guido van Rossum8b14b4c1995-01-07 11:59:29 +000046 goto fail;
Christian Heimescbf3b5c2007-12-03 21:02:03 +000047 if (PyDict_SetItemString(m->md_dict, "__package__", Py_None) != 0)
48 goto fail;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000049 Py_DECREF(nameobj);
Neil Schemenauere83c00e2001-08-29 23:54:21 +000050 PyObject_GC_Track(m);
Guido van Rossumc0b618a1997-05-02 03:12:38 +000051 return (PyObject *)m;
Guido van Rossumc45611d1993-11-17 22:58:56 +000052
53 fail:
Guido van Rossumc0b618a1997-05-02 03:12:38 +000054 Py_XDECREF(nameobj);
55 Py_DECREF(m);
Guido van Rossumc45611d1993-11-17 22:58:56 +000056 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000057}
58
Martin v. Löwis1a214512008-06-11 05:26:20 +000059static char api_version_warning[] =
60"Python C API version mismatch for module %.100s:\
61 This Python has API version %d, module %.100s has version %d.";
62
63PyObject *
64PyModule_Create2(struct PyModuleDef* module, int module_api_version)
65{
66 PyObject *d, *v, *n;
67 PyMethodDef *ml;
68 const char* name;
69 PyModuleObject *m;
70 if (!Py_IsInitialized())
71 Py_FatalError("Interpreter not initialized (version mismatch?)");
72 if (PyType_Ready(&moduledef_type) < 0)
73 return NULL;
74 if (module->m_base.m_index == 0) {
75 max_module_number++;
76 Py_REFCNT(module) = 1;
77 Py_TYPE(module) = &moduledef_type;
78 module->m_base.m_index = max_module_number;
79 }
80 name = module->m_name;
81 if (module_api_version != PYTHON_API_VERSION) {
82 char message[512];
83 PyOS_snprintf(message, sizeof(message),
84 api_version_warning, name,
85 PYTHON_API_VERSION, name,
86 module_api_version);
87 if (PyErr_WarnEx(PyExc_RuntimeWarning, message, 1))
88 return NULL;
89 }
90 /* Make sure name is fully qualified.
91
92 This is a bit of a hack: when the shared library is loaded,
93 the module name is "package.module", but the module calls
Georg Brandl574b1272009-01-02 19:20:26 +000094 PyModule_Create*() with just "module" for the name. The shared
Martin v. Löwis1a214512008-06-11 05:26:20 +000095 library loader squirrels away the true name of the module in
Georg Brandl574b1272009-01-02 19:20:26 +000096 _Py_PackageContext, and PyModule_Create*() will substitute this
Martin v. Löwis1a214512008-06-11 05:26:20 +000097 (if the name actually matches).
98 */
99 if (_Py_PackageContext != NULL) {
100 char *p = strrchr(_Py_PackageContext, '.');
101 if (p != NULL && strcmp(module->m_name, p+1) == 0) {
102 name = _Py_PackageContext;
103 _Py_PackageContext = NULL;
104 }
105 }
106 if ((m = (PyModuleObject*)PyModule_New(name)) == NULL)
107 return NULL;
108
109 if (module->m_size > 0) {
110 m->md_state = PyMem_MALLOC(module->m_size);
111 if (!m->md_state) {
112 PyErr_NoMemory();
113 Py_DECREF(m);
114 return NULL;
115 }
Martin v. Löwis4e0630c2008-10-07 13:16:28 +0000116 memset(m->md_state, 0, module->m_size);
Martin v. Löwis1a214512008-06-11 05:26:20 +0000117 }
118
119 d = PyModule_GetDict((PyObject*)m);
120 if (module->m_methods != NULL) {
121 n = PyUnicode_FromString(name);
122 if (n == NULL)
123 return NULL;
124 for (ml = module->m_methods; ml->ml_name != NULL; ml++) {
125 if ((ml->ml_flags & METH_CLASS) ||
126 (ml->ml_flags & METH_STATIC)) {
127 PyErr_SetString(PyExc_ValueError,
128 "module functions cannot set"
129 " METH_CLASS or METH_STATIC");
130 Py_DECREF(n);
131 return NULL;
132 }
133 v = PyCFunction_NewEx(ml, (PyObject*)m, n);
134 if (v == NULL) {
135 Py_DECREF(n);
136 return NULL;
137 }
138 if (PyDict_SetItemString(d, ml->ml_name, v) != 0) {
139 Py_DECREF(v);
140 Py_DECREF(n);
141 return NULL;
142 }
143 Py_DECREF(v);
144 }
145 Py_DECREF(n);
146 }
147 if (module->m_doc != NULL) {
148 v = PyUnicode_FromString(module->m_doc);
149 if (v == NULL || PyDict_SetItemString(d, "__doc__", v) != 0) {
150 Py_XDECREF(v);
151 return NULL;
152 }
153 Py_DECREF(v);
154 }
155 m->md_def = module;
156 return (PyObject*)m;
157}
158
159
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000160PyObject *
Fred Drakeee238b92000-07-09 06:03:25 +0000161PyModule_GetDict(PyObject *m)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000162{
Guido van Rossumcd637aa2002-03-12 20:37:02 +0000163 PyObject *d;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000164 if (!PyModule_Check(m)) {
165 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000166 return NULL;
167 }
Guido van Rossumcd637aa2002-03-12 20:37:02 +0000168 d = ((PyModuleObject *)m) -> md_dict;
169 if (d == NULL)
170 ((PyModuleObject *)m) -> md_dict = d = PyDict_New();
171 return d;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000172}
173
Neal Norwitz312e10d2007-08-26 02:21:42 +0000174const char *
Fred Drakeee238b92000-07-09 06:03:25 +0000175PyModule_GetName(PyObject *m)
Guido van Rossum0558a201990-10-26 15:00:11 +0000176{
Guido van Rossumcd637aa2002-03-12 20:37:02 +0000177 PyObject *d;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000178 PyObject *nameobj;
179 if (!PyModule_Check(m)) {
180 PyErr_BadArgument();
Guido van Rossum0558a201990-10-26 15:00:11 +0000181 return NULL;
182 }
Guido van Rossumcd637aa2002-03-12 20:37:02 +0000183 d = ((PyModuleObject *)m)->md_dict;
184 if (d == NULL ||
185 (nameobj = PyDict_GetItemString(d, "__name__")) == NULL ||
Neal Norwitzed2b7392007-08-26 04:51:10 +0000186 !PyUnicode_Check(nameobj))
Guido van Rossumcd637aa2002-03-12 20:37:02 +0000187 {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000188 PyErr_SetString(PyExc_SystemError, "nameless module");
Guido van Rossumc45611d1993-11-17 22:58:56 +0000189 return NULL;
190 }
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +0000191 return _PyUnicode_AsString(nameobj);
Guido van Rossum0558a201990-10-26 15:00:11 +0000192}
193
Victor Stinner8124feb2010-05-07 00:50:12 +0000194static PyObject*
195module_getfilename(PyObject *m)
Guido van Rossum98cc19f1999-02-15 14:47:16 +0000196{
Guido van Rossumcd637aa2002-03-12 20:37:02 +0000197 PyObject *d;
Guido van Rossum98cc19f1999-02-15 14:47:16 +0000198 PyObject *fileobj;
199 if (!PyModule_Check(m)) {
200 PyErr_BadArgument();
201 return NULL;
202 }
Guido van Rossumcd637aa2002-03-12 20:37:02 +0000203 d = ((PyModuleObject *)m)->md_dict;
204 if (d == NULL ||
205 (fileobj = PyDict_GetItemString(d, "__file__")) == NULL ||
Guido van Rossum00bc0e02007-10-15 02:52:41 +0000206 !PyUnicode_Check(fileobj))
Guido van Rossumcd637aa2002-03-12 20:37:02 +0000207 {
Guido van Rossum98cc19f1999-02-15 14:47:16 +0000208 PyErr_SetString(PyExc_SystemError, "module filename missing");
209 return NULL;
210 }
Victor Stinner8124feb2010-05-07 00:50:12 +0000211 return fileobj;
212}
213
214const char *
215PyModule_GetFilename(PyObject *m)
216{
217 PyObject *fileobj;
218 fileobj = module_getfilename(m);
219 if (fileobj == NULL)
220 return NULL;
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +0000221 return _PyUnicode_AsString(fileobj);
Guido van Rossum98cc19f1999-02-15 14:47:16 +0000222}
223
Martin v. Löwis1a214512008-06-11 05:26:20 +0000224PyModuleDef*
225PyModule_GetDef(PyObject* m)
226{
227 if (!PyModule_Check(m)) {
228 PyErr_BadArgument();
229 return NULL;
230 }
231 return ((PyModuleObject *)m)->md_def;
232}
233
234void*
235PyModule_GetState(PyObject* m)
236{
237 if (!PyModule_Check(m)) {
238 PyErr_BadArgument();
239 return NULL;
240 }
241 return ((PyModuleObject *)m)->md_state;
242}
243
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000244void
Fred Drakeee238b92000-07-09 06:03:25 +0000245_PyModule_Clear(PyObject *m)
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000246{
247 /* To make the execution order of destructors for global
248 objects a bit more predictable, we first zap all objects
249 whose name starts with a single underscore, before we clear
250 the entire dictionary. We zap them by replacing them with
251 None, rather than deleting them from the dictionary, to
252 avoid rehashing the dictionary (to some extent). */
253
Martin v. Löwis18e16552006-02-15 17:27:45 +0000254 Py_ssize_t pos;
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000255 PyObject *key, *value;
256 PyObject *d;
257
258 d = ((PyModuleObject *)m)->md_dict;
Guido van Rossumcd637aa2002-03-12 20:37:02 +0000259 if (d == NULL)
260 return;
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000261
262 /* First, clear only names starting with a single underscore */
263 pos = 0;
264 while (PyDict_Next(d, &pos, &key, &value)) {
Neal Norwitz312e10d2007-08-26 02:21:42 +0000265 if (value != Py_None && PyUnicode_Check(key)) {
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +0000266 const char *s = _PyUnicode_AsString(key);
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000267 if (s[0] == '_' && s[1] != '_') {
268 if (Py_VerboseFlag > 1)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000269 PySys_WriteStderr("# clear[1] %s\n", s);
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000270 PyDict_SetItem(d, key, Py_None);
271 }
272 }
273 }
274
275 /* Next, clear all names except for __builtins__ */
276 pos = 0;
277 while (PyDict_Next(d, &pos, &key, &value)) {
Neal Norwitz312e10d2007-08-26 02:21:42 +0000278 if (value != Py_None && PyUnicode_Check(key)) {
Marc-André Lemburg4cc0f242008-08-07 18:54:33 +0000279 const char *s = _PyUnicode_AsString(key);
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000280 if (s[0] != '_' || strcmp(s, "__builtins__") != 0) {
281 if (Py_VerboseFlag > 1)
Guido van Rossum2f3667a1998-10-12 18:23:55 +0000282 PySys_WriteStderr("# clear[2] %s\n", s);
Guido van Rossumf1dc0611998-02-19 20:51:52 +0000283 PyDict_SetItem(d, key, Py_None);
284 }
285 }
286 }
287
288 /* Note: we leave __builtins__ in place, so that destructors
289 of non-global objects defined in this module can still use
290 builtins, in particularly 'None'. */
291
292}
293
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000294/* Methods */
295
Tim Peters6d6c1a32001-08-02 04:15:00 +0000296static int
Guido van Rossumc3a787e2002-06-04 05:52:47 +0000297module_init(PyModuleObject *m, PyObject *args, PyObject *kwds)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000298{
Martin v. Löwis15e62742006-02-27 16:46:16 +0000299 static char *kwlist[] = {"name", "doc", NULL};
Guido van Rossumc3a787e2002-06-04 05:52:47 +0000300 PyObject *dict, *name = Py_None, *doc = Py_None;
Guido van Rossum98297ee2007-11-06 21:34:58 +0000301 if (!PyArg_ParseTupleAndKeywords(args, kwds, "U|O:module.__init__",
Jeremy Hyltonaf68c872005-12-10 18:50:16 +0000302 kwlist, &name, &doc))
Guido van Rossumc3a787e2002-06-04 05:52:47 +0000303 return -1;
304 dict = m->md_dict;
305 if (dict == NULL) {
306 dict = PyDict_New();
307 if (dict == NULL)
308 return -1;
309 m->md_dict = dict;
310 }
311 if (PyDict_SetItemString(dict, "__name__", name) < 0)
312 return -1;
313 if (PyDict_SetItemString(dict, "__doc__", doc) < 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000314 return -1;
315 return 0;
316}
317
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000318static void
Fred Drakeee238b92000-07-09 06:03:25 +0000319module_dealloc(PyModuleObject *m)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000320{
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000321 PyObject_GC_UnTrack(m);
Martin v. Löwis1a214512008-06-11 05:26:20 +0000322 if (m->md_def && m->md_def->m_free)
323 m->md_def->m_free(m);
Guido van Rossum27e916f1995-01-26 00:39:00 +0000324 if (m->md_dict != NULL) {
Benjamin Petersona0dfa822009-11-13 02:25:08 +0000325 /* If we are the only ones holding a reference, we can clear
326 the dictionary. */
327 if (Py_REFCNT(m->md_dict) == 1)
328 _PyModule_Clear((PyObject *)m);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000329 Py_DECREF(m->md_dict);
Guido van Rossum27e916f1995-01-26 00:39:00 +0000330 }
Antoine Pitroue4bc7f62009-01-17 21:06:43 +0000331 if (m->md_state != NULL)
332 PyMem_FREE(m->md_state);
Christian Heimes90aa7642007-12-19 02:45:37 +0000333 Py_TYPE(m)->tp_free((PyObject *)m);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000334}
335
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000336static PyObject *
Fred Drakeee238b92000-07-09 06:03:25 +0000337module_repr(PyModuleObject *m)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000338{
Neal Norwitz312e10d2007-08-26 02:21:42 +0000339 const char *name;
Victor Stinner8124feb2010-05-07 00:50:12 +0000340 PyObject *filename;
Barry Warsaw2907fe62001-08-16 20:39:24 +0000341
Guido van Rossum98cc19f1999-02-15 14:47:16 +0000342 name = PyModule_GetName((PyObject *)m);
Guido van Rossumc45611d1993-11-17 22:58:56 +0000343 if (name == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000344 PyErr_Clear();
Guido van Rossumc45611d1993-11-17 22:58:56 +0000345 name = "?";
346 }
Victor Stinner8124feb2010-05-07 00:50:12 +0000347 filename = module_getfilename((PyObject *)m);
Guido van Rossum98cc19f1999-02-15 14:47:16 +0000348 if (filename == NULL) {
349 PyErr_Clear();
Walter Dörwald1ab83302007-05-18 17:15:44 +0000350 return PyUnicode_FromFormat("<module '%s' (built-in)>", name);
Guido van Rossum98cc19f1999-02-15 14:47:16 +0000351 }
Victor Stinner8124feb2010-05-07 00:50:12 +0000352 return PyUnicode_FromFormat("<module '%s' from '%U'>", name, filename);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000353}
354
Neil Schemenauer10e31cf2001-01-02 15:58:27 +0000355static int
356module_traverse(PyModuleObject *m, visitproc visit, void *arg)
357{
Martin v. Löwis1a214512008-06-11 05:26:20 +0000358 if (m->md_def && m->md_def->m_traverse) {
359 int res = m->md_def->m_traverse((PyObject*)m, visit, arg);
360 if (res)
361 return res;
362 }
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000363 Py_VISIT(m->md_dict);
Neil Schemenauer10e31cf2001-01-02 15:58:27 +0000364 return 0;
365}
366
Martin v. Löwis1a214512008-06-11 05:26:20 +0000367static int
368module_clear(PyModuleObject *m)
369{
370 if (m->md_def && m->md_def->m_clear) {
371 int res = m->md_def->m_clear((PyObject*)m);
372 if (res)
373 return res;
374 }
375 Py_CLEAR(m->md_dict);
376 return 0;
377}
378
379
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000380PyDoc_STRVAR(module_doc,
Guido van Rossumed3e09f2002-06-04 06:02:35 +0000381"module(name[, doc])\n\
382\n\
383Create a module object.\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000384The name must be a string; the optional doc argument can have any type.");
Guido van Rossumed3e09f2002-06-04 06:02:35 +0000385
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000386PyTypeObject PyModule_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +0000387 PyVarObject_HEAD_INIT(&PyType_Type, 0)
Tim Petersd85e1022001-05-11 21:51:48 +0000388 "module", /* tp_name */
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000389 sizeof(PyModuleObject), /* tp_size */
Tim Petersd85e1022001-05-11 21:51:48 +0000390 0, /* tp_itemsize */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000391 (destructor)module_dealloc, /* tp_dealloc */
Tim Petersd85e1022001-05-11 21:51:48 +0000392 0, /* tp_print */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000393 0, /* tp_getattr */
394 0, /* tp_setattr */
Mark Dickinsone94c6792009-02-02 20:36:42 +0000395 0, /* tp_reserved */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000396 (reprfunc)module_repr, /* tp_repr */
Tim Petersd85e1022001-05-11 21:51:48 +0000397 0, /* tp_as_number */
398 0, /* tp_as_sequence */
399 0, /* tp_as_mapping */
400 0, /* tp_hash */
401 0, /* tp_call */
402 0, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000403 PyObject_GenericGetAttr, /* tp_getattro */
Neil Schemenauer75552942003-07-16 22:04:11 +0000404 PyObject_GenericSetAttr, /* tp_setattro */
Tim Petersd85e1022001-05-11 21:51:48 +0000405 0, /* tp_as_buffer */
Neil Schemenauere83c00e2001-08-29 23:54:21 +0000406 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
Tim Peters6d6c1a32001-08-02 04:15:00 +0000407 Py_TPFLAGS_BASETYPE, /* tp_flags */
Guido van Rossumed3e09f2002-06-04 06:02:35 +0000408 module_doc, /* tp_doc */
Tim Petersd85e1022001-05-11 21:51:48 +0000409 (traverseproc)module_traverse, /* tp_traverse */
Martin v. Löwis1a214512008-06-11 05:26:20 +0000410 (inquiry)module_clear, /* tp_clear */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000411 0, /* tp_richcompare */
412 0, /* tp_weaklistoffset */
413 0, /* tp_iter */
414 0, /* tp_iternext */
415 0, /* tp_methods */
416 module_members, /* tp_members */
417 0, /* tp_getset */
418 0, /* tp_base */
419 0, /* tp_dict */
420 0, /* tp_descr_get */
421 0, /* tp_descr_set */
422 offsetof(PyModuleObject, md_dict), /* tp_dictoffset */
423 (initproc)module_init, /* tp_init */
424 PyType_GenericAlloc, /* tp_alloc */
425 PyType_GenericNew, /* tp_new */
Neil Schemenauer99b5d282002-04-12 02:44:22 +0000426 PyObject_GC_Del, /* tp_free */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000427};