Third step: unix-only modules. Really remove the function this time.
};
typedef struct PyMethodDef PyMethodDef;
-PyAPI_FUNC(PyObject *) Py_FindMethod(PyMethodDef[], PyObject *, const char *);
-
#define PyCFunction_New(ML, SELF) PyCFunction_NewEx((ML), (SELF), NULL)
PyAPI_FUNC(PyObject *) PyCFunction_NewEx(PyMethodDef *, PyObject *,
PyObject *);
#define METH_COEXIST 0x0040
-typedef struct PyMethodChain {
- PyMethodDef *methods; /* Methods of this type */
- struct PyMethodChain *link; /* NULL or base type */
-} PyMethodChain;
-
-PyAPI_FUNC(PyObject *) Py_FindMethodInChain(PyMethodChain *, PyObject *,
- const char *);
-
typedef struct {
PyObject_HEAD
PyMethodDef *m_ml; /* Description of the C function to call */
{NULL, NULL} /* sentinel */
};
-static PyObject *
-PyCursesPanel_GetAttr(PyCursesPanelObject *self, char *name)
-{
- return Py_FindMethod(PyCursesPanel_Methods, (PyObject *)self, name);
-}
-
/* -------------------------------------------------------*/
PyTypeObject PyCursesPanel_Type = {
/* methods */
(destructor)PyCursesPanel_Dealloc, /*tp_dealloc*/
0, /*tp_print*/
- (getattrfunc)PyCursesPanel_GetAttr, /*tp_getattr*/
- (setattrfunc)0, /*tp_setattr*/
+ 0, /*tp_getattr*/
+ 0, /*tp_setattr*/
0, /*tp_compare*/
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, /*tp_flags*/
+ 0, /*tp_doc*/
+ 0, /*tp_traverse*/
+ 0, /*tp_clear*/
+ 0, /*tp_richcompare*/
+ 0, /*tp_weaklistoffset*/
+ 0, /*tp_iter*/
+ 0, /*tp_iternext*/
+ PyCursesPanel_Methods, /*tp_methods*/
};
/* Wrapper for panel_above(NULL). This function returns the bottom
PyObject *m, *d, *v;
/* Initialize object type */
- Py_TYPE(&PyCursesPanel_Type) = &PyType_Type;
+ if (PyType_Ready(&PyCursesPanel_Type) < 0)
+ return NULL;
import_curses();
{NULL, NULL} /* sentinel */
};
-static PyObject *
-PyCursesWindow_GetAttr(PyCursesWindowObject *self, char *name)
-{
- return Py_FindMethod(PyCursesWindow_Methods, (PyObject *)self, name);
-}
-
/* -------------------------------------------------------*/
PyTypeObject PyCursesWindow_Type = {
/* methods */
(destructor)PyCursesWindow_Dealloc, /*tp_dealloc*/
0, /*tp_print*/
- (getattrfunc)PyCursesWindow_GetAttr, /*tp_getattr*/
- (setattrfunc)0, /*tp_setattr*/
+ (getattrfunc)0, /*tp_getattr*/
+ (setattrfunc)0, /*tp_setattr*/
0, /*tp_compare*/
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, /*tp_flags*/
+ 0, /*tp_doc*/
+ 0, /*tp_traverse*/
+ 0, /*tp_clear*/
+ 0, /*tp_richcompare*/
+ 0, /*tp_weaklistoffset*/
+ 0, /*tp_iter*/
+ 0, /*tp_iternext*/
+ PyCursesWindow_Methods, /*tp_methods*/
};
/*********************************************************************
static void *PyCurses_API[PyCurses_API_pointers];
/* Initialize object type */
- Py_TYPE(&PyCursesWindow_Type) = &PyType_Type;
+ if (PyType_Ready(&PyCursesWindow_Type) < 0)
+ return NULL;
/* Initialize the C API pointer array */
PyCurses_API[0] = (void *)&PyCursesWindow_Type;
{NULL, NULL} /* sentinel */
};
-static PyObject *
-dbm_getattr(dbmobject *dp, char *name)
-{
- return Py_FindMethod(dbm_methods, (PyObject *)dp, name);
-}
-
static PyTypeObject Dbmtype = {
PyVarObject_HEAD_INIT(NULL, 0)
"_dbm.dbm",
0,
(destructor)dbm_dealloc, /*tp_dealloc*/
0, /*tp_print*/
- (getattrfunc)dbm_getattr, /*tp_getattr*/
+ 0, /*tp_getattr*/
0, /*tp_setattr*/
0, /*tp_compare*/
0, /*tp_repr*/
0, /*tp_getattro*/
0, /*tp_setattro*/
0, /*tp_as_buffer*/
- Py_TPFLAGS_DEFAULT, /*tp_xxx4*/
+ Py_TPFLAGS_DEFAULT, /*tp_flags*/
+ 0, /*tp_doc*/
+ 0, /*tp_traverse*/
+ 0, /*tp_clear*/
+ 0, /*tp_richcompare*/
+ 0, /*tp_weaklistoffset*/
+ 0, /*tp_iter*/
+ 0, /*tp_iternext*/
+ dbm_methods, /*tp_methods*/
};
/* ----------------------------------------------------------------- */
{NULL, NULL} /* sentinel */
};
-static PyObject *
-dbm_getattr(dbmobject *dp, char *name)
-{
- return Py_FindMethod(dbm_methods, (PyObject *)dp, name);
-}
-
static PyTypeObject Dbmtype = {
PyVarObject_HEAD_INIT(0, 0)
"_gdbm.gdbm",
0,
(destructor)dbm_dealloc, /*tp_dealloc*/
0, /*tp_print*/
- (getattrfunc)dbm_getattr, /*tp_getattr*/
+ 0, /*tp_getattr*/
0, /*tp_setattr*/
0, /*tp_compare*/
0, /*tp_repr*/
0, /*tp_as_buffer*/
Py_TPFLAGS_DEFAULT, /*tp_xxx4*/
gdbm_object__doc__, /*tp_doc*/
+ 0, /*tp_traverse*/
+ 0, /*tp_clear*/
+ 0, /*tp_richcompare*/
+ 0, /*tp_weaklistoffset*/
+ 0, /*tp_iter*/
+ 0, /*tp_iternext*/
+ dbm_methods, /*tp_methods*/
};
/* ----------------------------------------------------------------- */
};
static PyObject *
-oss_getattr(oss_audio_t *self, char *name)
+oss_getattro(oss_audio_t *self, PyObject *nameobj)
{
+ char *name = "";
PyObject * rval = NULL;
+
+ if (PyUnicode_Check(nameobj))
+ name = PyUnicode_AsString(nameobj);
+
if (strcmp(name, "closed") == 0) {
rval = (self->fd == -1) ? Py_True : Py_False;
Py_INCREF(rval);
}
}
else {
- rval = Py_FindMethod(oss_methods, (PyObject *)self, name);
+ rval = PyObject_GenericGetAttr((PyObject *)self, nameobj);
}
return rval;
}
-static PyObject *
-oss_mixer_getattr(oss_mixer_t *self, char *name)
-{
- return Py_FindMethod(oss_mixer_methods, (PyObject *)self, name);
-}
-
static PyTypeObject OSSAudioType = {
PyVarObject_HEAD_INIT(&PyType_Type, 0)
"ossaudiodev.oss_audio_device", /*tp_name*/
/* methods */
(destructor)oss_dealloc, /*tp_dealloc*/
0, /*tp_print*/
- (getattrfunc)oss_getattr, /*tp_getattr*/
+ 0, /*tp_getattr*/
0, /*tp_setattr*/
0, /*tp_compare*/
0, /*tp_repr*/
+ 0, /*tp_as_number*/
+ 0, /*tp_as_sequence*/
+ 0, /*tp_as_mapping*/
+ 0, /*tp_hash*/
+ 0, /*tp_call*/
+ 0, /*tp_str*/
+ (getattrofunc)oss_getattro, /*tp_getattro*/
+ 0, /*tp_setattro*/
+ 0, /*tp_as_buffer*/
+ Py_TPFLAGS_DEFAULT, /*tp_flags*/
+ 0, /*tp_doc*/
+ 0, /*tp_traverse*/
+ 0, /*tp_clear*/
+ 0, /*tp_richcompare*/
+ 0, /*tp_weaklistoffset*/
+ 0, /*tp_iter*/
+ 0, /*tp_iternext*/
+ oss_methods, /*tp_methods*/
};
static PyTypeObject OSSMixerType = {
/* methods */
(destructor)oss_mixer_dealloc, /*tp_dealloc*/
0, /*tp_print*/
- (getattrfunc)oss_mixer_getattr, /*tp_getattr*/
+ 0, /*tp_getattr*/
0, /*tp_setattr*/
0, /*tp_compare*/
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, /*tp_flags*/
+ 0, /*tp_doc*/
+ 0, /*tp_traverse*/
+ 0, /*tp_clear*/
+ 0, /*tp_richcompare*/
+ 0, /*tp_weaklistoffset*/
+ 0, /*tp_iter*/
+ 0, /*tp_iternext*/
+ oss_mixer_methods, /*tp_methods*/
};
};
static PyObject *
-Xxo_getattr(XxoObject *self, char *name)
+Xxo_getattro(XxoObject *self, PyObject *name)
{
if (self->x_attr != NULL) {
- PyObject *v = PyDict_GetItemString(self->x_attr, name);
+ PyObject *v = PyDict_GetItem(self->x_attr, name);
if (v != NULL) {
Py_INCREF(v);
return v;
}
}
- return Py_FindMethod(Xxo_methods, (PyObject *)self, name);
+ return PyObject_GenericGetattr((PyObject *)self, name);
}
static int
/* methods */
(destructor)Xxo_dealloc, /*tp_dealloc*/
0, /*tp_print*/
- (getattrfunc)Xxo_getattr, /*tp_getattr*/
+ (getattrfunc)0, /*tp_getattr*/
(setattrfunc)Xxo_setattr, /*tp_setattr*/
0, /*tp_compare*/
0, /*tp_repr*/
0, /*tp_hash*/
0, /*tp_call*/
0, /*tp_str*/
- 0, /*tp_getattro*/
+ (getattrofunc)Xxo_getattro, /*tp_getattro*/
0, /*tp_setattro*/
0, /*tp_as_buffer*/
Py_TPFLAGS_DEFAULT, /*tp_flags*/
0, /*tp_weaklistoffset*/
0, /*tp_iter*/
0, /*tp_iternext*/
- 0, /*tp_methods*/
+ Xxo_methods, /*tp_methods*/
0, /*tp_members*/
0, /*tp_getset*/
0, /*tp_base*/
0, /* tp_dict */
};
-/* Find a method in a method chain */
-
-PyObject *
-Py_FindMethodInChain(PyMethodChain *chain, PyObject *self, const char *name)
-{
- if (name[0] == '_' && name[1] == '_') {
- if (strcmp(name, "__doc__") == 0) {
- const char *doc = self->ob_type->tp_doc;
- if (doc != NULL)
- return PyUnicode_FromString(doc);
- }
- }
- while (chain != NULL) {
- PyMethodDef *ml = chain->methods;
- for (; ml->ml_name != NULL; ml++) {
- if (name[0] == ml->ml_name[0] &&
- strcmp(name+1, ml->ml_name+1) == 0)
- /* XXX */
- return PyCFunction_New(ml, self);
- }
- chain = chain->link;
- }
- PyErr_SetString(PyExc_AttributeError, name);
- return NULL;
-}
-
-/* Find a method in a single method list */
-
-PyObject *
-Py_FindMethod(PyMethodDef *methods, PyObject *self, const char *name)
-{
- PyMethodChain chain;
- chain.methods = methods;
- chain.link = NULL;
- return Py_FindMethodInChain(&chain, self, name);
-}
-
/* Clear out the free list */
int