summaryrefslogtreecommitdiffstats
path: root/Objects
diff options
context:
space:
mode:
Diffstat (limited to 'Objects')
-rw-r--r--Objects/methodobject.c2
-rw-r--r--Objects/typeobject.c31
2 files changed, 30 insertions, 3 deletions
diff --git a/Objects/methodobject.c b/Objects/methodobject.c
index 05474b5..0cb4fd8 100644
--- a/Objects/methodobject.c
+++ b/Objects/methodobject.c
@@ -62,7 +62,7 @@ PyCFunction_Call(PyObject *func, PyObject *arg, PyObject *kw)
PyCFunctionObject* f = (PyCFunctionObject*)func;
PyCFunction meth = PyCFunction_GET_FUNCTION(func);
PyObject *self = PyCFunction_GET_SELF(func);
- int flags = PyCFunction_GET_FLAGS(func);
+ int flags = PyCFunction_GET_FLAGS(func) & ~(METH_CLASS | METH_STATIC);
int size = PyTuple_GET_SIZE(arg);
if (flags & METH_KEYWORDS) {
diff --git a/Objects/typeobject.c b/Objects/typeobject.c
index c938f52..a596721 100644
--- a/Objects/typeobject.c
+++ b/Objects/typeobject.c
@@ -1694,6 +1694,20 @@ PyTypeObject PyBaseObject_Type = {
/* Initialize the __dict__ in a type object */
+static PyObject *
+create_specialmethod(PyMethodDef *meth, PyObject *(*func)(PyObject *))
+{
+ PyObject *cfunc;
+ PyObject *result;
+
+ cfunc = PyCFunction_New(meth, NULL);
+ if (cfunc == NULL)
+ return NULL;
+ result = func(cfunc);
+ Py_DECREF(cfunc);
+ return result;
+}
+
static int
add_methods(PyTypeObject *type, PyMethodDef *meth)
{
@@ -1703,10 +1717,23 @@ add_methods(PyTypeObject *type, PyMethodDef *meth)
PyObject *descr;
if (PyDict_GetItemString(dict, meth->ml_name))
continue;
- descr = PyDescr_NewMethod(type, meth);
+ if (meth->ml_flags & METH_CLASS) {
+ if (meth->ml_flags & METH_STATIC) {
+ PyErr_SetString(PyExc_ValueError,
+ "method cannot be both class and static");
+ return -1;
+ }
+ descr = create_specialmethod(meth, PyClassMethod_New);
+ }
+ else if (meth->ml_flags & METH_STATIC) {
+ descr = create_specialmethod(meth, PyStaticMethod_New);
+ }
+ else {
+ descr = PyDescr_NewMethod(type, meth);
+ }
if (descr == NULL)
return -1;
- if (PyDict_SetItemString(dict,meth->ml_name, descr) < 0)
+ if (PyDict_SetItemString(dict, meth->ml_name, descr) < 0)
return -1;
Py_DECREF(descr);
}