diff options
Diffstat (limited to 'Objects')
-rw-r--r-- | Objects/methodobject.c | 2 | ||||
-rw-r--r-- | Objects/typeobject.c | 31 |
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); } |