From 1f900f1f69c93e409595f34a6da9e2b10e331421 Mon Sep 17 00:00:00 2001 From: Amaury Forgeot d'Arc Date: Wed, 2 Jul 2008 22:38:47 +0000 Subject: [PATCH] #3247: get rid of Py_FindMethod Third step: unix-only modules. Really remove the function this time. --- Include/methodobject.h | 10 -------- Modules/_curses_panel.c | 27 +++++++++++++------- Modules/_cursesmodule.c | 27 +++++++++++++------- Modules/_dbmmodule.c | 18 ++++++++------ Modules/_gdbmmodule.c | 15 +++++------ Modules/ossaudiodev.c | 55 +++++++++++++++++++++++++++++++++-------- Modules/xxmodule.c | 12 ++++----- Objects/methodobject.c | 37 --------------------------- 8 files changed, 105 insertions(+), 96 deletions(-) diff --git a/Include/methodobject.h b/Include/methodobject.h index cd1d2655640..81e84ceae4d 100644 --- a/Include/methodobject.h +++ b/Include/methodobject.h @@ -43,8 +43,6 @@ struct PyMethodDef { }; 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 *); @@ -70,14 +68,6 @@ PyAPI_FUNC(PyObject *) PyCFunction_NewEx(PyMethodDef *, 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 */ diff --git a/Modules/_curses_panel.c b/Modules/_curses_panel.c index 867be7d1fcf..26cea8ca45b 100644 --- a/Modules/_curses_panel.c +++ b/Modules/_curses_panel.c @@ -329,12 +329,6 @@ static PyMethodDef PyCursesPanel_Methods[] = { {NULL, NULL} /* sentinel */ }; -static PyObject * -PyCursesPanel_GetAttr(PyCursesPanelObject *self, char *name) -{ - return Py_FindMethod(PyCursesPanel_Methods, (PyObject *)self, name); -} - /* -------------------------------------------------------*/ PyTypeObject PyCursesPanel_Type = { @@ -345,14 +339,28 @@ 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 @@ -470,7 +478,8 @@ PyInit__curses_panel(void) PyObject *m, *d, *v; /* Initialize object type */ - Py_TYPE(&PyCursesPanel_Type) = &PyType_Type; + if (PyType_Ready(&PyCursesPanel_Type) < 0) + return NULL; import_curses(); diff --git a/Modules/_cursesmodule.c b/Modules/_cursesmodule.c index 210cb42a69d..4f99da5af0f 100644 --- a/Modules/_cursesmodule.c +++ b/Modules/_cursesmodule.c @@ -1650,12 +1650,6 @@ static PyMethodDef PyCursesWindow_Methods[] = { {NULL, NULL} /* sentinel */ }; -static PyObject * -PyCursesWindow_GetAttr(PyCursesWindowObject *self, char *name) -{ - return Py_FindMethod(PyCursesWindow_Methods, (PyObject *)self, name); -} - /* -------------------------------------------------------*/ PyTypeObject PyCursesWindow_Type = { @@ -1666,14 +1660,28 @@ 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*/ }; /********************************************************************* @@ -2792,7 +2800,8 @@ PyInit__curses(void) 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; diff --git a/Modules/_dbmmodule.c b/Modules/_dbmmodule.c index 28f4aa79fc2..78eba3648f0 100644 --- a/Modules/_dbmmodule.c +++ b/Modules/_dbmmodule.c @@ -324,12 +324,6 @@ static PyMethodDef dbm_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(NULL, 0) "_dbm.dbm", @@ -337,7 +331,7 @@ static PyTypeObject Dbmtype = { 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*/ @@ -350,7 +344,15 @@ static PyTypeObject Dbmtype = { 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*/ }; /* ----------------------------------------------------------------- */ diff --git a/Modules/_gdbmmodule.c b/Modules/_gdbmmodule.c index b253e20449e..590ef2114ab 100644 --- a/Modules/_gdbmmodule.c +++ b/Modules/_gdbmmodule.c @@ -381,12 +381,6 @@ static PyMethodDef dbm_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", @@ -394,7 +388,7 @@ static PyTypeObject Dbmtype = { 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*/ @@ -409,6 +403,13 @@ static PyTypeObject Dbmtype = { 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*/ }; /* ----------------------------------------------------------------- */ diff --git a/Modules/ossaudiodev.c b/Modules/ossaudiodev.c index 43215b07234..8f66144e66a 100644 --- a/Modules/ossaudiodev.c +++ b/Modules/ossaudiodev.c @@ -803,9 +803,14 @@ static PyMethodDef oss_mixer_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); @@ -829,17 +834,11 @@ oss_getattr(oss_audio_t *self, char *name) } } 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*/ @@ -848,10 +847,28 @@ static PyTypeObject OSSAudioType = { /* 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 = { @@ -862,10 +879,28 @@ 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*/ }; diff --git a/Modules/xxmodule.c b/Modules/xxmodule.c index 34d235448e6..efa97b46eea 100644 --- a/Modules/xxmodule.c +++ b/Modules/xxmodule.c @@ -63,16 +63,16 @@ static PyMethodDef Xxo_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 @@ -104,7 +104,7 @@ static PyTypeObject Xxo_Type = { /* 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*/ @@ -114,7 +114,7 @@ static PyTypeObject Xxo_Type = { 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*/ @@ -125,7 +125,7 @@ static PyTypeObject Xxo_Type = { 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*/ diff --git a/Objects/methodobject.c b/Objects/methodobject.c index 3d208c16736..cb6f1ba86ac 100644 --- a/Objects/methodobject.c +++ b/Objects/methodobject.c @@ -280,43 +280,6 @@ PyTypeObject PyCFunction_Type = { 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