summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAmaury Forgeot d'Arc <amauryfa@gmail.com>2008-07-02 21:47:18 (GMT)
committerAmaury Forgeot d'Arc <amauryfa@gmail.com>2008-07-02 21:47:18 (GMT)
commit55b69e794c16d9ec201a9408f35f8fcbbae60324 (patch)
treeb96d53f0bac3b6d5fb3ee3558415afc65f6e51bf
parentba4105c1335503e3d441abbd7a3e74d255ead1a5 (diff)
downloadcpython-55b69e794c16d9ec201a9408f35f8fcbbae60324.zip
cpython-55b69e794c16d9ec201a9408f35f8fcbbae60324.tar.gz
cpython-55b69e794c16d9ec201a9408f35f8fcbbae60324.tar.bz2
Oops, forgot that there are modules outside the win32 world.
-rw-r--r--Include/methodobject.h10
-rw-r--r--Objects/methodobject.c37
2 files changed, 47 insertions, 0 deletions
diff --git a/Include/methodobject.h b/Include/methodobject.h
index 81e84ce..cd1d265 100644
--- a/Include/methodobject.h
+++ b/Include/methodobject.h
@@ -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 */
diff --git a/Objects/methodobject.c b/Objects/methodobject.c
index cb6f1ba..3d208c1 100644
--- a/Objects/methodobject.c
+++ b/Objects/methodobject.c
@@ -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