]> granicus.if.org Git - python/commitdiff
#3247: get rid of Py_FindMethod
authorAmaury Forgeot d'Arc <amauryfa@gmail.com>
Wed, 2 Jul 2008 22:38:47 +0000 (22:38 +0000)
committerAmaury Forgeot d'Arc <amauryfa@gmail.com>
Wed, 2 Jul 2008 22:38:47 +0000 (22:38 +0000)
Third step: unix-only modules. Really remove the function this time.

Include/methodobject.h
Modules/_curses_panel.c
Modules/_cursesmodule.c
Modules/_dbmmodule.c
Modules/_gdbmmodule.c
Modules/ossaudiodev.c
Modules/xxmodule.c
Objects/methodobject.c

index cd1d2655640fdb7922aa859b0e5149ead648af4d..81e84ceae4d4150bd36ab7508be02558143219bf 100644 (file)
@@ -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 */
index 867be7d1fcf31593ff58fef531b5d2eeb438202f..26cea8ca45bf3bde77f1b65899b47dabec10e910 100644 (file)
@@ -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();
 
index 210cb42a69d357271a3a8a68fd69da418013f5ba..4f99da5af0f8ea0859251eebfa057333875696bb 100644 (file)
@@ -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;
index 28f4aa79fc21d37c3bfc366865f89688da0239e2..78eba3648f0361a01de10fe8937c11b694e521e7 100644 (file)
@@ -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*/
 };
 
 /* ----------------------------------------------------------------- */
index b253e20449e4cdd4ccf6b6bb2f1830f1f352b6a4..590ef2114abef3acc9c0043739c79f6462b9cc6c 100644 (file)
@@ -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*/
 };
 
 /* ----------------------------------------------------------------- */
index 43215b07234e31976bdad33b441f9d174d8e9627..8f66144e66abd094ffec86fad6a7ee7e175d9baf 100644 (file)
@@ -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*/
 };
 
 
index 34d235448e62abf02fb0a2e6a5c0c5f920517af5..efa97b46eea11f0b7741ae94d42b859bc80a0d85 100644 (file)
@@ -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*/
index 3d208c16736f020fd249ebd58a246a0cebb55008..cb6f1ba86acbb40d4d15cc10b55a8f9bfce92c77 100644 (file)
@@ -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