| 
									
										
										
										
											2001-08-02 04:15:00 +00:00
										 |  |  | #include "Python.h"
 | 
					
						
							| 
									
										
										
										
											2001-08-15 18:09:11 +00:00
										 |  |  | #include "structmember.h"
 | 
					
						
							| 
									
										
										
										
											2001-08-02 04:15:00 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-06-13 20:33:02 +00:00
										 |  |  | PyDoc_STRVAR(xxsubtype__doc__, | 
					
						
							| 
									
										
										
										
											2001-12-10 22:53:30 +00:00
										 |  |  | "xxsubtype is an example module showing how to subtype builtin types from C.\n" | 
					
						
							|  |  |  | "test_descr.py in the standard test suite requires it in order to complete.\n" | 
					
						
							|  |  |  | "If you don't care about the examples, and don't intend to run the Python\n" | 
					
						
							| 
									
										
										
										
											2002-06-13 20:33:02 +00:00
										 |  |  | "test suite, you can recompile Python without Modules/xxsubtype.c."); | 
					
						
							| 
									
										
										
										
											2001-08-02 04:15:00 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-12-17 01:27:01 +00:00
										 |  |  | /* We link this module statically for convenience.  If compiled as a shared
 | 
					
						
							|  |  |  |    library instead, some compilers don't allow addresses of Python objects | 
					
						
							|  |  |  |    defined in other libraries to be used in static initializers here.  The | 
					
						
							|  |  |  |    DEFERRED_ADDRESS macro is used to tag the slots where such addresses | 
					
						
							|  |  |  |    appear; the module init function must fill in the tagged slots at runtime. | 
					
						
							|  |  |  |    The argument is for documentation -- the macro ignores it. | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | #define DEFERRED_ADDRESS(ADDR) 0
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-08-02 04:15:00 +00:00
										 |  |  | /* spamlist -- a list subtype */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef struct { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     PyListObject list; | 
					
						
							|  |  |  |     int state; | 
					
						
							| 
									
										
										
										
											2001-08-02 04:15:00 +00:00
										 |  |  | } spamlistobject; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyObject * | 
					
						
							|  |  |  | spamlist_getstate(spamlistobject *self, PyObject *args) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     if (!PyArg_ParseTuple(args, ":getstate")) | 
					
						
							|  |  |  |         return NULL; | 
					
						
							|  |  |  |     return PyLong_FromLong(self->state); | 
					
						
							| 
									
										
										
										
											2001-08-02 04:15:00 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyObject * | 
					
						
							|  |  |  | spamlist_setstate(spamlistobject *self, PyObject *args) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     int state; | 
					
						
							| 
									
										
										
										
											2001-08-02 04:15:00 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     if (!PyArg_ParseTuple(args, "i:setstate", &state)) | 
					
						
							|  |  |  |         return NULL; | 
					
						
							|  |  |  |     self->state = state; | 
					
						
							|  |  |  |     Py_INCREF(Py_None); | 
					
						
							|  |  |  |     return Py_None; | 
					
						
							| 
									
										
										
										
											2001-08-02 04:15:00 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-03-28 15:49:54 +00:00
										 |  |  | static PyObject * | 
					
						
							|  |  |  | spamlist_specialmeth(PyObject *self, PyObject *args, PyObject *kw) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     PyObject *result = PyTuple_New(3); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (result != NULL) { | 
					
						
							|  |  |  |         if (self == NULL) | 
					
						
							|  |  |  |             self = Py_None; | 
					
						
							|  |  |  |         if (kw == NULL) | 
					
						
							|  |  |  |             kw = Py_None; | 
					
						
							|  |  |  |         Py_INCREF(self); | 
					
						
							|  |  |  |         PyTuple_SET_ITEM(result, 0, self); | 
					
						
							|  |  |  |         Py_INCREF(args); | 
					
						
							|  |  |  |         PyTuple_SET_ITEM(result, 1, args); | 
					
						
							|  |  |  |         Py_INCREF(kw); | 
					
						
							|  |  |  |         PyTuple_SET_ITEM(result, 2, kw); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return result; | 
					
						
							| 
									
										
										
										
											2002-03-28 15:49:54 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-08-02 04:15:00 +00:00
										 |  |  | static PyMethodDef spamlist_methods[] = { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     {"getstate", (PyCFunction)spamlist_getstate, METH_VARARGS, | 
					
						
							|  |  |  |         PyDoc_STR("getstate() -> state")}, | 
					
						
							|  |  |  |     {"setstate", (PyCFunction)spamlist_setstate, METH_VARARGS, | 
					
						
							|  |  |  |         PyDoc_STR("setstate(state)")}, | 
					
						
							|  |  |  |     /* These entries differ only in the flags; they are used by the tests
 | 
					
						
							|  |  |  |        in test.test_descr. */ | 
					
						
							|  |  |  |     {"classmeth", (PyCFunction)spamlist_specialmeth, | 
					
						
							|  |  |  |         METH_VARARGS | METH_KEYWORDS | METH_CLASS, | 
					
						
							|  |  |  |         PyDoc_STR("classmeth(*args, **kw)")}, | 
					
						
							|  |  |  |     {"staticmeth", (PyCFunction)spamlist_specialmeth, | 
					
						
							|  |  |  |         METH_VARARGS | METH_KEYWORDS | METH_STATIC, | 
					
						
							|  |  |  |         PyDoc_STR("staticmeth(*args, **kw)")}, | 
					
						
							|  |  |  |     {NULL,      NULL}, | 
					
						
							| 
									
										
										
										
											2001-08-02 04:15:00 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int | 
					
						
							|  |  |  | spamlist_init(spamlistobject *self, PyObject *args, PyObject *kwds) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     if (PyList_Type.tp_init((PyObject *)self, args, kwds) < 0) | 
					
						
							|  |  |  |         return -1; | 
					
						
							|  |  |  |     self->state = 0; | 
					
						
							|  |  |  |     return 0; | 
					
						
							| 
									
										
										
										
											2001-08-02 04:15:00 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-08-15 18:18:58 +00:00
										 |  |  | static PyObject * | 
					
						
							|  |  |  | spamlist_state_get(spamlistobject *self) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     return PyLong_FromLong(self->state); | 
					
						
							| 
									
										
										
										
											2001-08-15 18:18:58 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-09-20 21:45:26 +00:00
										 |  |  | static PyGetSetDef spamlist_getsets[] = { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     {"state", (getter)spamlist_state_get, NULL, | 
					
						
							|  |  |  |      PyDoc_STR("an int variable for demonstration purposes")}, | 
					
						
							|  |  |  |     {0} | 
					
						
							| 
									
										
										
										
											2001-08-15 18:18:58 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-08-02 04:15:00 +00:00
										 |  |  | static PyTypeObject spamlist_type = { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     PyVarObject_HEAD_INIT(DEFERRED_ADDRESS(&PyType_Type), 0) | 
					
						
							|  |  |  |     "xxsubtype.spamlist", | 
					
						
							|  |  |  |     sizeof(spamlistobject), | 
					
						
							|  |  |  |     0, | 
					
						
							|  |  |  |     0,                                          /* tp_dealloc */ | 
					
						
							|  |  |  |     0,                                          /* tp_print */ | 
					
						
							|  |  |  |     0,                                          /* tp_getattr */ | 
					
						
							|  |  |  |     0,                                          /* tp_setattr */ | 
					
						
							|  |  |  |     0,                                          /* tp_reserved */ | 
					
						
							|  |  |  |     0,                                          /* tp_repr */ | 
					
						
							|  |  |  |     0,                                          /* tp_as_number */ | 
					
						
							|  |  |  |     0,                                          /* tp_as_sequence */ | 
					
						
							|  |  |  |     0,                                          /* tp_as_mapping */ | 
					
						
							|  |  |  |     0,                                          /* tp_hash */ | 
					
						
							|  |  |  |     0,                                          /* tp_call */ | 
					
						
							|  |  |  |     0,                                          /* tp_str */ | 
					
						
							|  |  |  |     0,                                          /* tp_getattro */ | 
					
						
							|  |  |  |     0,                                          /* tp_setattro */ | 
					
						
							|  |  |  |     0,                                          /* tp_as_buffer */ | 
					
						
							|  |  |  |     Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ | 
					
						
							|  |  |  |     0,                                          /* tp_doc */ | 
					
						
							|  |  |  |     0,                                          /* tp_traverse */ | 
					
						
							|  |  |  |     0,                                          /* tp_clear */ | 
					
						
							|  |  |  |     0,                                          /* tp_richcompare */ | 
					
						
							|  |  |  |     0,                                          /* tp_weaklistoffset */ | 
					
						
							|  |  |  |     0,                                          /* tp_iter */ | 
					
						
							|  |  |  |     0,                                          /* tp_iternext */ | 
					
						
							|  |  |  |     spamlist_methods,                           /* tp_methods */ | 
					
						
							|  |  |  |     0,                                          /* tp_members */ | 
					
						
							|  |  |  |     spamlist_getsets,                           /* tp_getset */ | 
					
						
							|  |  |  |     DEFERRED_ADDRESS(&PyList_Type),             /* tp_base */ | 
					
						
							|  |  |  |     0,                                          /* tp_dict */ | 
					
						
							|  |  |  |     0,                                          /* tp_descr_get */ | 
					
						
							|  |  |  |     0,                                          /* tp_descr_set */ | 
					
						
							|  |  |  |     0,                                          /* tp_dictoffset */ | 
					
						
							|  |  |  |     (initproc)spamlist_init,                    /* tp_init */ | 
					
						
							|  |  |  |     0,                                          /* tp_alloc */ | 
					
						
							|  |  |  |     0,                                          /* tp_new */ | 
					
						
							| 
									
										
										
										
											2001-08-02 04:15:00 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* spamdict -- a dict subtype */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef struct { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     PyDictObject dict; | 
					
						
							|  |  |  |     int state; | 
					
						
							| 
									
										
										
										
											2001-08-02 04:15:00 +00:00
										 |  |  | } spamdictobject; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyObject * | 
					
						
							|  |  |  | spamdict_getstate(spamdictobject *self, PyObject *args) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     if (!PyArg_ParseTuple(args, ":getstate")) | 
					
						
							|  |  |  |         return NULL; | 
					
						
							|  |  |  |     return PyLong_FromLong(self->state); | 
					
						
							| 
									
										
										
										
											2001-08-02 04:15:00 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyObject * | 
					
						
							|  |  |  | spamdict_setstate(spamdictobject *self, PyObject *args) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     int state; | 
					
						
							| 
									
										
										
										
											2001-08-02 04:15:00 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     if (!PyArg_ParseTuple(args, "i:setstate", &state)) | 
					
						
							|  |  |  |         return NULL; | 
					
						
							|  |  |  |     self->state = state; | 
					
						
							|  |  |  |     Py_INCREF(Py_None); | 
					
						
							|  |  |  |     return Py_None; | 
					
						
							| 
									
										
										
										
											2001-08-02 04:15:00 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyMethodDef spamdict_methods[] = { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     {"getstate", (PyCFunction)spamdict_getstate, METH_VARARGS, | 
					
						
							|  |  |  |         PyDoc_STR("getstate() -> state")}, | 
					
						
							|  |  |  |     {"setstate", (PyCFunction)spamdict_setstate, METH_VARARGS, | 
					
						
							|  |  |  |         PyDoc_STR("setstate(state)")}, | 
					
						
							|  |  |  |     {NULL,      NULL}, | 
					
						
							| 
									
										
										
										
											2001-08-02 04:15:00 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int | 
					
						
							|  |  |  | spamdict_init(spamdictobject *self, PyObject *args, PyObject *kwds) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     if (PyDict_Type.tp_init((PyObject *)self, args, kwds) < 0) | 
					
						
							|  |  |  |         return -1; | 
					
						
							|  |  |  |     self->state = 0; | 
					
						
							|  |  |  |     return 0; | 
					
						
							| 
									
										
										
										
											2001-08-02 04:15:00 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-09-20 20:46:19 +00:00
										 |  |  | static PyMemberDef spamdict_members[] = { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     {"state", T_INT, offsetof(spamdictobject, state), READONLY, | 
					
						
							|  |  |  |      PyDoc_STR("an int variable for demonstration purposes")}, | 
					
						
							|  |  |  |     {0} | 
					
						
							| 
									
										
										
										
											2001-08-15 18:09:11 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-08-02 04:15:00 +00:00
										 |  |  | static PyTypeObject spamdict_type = { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     PyVarObject_HEAD_INIT(DEFERRED_ADDRESS(&PyType_Type), 0) | 
					
						
							|  |  |  |     "xxsubtype.spamdict", | 
					
						
							|  |  |  |     sizeof(spamdictobject), | 
					
						
							|  |  |  |     0, | 
					
						
							|  |  |  |     0,                                          /* tp_dealloc */ | 
					
						
							|  |  |  |     0,                                          /* tp_print */ | 
					
						
							|  |  |  |     0,                                          /* tp_getattr */ | 
					
						
							|  |  |  |     0,                                          /* tp_setattr */ | 
					
						
							|  |  |  |     0,                                          /* tp_reserved */ | 
					
						
							|  |  |  |     0,                                          /* tp_repr */ | 
					
						
							|  |  |  |     0,                                          /* tp_as_number */ | 
					
						
							|  |  |  |     0,                                          /* tp_as_sequence */ | 
					
						
							|  |  |  |     0,                                          /* tp_as_mapping */ | 
					
						
							|  |  |  |     0,                                          /* tp_hash */ | 
					
						
							|  |  |  |     0,                                          /* tp_call */ | 
					
						
							|  |  |  |     0,                                          /* tp_str */ | 
					
						
							|  |  |  |     0,                                          /* tp_getattro */ | 
					
						
							|  |  |  |     0,                                          /* tp_setattro */ | 
					
						
							|  |  |  |     0,                                          /* tp_as_buffer */ | 
					
						
							|  |  |  |     Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */ | 
					
						
							|  |  |  |     0,                                          /* tp_doc */ | 
					
						
							|  |  |  |     0,                                          /* tp_traverse */ | 
					
						
							|  |  |  |     0,                                          /* tp_clear */ | 
					
						
							|  |  |  |     0,                                          /* tp_richcompare */ | 
					
						
							|  |  |  |     0,                                          /* tp_weaklistoffset */ | 
					
						
							|  |  |  |     0,                                          /* tp_iter */ | 
					
						
							|  |  |  |     0,                                          /* tp_iternext */ | 
					
						
							|  |  |  |     spamdict_methods,                           /* tp_methods */ | 
					
						
							|  |  |  |     spamdict_members,                           /* tp_members */ | 
					
						
							|  |  |  |     0,                                          /* tp_getset */ | 
					
						
							|  |  |  |     DEFERRED_ADDRESS(&PyDict_Type),             /* tp_base */ | 
					
						
							|  |  |  |     0,                                          /* tp_dict */ | 
					
						
							|  |  |  |     0,                                          /* tp_descr_get */ | 
					
						
							|  |  |  |     0,                                          /* tp_descr_set */ | 
					
						
							|  |  |  |     0,                                          /* tp_dictoffset */ | 
					
						
							|  |  |  |     (initproc)spamdict_init,                    /* tp_init */ | 
					
						
							|  |  |  |     0,                                          /* tp_alloc */ | 
					
						
							|  |  |  |     0,                                          /* tp_new */ | 
					
						
							| 
									
										
										
										
											2001-08-02 04:15:00 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-10-21 22:26:43 +00:00
										 |  |  | static PyObject * | 
					
						
							| 
									
										
										
										
											2001-08-02 04:15:00 +00:00
										 |  |  | spam_bench(PyObject *self, PyObject *args) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     PyObject *obj, *name, *res; | 
					
						
							|  |  |  |     int n = 1000; | 
					
						
							|  |  |  |     time_t t0, t1; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (!PyArg_ParseTuple(args, "OS|i", &obj, &name, &n)) | 
					
						
							|  |  |  |         return NULL; | 
					
						
							|  |  |  |     t0 = clock(); | 
					
						
							|  |  |  |     while (--n >= 0) { | 
					
						
							|  |  |  |         res = PyObject_GetAttr(obj, name); | 
					
						
							|  |  |  |         if (res == NULL) | 
					
						
							|  |  |  |             return NULL; | 
					
						
							|  |  |  |         Py_DECREF(res); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     t1 = clock(); | 
					
						
							|  |  |  |     return PyFloat_FromDouble((double)(t1-t0) / CLOCKS_PER_SEC); | 
					
						
							| 
									
										
										
										
											2001-08-02 04:15:00 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyMethodDef xxsubtype_functions[] = { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     {"bench",           spam_bench,     METH_VARARGS}, | 
					
						
							|  |  |  |     {NULL,              NULL}           /* sentinel */ | 
					
						
							| 
									
										
										
										
											2001-08-02 04:15:00 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-11 05:26:20 +00:00
										 |  |  | static struct PyModuleDef xxsubtypemodule = { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     PyModuleDef_HEAD_INIT, | 
					
						
							|  |  |  |     "xxsubtype", | 
					
						
							|  |  |  |     xxsubtype__doc__, | 
					
						
							|  |  |  |     -1, | 
					
						
							|  |  |  |     xxsubtype_functions, | 
					
						
							|  |  |  |     NULL, | 
					
						
							|  |  |  |     NULL, | 
					
						
							|  |  |  |     NULL, | 
					
						
							|  |  |  |     NULL | 
					
						
							| 
									
										
										
										
											2008-06-11 05:26:20 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-08-02 02:27:13 +00:00
										 |  |  | PyMODINIT_FUNC | 
					
						
							| 
									
										
										
										
											2008-06-11 05:26:20 +00:00
										 |  |  | PyInit_xxsubtype(void) | 
					
						
							| 
									
										
										
										
											2001-08-02 04:15:00 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-05-09 15:52:27 +00:00
										 |  |  |     PyObject *m; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* Fill in deferred data addresses.  This must be done before
 | 
					
						
							|  |  |  |        PyType_Ready() is called.  Note that PyType_Ready() automatically | 
					
						
							|  |  |  |        initializes the ob.ob_type field to &PyType_Type if it's NULL, | 
					
						
							|  |  |  |        so it's not necessary to fill in ob_type first. */ | 
					
						
							|  |  |  |     spamdict_type.tp_base = &PyDict_Type; | 
					
						
							|  |  |  |     if (PyType_Ready(&spamdict_type) < 0) | 
					
						
							|  |  |  |         return NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     spamlist_type.tp_base = &PyList_Type; | 
					
						
							|  |  |  |     if (PyType_Ready(&spamlist_type) < 0) | 
					
						
							|  |  |  |         return NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     m = PyModule_Create(&xxsubtypemodule); | 
					
						
							|  |  |  |     if (m == NULL) | 
					
						
							|  |  |  |         return NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (PyType_Ready(&spamlist_type) < 0) | 
					
						
							|  |  |  |         return NULL; | 
					
						
							|  |  |  |     if (PyType_Ready(&spamdict_type) < 0) | 
					
						
							|  |  |  |         return NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Py_INCREF(&spamlist_type); | 
					
						
							|  |  |  |     if (PyModule_AddObject(m, "spamlist", | 
					
						
							|  |  |  |                            (PyObject *) &spamlist_type) < 0) | 
					
						
							|  |  |  |         return NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Py_INCREF(&spamdict_type); | 
					
						
							|  |  |  |     if (PyModule_AddObject(m, "spamdict", | 
					
						
							|  |  |  |                            (PyObject *) &spamdict_type) < 0) | 
					
						
							|  |  |  |         return NULL; | 
					
						
							|  |  |  |     return m; | 
					
						
							| 
									
										
										
										
											2001-08-02 04:15:00 +00:00
										 |  |  | } |