]> granicus.if.org Git - python/commitdiff
Oops, forgot that there are modules outside the win32 world.
authorAmaury Forgeot d'Arc <amauryfa@gmail.com>
Wed, 2 Jul 2008 21:47:18 +0000 (21:47 +0000)
committerAmaury Forgeot d'Arc <amauryfa@gmail.com>
Wed, 2 Jul 2008 21:47:18 +0000 (21:47 +0000)
Include/methodobject.h
Objects/methodobject.c

index 81e84ceae4d4150bd36ab7508be02558143219bf..cd1d2655640fdb7922aa859b0e5149ead648af4d 100644 (file)
@@ -43,6 +43,8 @@ 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 *);
@@ -68,6 +70,14 @@ 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 cb6f1ba86acbb40d4d15cc10b55a8f9bfce92c77..3d208c16736f020fd249ebd58a246a0cebb55008 100644 (file)
@@ -280,6 +280,43 @@ 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