Index: third_party/cython/src/Cython/Utility/CythonFunction.c |
diff --git a/third_party/cython/src/Cython/Utility/CythonFunction.c b/third_party/cython/src/Cython/Utility/CythonFunction.c |
new file mode 100644 |
index 0000000000000000000000000000000000000000..ed7ba293297264e6a08bc02ec71458c303b68bb8 |
--- /dev/null |
+++ b/third_party/cython/src/Cython/Utility/CythonFunction.c |
@@ -0,0 +1,1177 @@ |
+ |
+ |
+//////////////////// CythonFunction.proto //////////////////// |
+#define __Pyx_CyFunction_USED 1 |
+#include <structmember.h> |
+ |
+#define __Pyx_CYFUNCTION_STATICMETHOD 0x01 |
+#define __Pyx_CYFUNCTION_CLASSMETHOD 0x02 |
+#define __Pyx_CYFUNCTION_CCLASS 0x04 |
+ |
+#define __Pyx_CyFunction_GetClosure(f) \ |
+ (((__pyx_CyFunctionObject *) (f))->func_closure) |
+#define __Pyx_CyFunction_GetClassObj(f) \ |
+ (((__pyx_CyFunctionObject *) (f))->func_classobj) |
+ |
+#define __Pyx_CyFunction_Defaults(type, f) \ |
+ ((type *)(((__pyx_CyFunctionObject *) (f))->defaults)) |
+#define __Pyx_CyFunction_SetDefaultsGetter(f, g) \ |
+ ((__pyx_CyFunctionObject *) (f))->defaults_getter = (g) |
+ |
+ |
+typedef struct { |
+ PyCFunctionObject func; |
+ PyObject *func_dict; |
+ PyObject *func_weakreflist; |
+ PyObject *func_name; |
+ PyObject *func_qualname; |
+ PyObject *func_doc; |
+ PyObject *func_globals; |
+ PyObject *func_code; |
+ PyObject *func_closure; |
+ PyObject *func_classobj; /* No-args super() class cell */ |
+ |
+ /* Dynamic default args and annotations */ |
+ void *defaults; |
+ int defaults_pyobjects; |
+ int flags; |
+ |
+ /* Defaults info */ |
+ PyObject *defaults_tuple; /* Const defaults tuple */ |
+ PyObject *defaults_kwdict; /* Const kwonly defaults dict */ |
+ PyObject *(*defaults_getter)(PyObject *); |
+ PyObject *func_annotations; /* function annotations dict */ |
+} __pyx_CyFunctionObject; |
+ |
+static PyTypeObject *__pyx_CyFunctionType = 0; |
+ |
+#define __Pyx_CyFunction_NewEx(ml, flags, qualname, self, module, globals, code) \ |
+ __Pyx_CyFunction_New(__pyx_CyFunctionType, ml, flags, qualname, self, module, globals, code) |
+ |
+static PyObject *__Pyx_CyFunction_New(PyTypeObject *, PyMethodDef *ml, |
+ int flags, PyObject* qualname, |
+ PyObject *self, |
+ PyObject *module, PyObject *globals, |
+ PyObject* code); |
+ |
+static CYTHON_INLINE void *__Pyx_CyFunction_InitDefaults(PyObject *m, |
+ size_t size, |
+ int pyobjects); |
+static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsTuple(PyObject *m, |
+ PyObject *tuple); |
+static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsKwDict(PyObject *m, |
+ PyObject *dict); |
+static CYTHON_INLINE void __Pyx_CyFunction_SetAnnotationsDict(PyObject *m, |
+ PyObject *dict); |
+ |
+ |
+static int __Pyx_CyFunction_init(void); |
+ |
+//////////////////// CythonFunction //////////////////// |
+//@substitute: naming |
+//@requires: CommonTypes.c::FetchCommonType |
+////@requires: ObjectHandling.c::PyObjectGetAttrStr |
+ |
+static PyObject * |
+__Pyx_CyFunction_get_doc(__pyx_CyFunctionObject *op, CYTHON_UNUSED void *closure) |
+{ |
+ if (unlikely(op->func_doc == NULL)) { |
+ if (op->func.m_ml->ml_doc) { |
+#if PY_MAJOR_VERSION >= 3 |
+ op->func_doc = PyUnicode_FromString(op->func.m_ml->ml_doc); |
+#else |
+ op->func_doc = PyString_FromString(op->func.m_ml->ml_doc); |
+#endif |
+ if (unlikely(op->func_doc == NULL)) |
+ return NULL; |
+ } else { |
+ Py_INCREF(Py_None); |
+ return Py_None; |
+ } |
+ } |
+ Py_INCREF(op->func_doc); |
+ return op->func_doc; |
+} |
+ |
+static int |
+__Pyx_CyFunction_set_doc(__pyx_CyFunctionObject *op, PyObject *value) |
+{ |
+ PyObject *tmp = op->func_doc; |
+ if (value == NULL) |
+ value = Py_None; /* Mark as deleted */ |
+ Py_INCREF(value); |
+ op->func_doc = value; |
+ Py_XDECREF(tmp); |
+ return 0; |
+} |
+ |
+static PyObject * |
+__Pyx_CyFunction_get_name(__pyx_CyFunctionObject *op) |
+{ |
+ if (unlikely(op->func_name == NULL)) { |
+#if PY_MAJOR_VERSION >= 3 |
+ op->func_name = PyUnicode_InternFromString(op->func.m_ml->ml_name); |
+#else |
+ op->func_name = PyString_InternFromString(op->func.m_ml->ml_name); |
+#endif |
+ if (unlikely(op->func_name == NULL)) |
+ return NULL; |
+ } |
+ Py_INCREF(op->func_name); |
+ return op->func_name; |
+} |
+ |
+static int |
+__Pyx_CyFunction_set_name(__pyx_CyFunctionObject *op, PyObject *value) |
+{ |
+ PyObject *tmp; |
+ |
+#if PY_MAJOR_VERSION >= 3 |
+ if (unlikely(value == NULL || !PyUnicode_Check(value))) { |
+#else |
+ if (unlikely(value == NULL || !PyString_Check(value))) { |
+#endif |
+ PyErr_SetString(PyExc_TypeError, |
+ "__name__ must be set to a string object"); |
+ return -1; |
+ } |
+ tmp = op->func_name; |
+ Py_INCREF(value); |
+ op->func_name = value; |
+ Py_XDECREF(tmp); |
+ return 0; |
+} |
+ |
+static PyObject * |
+__Pyx_CyFunction_get_qualname(__pyx_CyFunctionObject *op) |
+{ |
+ Py_INCREF(op->func_qualname); |
+ return op->func_qualname; |
+} |
+ |
+static int |
+__Pyx_CyFunction_set_qualname(__pyx_CyFunctionObject *op, PyObject *value) |
+{ |
+ PyObject *tmp; |
+ |
+#if PY_MAJOR_VERSION >= 3 |
+ if (unlikely(value == NULL || !PyUnicode_Check(value))) { |
+#else |
+ if (unlikely(value == NULL || !PyString_Check(value))) { |
+#endif |
+ PyErr_SetString(PyExc_TypeError, |
+ "__qualname__ must be set to a string object"); |
+ return -1; |
+ } |
+ tmp = op->func_qualname; |
+ Py_INCREF(value); |
+ op->func_qualname = value; |
+ Py_XDECREF(tmp); |
+ return 0; |
+} |
+ |
+static PyObject * |
+__Pyx_CyFunction_get_self(__pyx_CyFunctionObject *m, CYTHON_UNUSED void *closure) |
+{ |
+ PyObject *self; |
+ |
+ self = m->func_closure; |
+ if (self == NULL) |
+ self = Py_None; |
+ Py_INCREF(self); |
+ return self; |
+} |
+ |
+static PyObject * |
+__Pyx_CyFunction_get_dict(__pyx_CyFunctionObject *op) |
+{ |
+ if (unlikely(op->func_dict == NULL)) { |
+ op->func_dict = PyDict_New(); |
+ if (unlikely(op->func_dict == NULL)) |
+ return NULL; |
+ } |
+ Py_INCREF(op->func_dict); |
+ return op->func_dict; |
+} |
+ |
+static int |
+__Pyx_CyFunction_set_dict(__pyx_CyFunctionObject *op, PyObject *value) |
+{ |
+ PyObject *tmp; |
+ |
+ if (unlikely(value == NULL)) { |
+ PyErr_SetString(PyExc_TypeError, |
+ "function's dictionary may not be deleted"); |
+ return -1; |
+ } |
+ if (unlikely(!PyDict_Check(value))) { |
+ PyErr_SetString(PyExc_TypeError, |
+ "setting function's dictionary to a non-dict"); |
+ return -1; |
+ } |
+ tmp = op->func_dict; |
+ Py_INCREF(value); |
+ op->func_dict = value; |
+ Py_XDECREF(tmp); |
+ return 0; |
+} |
+ |
+static PyObject * |
+__Pyx_CyFunction_get_globals(__pyx_CyFunctionObject *op) |
+{ |
+ Py_INCREF(op->func_globals); |
+ return op->func_globals; |
+} |
+ |
+static PyObject * |
+__Pyx_CyFunction_get_closure(CYTHON_UNUSED __pyx_CyFunctionObject *op) |
+{ |
+ Py_INCREF(Py_None); |
+ return Py_None; |
+} |
+ |
+static PyObject * |
+__Pyx_CyFunction_get_code(__pyx_CyFunctionObject *op) |
+{ |
+ PyObject* result = (op->func_code) ? op->func_code : Py_None; |
+ Py_INCREF(result); |
+ return result; |
+} |
+ |
+static int |
+__Pyx_CyFunction_init_defaults(__pyx_CyFunctionObject *op) { |
+ PyObject *res = op->defaults_getter((PyObject *) op); |
+ if (unlikely(!res)) |
+ return -1; |
+ |
+ /* Cache result */ |
+ op->defaults_tuple = PyTuple_GET_ITEM(res, 0); |
+ Py_INCREF(op->defaults_tuple); |
+ op->defaults_kwdict = PyTuple_GET_ITEM(res, 1); |
+ Py_INCREF(op->defaults_kwdict); |
+ Py_DECREF(res); |
+ return 0; |
+} |
+ |
+static int |
+__Pyx_CyFunction_set_defaults(__pyx_CyFunctionObject *op, PyObject* value) { |
+ PyObject* tmp; |
+ if (!value) { |
+ // del => explicit None to prevent rebuilding |
+ value = Py_None; |
+ } else if (value != Py_None && !PyTuple_Check(value)) { |
+ PyErr_SetString(PyExc_TypeError, |
+ "__defaults__ must be set to a tuple object"); |
+ return -1; |
+ } |
+ Py_INCREF(value); |
+ tmp = op->defaults_tuple; |
+ op->defaults_tuple = value; |
+ Py_XDECREF(tmp); |
+ return 0; |
+} |
+ |
+static PyObject * |
+__Pyx_CyFunction_get_defaults(__pyx_CyFunctionObject *op) { |
+ PyObject* result = op->defaults_tuple; |
+ if (unlikely(!result)) { |
+ if (op->defaults_getter) { |
+ if (__Pyx_CyFunction_init_defaults(op) < 0) return NULL; |
+ result = op->defaults_tuple; |
+ } else { |
+ result = Py_None; |
+ } |
+ } |
+ Py_INCREF(result); |
+ return result; |
+} |
+ |
+static int |
+__Pyx_CyFunction_set_kwdefaults(__pyx_CyFunctionObject *op, PyObject* value) { |
+ PyObject* tmp; |
+ if (!value) { |
+ // del => explicit None to prevent rebuilding |
+ value = Py_None; |
+ } else if (value != Py_None && !PyDict_Check(value)) { |
+ PyErr_SetString(PyExc_TypeError, |
+ "__kwdefaults__ must be set to a dict object"); |
+ return -1; |
+ } |
+ Py_INCREF(value); |
+ tmp = op->defaults_kwdict; |
+ op->defaults_kwdict = value; |
+ Py_XDECREF(tmp); |
+ return 0; |
+} |
+ |
+static PyObject * |
+__Pyx_CyFunction_get_kwdefaults(__pyx_CyFunctionObject *op) { |
+ PyObject* result = op->defaults_kwdict; |
+ if (unlikely(!result)) { |
+ if (op->defaults_getter) { |
+ if (__Pyx_CyFunction_init_defaults(op) < 0) return NULL; |
+ result = op->defaults_kwdict; |
+ } else { |
+ result = Py_None; |
+ } |
+ } |
+ Py_INCREF(result); |
+ return result; |
+} |
+ |
+static int |
+__Pyx_CyFunction_set_annotations(__pyx_CyFunctionObject *op, PyObject* value) { |
+ PyObject* tmp; |
+ if (!value || value == Py_None) { |
+ value = NULL; |
+ } else if (!PyDict_Check(value)) { |
+ PyErr_SetString(PyExc_TypeError, |
+ "__annotations__ must be set to a dict object"); |
+ return -1; |
+ } |
+ Py_XINCREF(value); |
+ tmp = op->func_annotations; |
+ op->func_annotations = value; |
+ Py_XDECREF(tmp); |
+ return 0; |
+} |
+ |
+static PyObject * |
+__Pyx_CyFunction_get_annotations(__pyx_CyFunctionObject *op) { |
+ PyObject* result = op->func_annotations; |
+ if (unlikely(!result)) { |
+ result = PyDict_New(); |
+ if (unlikely(!result)) return NULL; |
+ op->func_annotations = result; |
+ } |
+ Py_INCREF(result); |
+ return result; |
+} |
+ |
+//#if PY_VERSION_HEX >= 0x030400C1 |
+//static PyObject * |
+//__Pyx_CyFunction_get_signature(__pyx_CyFunctionObject *op) { |
+// PyObject *inspect_module, *signature_class, *signature; |
+// // from inspect import Signature |
+// inspect_module = PyImport_ImportModuleLevelObject(PYIDENT("inspect"), NULL, NULL, NULL, 0); |
+// if (unlikely(!inspect_module)) |
+// goto bad; |
+// signature_class = __Pyx_PyObject_GetAttrStr(inspect_module, PYIDENT("Signature")); |
+// Py_DECREF(inspect_module); |
+// if (unlikely(!signature_class)) |
+// goto bad; |
+// // return Signature.from_function(op) |
+// signature = PyObject_CallMethodObjArgs(signature_class, PYIDENT("from_function"), op, NULL); |
+// Py_DECREF(signature_class); |
+// if (likely(signature)) |
+// return signature; |
+//bad: |
+// // make sure we raise an AttributeError from this property on any errors |
+// if (!PyErr_ExceptionMatches(PyExc_AttributeError)) |
+// PyErr_SetString(PyExc_AttributeError, "failed to calculate __signature__"); |
+// return NULL; |
+//} |
+//#endif |
+ |
+static PyGetSetDef __pyx_CyFunction_getsets[] = { |
+ {(char *) "func_doc", (getter)__Pyx_CyFunction_get_doc, (setter)__Pyx_CyFunction_set_doc, 0, 0}, |
+ {(char *) "__doc__", (getter)__Pyx_CyFunction_get_doc, (setter)__Pyx_CyFunction_set_doc, 0, 0}, |
+ {(char *) "func_name", (getter)__Pyx_CyFunction_get_name, (setter)__Pyx_CyFunction_set_name, 0, 0}, |
+ {(char *) "__name__", (getter)__Pyx_CyFunction_get_name, (setter)__Pyx_CyFunction_set_name, 0, 0}, |
+ {(char *) "__qualname__", (getter)__Pyx_CyFunction_get_qualname, (setter)__Pyx_CyFunction_set_qualname, 0, 0}, |
+ {(char *) "__self__", (getter)__Pyx_CyFunction_get_self, 0, 0, 0}, |
+ {(char *) "func_dict", (getter)__Pyx_CyFunction_get_dict, (setter)__Pyx_CyFunction_set_dict, 0, 0}, |
+ {(char *) "__dict__", (getter)__Pyx_CyFunction_get_dict, (setter)__Pyx_CyFunction_set_dict, 0, 0}, |
+ {(char *) "func_globals", (getter)__Pyx_CyFunction_get_globals, 0, 0, 0}, |
+ {(char *) "__globals__", (getter)__Pyx_CyFunction_get_globals, 0, 0, 0}, |
+ {(char *) "func_closure", (getter)__Pyx_CyFunction_get_closure, 0, 0, 0}, |
+ {(char *) "__closure__", (getter)__Pyx_CyFunction_get_closure, 0, 0, 0}, |
+ {(char *) "func_code", (getter)__Pyx_CyFunction_get_code, 0, 0, 0}, |
+ {(char *) "__code__", (getter)__Pyx_CyFunction_get_code, 0, 0, 0}, |
+ {(char *) "func_defaults", (getter)__Pyx_CyFunction_get_defaults, (setter)__Pyx_CyFunction_set_defaults, 0, 0}, |
+ {(char *) "__defaults__", (getter)__Pyx_CyFunction_get_defaults, (setter)__Pyx_CyFunction_set_defaults, 0, 0}, |
+ {(char *) "__kwdefaults__", (getter)__Pyx_CyFunction_get_kwdefaults, (setter)__Pyx_CyFunction_set_kwdefaults, 0, 0}, |
+ {(char *) "__annotations__", (getter)__Pyx_CyFunction_get_annotations, (setter)__Pyx_CyFunction_set_annotations, 0, 0}, |
+//#if PY_VERSION_HEX >= 0x030400C1 |
+// {(char *) "__signature__", (getter)__Pyx_CyFunction_get_signature, 0, 0, 0}, |
+//#endif |
+ {0, 0, 0, 0, 0} |
+}; |
+ |
+#ifndef PY_WRITE_RESTRICTED /* < Py2.5 */ |
+#define PY_WRITE_RESTRICTED WRITE_RESTRICTED |
+#endif |
+ |
+static PyMemberDef __pyx_CyFunction_members[] = { |
+ {(char *) "__module__", T_OBJECT, offsetof(__pyx_CyFunctionObject, func.m_module), PY_WRITE_RESTRICTED, 0}, |
+ {0, 0, 0, 0, 0} |
+}; |
+ |
+static PyObject * |
+__Pyx_CyFunction_reduce(__pyx_CyFunctionObject *m, CYTHON_UNUSED PyObject *args) |
+{ |
+#if PY_MAJOR_VERSION >= 3 |
+ return PyUnicode_FromString(m->func.m_ml->ml_name); |
+#else |
+ return PyString_FromString(m->func.m_ml->ml_name); |
+#endif |
+} |
+ |
+static PyMethodDef __pyx_CyFunction_methods[] = { |
+ {__Pyx_NAMESTR("__reduce__"), (PyCFunction)__Pyx_CyFunction_reduce, METH_VARARGS, 0}, |
+ {0, 0, 0, 0} |
+}; |
+ |
+ |
+static PyObject *__Pyx_CyFunction_New(PyTypeObject *type, PyMethodDef *ml, int flags, PyObject* qualname, |
+ PyObject *closure, PyObject *module, PyObject* globals, PyObject* code) { |
+ __pyx_CyFunctionObject *op = PyObject_GC_New(__pyx_CyFunctionObject, type); |
+ if (op == NULL) |
+ return NULL; |
+ op->flags = flags; |
+ op->func_weakreflist = NULL; |
+ op->func.m_ml = ml; |
+ op->func.m_self = (PyObject *) op; |
+ Py_XINCREF(closure); |
+ op->func_closure = closure; |
+ Py_XINCREF(module); |
+ op->func.m_module = module; |
+ op->func_dict = NULL; |
+ op->func_name = NULL; |
+ Py_INCREF(qualname); |
+ op->func_qualname = qualname; |
+ op->func_doc = NULL; |
+ op->func_classobj = NULL; |
+ op->func_globals = globals; |
+ Py_INCREF(op->func_globals); |
+ Py_XINCREF(code); |
+ op->func_code = code; |
+ /* Dynamic Default args */ |
+ op->defaults_pyobjects = 0; |
+ op->defaults = NULL; |
+ op->defaults_tuple = NULL; |
+ op->defaults_kwdict = NULL; |
+ op->defaults_getter = NULL; |
+ op->func_annotations = NULL; |
+ PyObject_GC_Track(op); |
+ return (PyObject *) op; |
+} |
+ |
+static int |
+__Pyx_CyFunction_clear(__pyx_CyFunctionObject *m) |
+{ |
+ Py_CLEAR(m->func_closure); |
+ Py_CLEAR(m->func.m_module); |
+ Py_CLEAR(m->func_dict); |
+ Py_CLEAR(m->func_name); |
+ Py_CLEAR(m->func_qualname); |
+ Py_CLEAR(m->func_doc); |
+ Py_CLEAR(m->func_globals); |
+ Py_CLEAR(m->func_code); |
+ Py_CLEAR(m->func_classobj); |
+ Py_CLEAR(m->defaults_tuple); |
+ Py_CLEAR(m->defaults_kwdict); |
+ Py_CLEAR(m->func_annotations); |
+ |
+ if (m->defaults) { |
+ PyObject **pydefaults = __Pyx_CyFunction_Defaults(PyObject *, m); |
+ int i; |
+ |
+ for (i = 0; i < m->defaults_pyobjects; i++) |
+ Py_XDECREF(pydefaults[i]); |
+ |
+ PyMem_Free(m->defaults); |
+ m->defaults = NULL; |
+ } |
+ |
+ return 0; |
+} |
+ |
+static void __Pyx_CyFunction_dealloc(__pyx_CyFunctionObject *m) |
+{ |
+ PyObject_GC_UnTrack(m); |
+ if (m->func_weakreflist != NULL) |
+ PyObject_ClearWeakRefs((PyObject *) m); |
+ __Pyx_CyFunction_clear(m); |
+ PyObject_GC_Del(m); |
+} |
+ |
+static int __Pyx_CyFunction_traverse(__pyx_CyFunctionObject *m, visitproc visit, void *arg) |
+{ |
+ Py_VISIT(m->func_closure); |
+ Py_VISIT(m->func.m_module); |
+ Py_VISIT(m->func_dict); |
+ Py_VISIT(m->func_name); |
+ Py_VISIT(m->func_qualname); |
+ Py_VISIT(m->func_doc); |
+ Py_VISIT(m->func_globals); |
+ Py_VISIT(m->func_code); |
+ Py_VISIT(m->func_classobj); |
+ Py_VISIT(m->defaults_tuple); |
+ Py_VISIT(m->defaults_kwdict); |
+ |
+ if (m->defaults) { |
+ PyObject **pydefaults = __Pyx_CyFunction_Defaults(PyObject *, m); |
+ int i; |
+ |
+ for (i = 0; i < m->defaults_pyobjects; i++) |
+ Py_VISIT(pydefaults[i]); |
+ } |
+ |
+ return 0; |
+} |
+ |
+static PyObject *__Pyx_CyFunction_descr_get(PyObject *func, PyObject *obj, PyObject *type) |
+{ |
+ __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; |
+ |
+ if (m->flags & __Pyx_CYFUNCTION_STATICMETHOD) { |
+ Py_INCREF(func); |
+ return func; |
+ } |
+ |
+ if (m->flags & __Pyx_CYFUNCTION_CLASSMETHOD) { |
+ if (type == NULL) |
+ type = (PyObject *)(Py_TYPE(obj)); |
+ return PyMethod_New(func, |
+ type, (PyObject *)(Py_TYPE(type))); |
+ } |
+ |
+ if (obj == Py_None) |
+ obj = NULL; |
+ return PyMethod_New(func, obj, type); |
+} |
+ |
+static PyObject* |
+__Pyx_CyFunction_repr(__pyx_CyFunctionObject *op) |
+{ |
+#if PY_MAJOR_VERSION >= 3 |
+ return PyUnicode_FromFormat("<cyfunction %U at %p>", |
+ op->func_qualname, (void *)op); |
+#else |
+ return PyString_FromFormat("<cyfunction %s at %p>", |
+ PyString_AsString(op->func_qualname), (void *)op); |
+#endif |
+} |
+ |
+#if CYTHON_COMPILING_IN_PYPY |
+/* originally copied from PyCFunction_Call() in CPython's Objects/methodobject.c */ |
+/* PyPy does not have this function */ |
+static PyObject * __Pyx_CyFunction_Call(PyObject *func, PyObject *arg, PyObject *kw) { |
+ PyCFunctionObject* f = (PyCFunctionObject*)func; |
+ PyCFunction meth = PyCFunction_GET_FUNCTION(func); |
+ PyObject *self = PyCFunction_GET_SELF(func); |
+ Py_ssize_t size; |
+ |
+ switch (PyCFunction_GET_FLAGS(func) & ~(METH_CLASS | METH_STATIC | METH_COEXIST)) { |
+ case METH_VARARGS: |
+ if (likely(kw == NULL) || PyDict_Size(kw) == 0) |
+ return (*meth)(self, arg); |
+ break; |
+ case METH_VARARGS | METH_KEYWORDS: |
+ return (*(PyCFunctionWithKeywords)meth)(self, arg, kw); |
+ case METH_NOARGS: |
+ if (likely(kw == NULL) || PyDict_Size(kw) == 0) { |
+ size = PyTuple_GET_SIZE(arg); |
+ if (size == 0) |
+ return (*meth)(self, NULL); |
+ PyErr_Format(PyExc_TypeError, |
+ "%.200s() takes no arguments (%zd given)", |
+ f->m_ml->ml_name, size); |
+ return NULL; |
+ } |
+ break; |
+ case METH_O: |
+ if (likely(kw == NULL) || PyDict_Size(kw) == 0) { |
+ size = PyTuple_GET_SIZE(arg); |
+ if (size == 1) |
+ return (*meth)(self, PyTuple_GET_ITEM(arg, 0)); |
+ PyErr_Format(PyExc_TypeError, |
+ "%.200s() takes exactly one argument (%zd given)", |
+ f->m_ml->ml_name, size); |
+ return NULL; |
+ } |
+ break; |
+ default: |
+ PyErr_SetString(PyExc_SystemError, "Bad call flags in " |
+ "__Pyx_CyFunction_Call. METH_OLDARGS is no " |
+ "longer supported!"); |
+ |
+ return NULL; |
+ } |
+ PyErr_Format(PyExc_TypeError, "%.200s() takes no keyword arguments", |
+ f->m_ml->ml_name); |
+ return NULL; |
+} |
+#else |
+static PyObject * __Pyx_CyFunction_Call(PyObject *func, PyObject *arg, PyObject *kw) { |
+ return PyCFunction_Call(func, arg, kw); |
+} |
+#endif |
+ |
+static PyTypeObject __pyx_CyFunctionType_type = { |
+ PyVarObject_HEAD_INIT(0, 0) |
+ __Pyx_NAMESTR("cython_function_or_method"), /*tp_name*/ |
+ sizeof(__pyx_CyFunctionObject), /*tp_basicsize*/ |
+ 0, /*tp_itemsize*/ |
+ (destructor) __Pyx_CyFunction_dealloc, /*tp_dealloc*/ |
+ 0, /*tp_print*/ |
+ 0, /*tp_getattr*/ |
+ 0, /*tp_setattr*/ |
+#if PY_MAJOR_VERSION < 3 |
+ 0, /*tp_compare*/ |
+#else |
+ 0, /*reserved*/ |
+#endif |
+ (reprfunc) __Pyx_CyFunction_repr, /*tp_repr*/ |
+ 0, /*tp_as_number*/ |
+ 0, /*tp_as_sequence*/ |
+ 0, /*tp_as_mapping*/ |
+ 0, /*tp_hash*/ |
+ __Pyx_CyFunction_Call, /*tp_call*/ |
+ 0, /*tp_str*/ |
+ 0, /*tp_getattro*/ |
+ 0, /*tp_setattro*/ |
+ 0, /*tp_as_buffer*/ |
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags*/ |
+ 0, /*tp_doc*/ |
+ (traverseproc) __Pyx_CyFunction_traverse, /*tp_traverse*/ |
+ (inquiry) __Pyx_CyFunction_clear, /*tp_clear*/ |
+ 0, /*tp_richcompare*/ |
+ offsetof(__pyx_CyFunctionObject, func_weakreflist), /* tp_weaklistoffse */ |
+ 0, /*tp_iter*/ |
+ 0, /*tp_iternext*/ |
+ __pyx_CyFunction_methods, /*tp_methods*/ |
+ __pyx_CyFunction_members, /*tp_members*/ |
+ __pyx_CyFunction_getsets, /*tp_getset*/ |
+ 0, /*tp_base*/ |
+ 0, /*tp_dict*/ |
+ __Pyx_CyFunction_descr_get, /*tp_descr_get*/ |
+ 0, /*tp_descr_set*/ |
+ offsetof(__pyx_CyFunctionObject, func_dict),/*tp_dictoffset*/ |
+ 0, /*tp_init*/ |
+ 0, /*tp_alloc*/ |
+ 0, /*tp_new*/ |
+ 0, /*tp_free*/ |
+ 0, /*tp_is_gc*/ |
+ 0, /*tp_bases*/ |
+ 0, /*tp_mro*/ |
+ 0, /*tp_cache*/ |
+ 0, /*tp_subclasses*/ |
+ 0, /*tp_weaklist*/ |
+ 0, /*tp_del*/ |
+#if PY_VERSION_HEX >= 0x02060000 |
+ 0, /*tp_version_tag*/ |
+#endif |
+#if PY_VERSION_HEX >= 0x030400a1 |
+ 0, /*tp_finalize*/ |
+#endif |
+}; |
+ |
+ |
+static int __Pyx_CyFunction_init(void) { |
+#if !CYTHON_COMPILING_IN_PYPY |
+ // avoid a useless level of call indirection |
+ __pyx_CyFunctionType_type.tp_call = PyCFunction_Call; |
+#endif |
+ __pyx_CyFunctionType = __Pyx_FetchCommonType(&__pyx_CyFunctionType_type); |
+ if (__pyx_CyFunctionType == NULL) { |
+ return -1; |
+ } |
+ return 0; |
+} |
+ |
+static CYTHON_INLINE void *__Pyx_CyFunction_InitDefaults(PyObject *func, size_t size, int pyobjects) { |
+ __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; |
+ |
+ m->defaults = PyMem_Malloc(size); |
+ if (!m->defaults) |
+ return PyErr_NoMemory(); |
+ memset(m->defaults, 0, size); |
+ m->defaults_pyobjects = pyobjects; |
+ return m->defaults; |
+} |
+ |
+static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsTuple(PyObject *func, PyObject *tuple) { |
+ __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; |
+ m->defaults_tuple = tuple; |
+ Py_INCREF(tuple); |
+} |
+ |
+static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsKwDict(PyObject *func, PyObject *dict) { |
+ __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; |
+ m->defaults_kwdict = dict; |
+ Py_INCREF(dict); |
+} |
+ |
+static CYTHON_INLINE void __Pyx_CyFunction_SetAnnotationsDict(PyObject *func, PyObject *dict) { |
+ __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func; |
+ m->func_annotations = dict; |
+ Py_INCREF(dict); |
+} |
+ |
+//////////////////// CyFunctionClassCell.proto //////////////////// |
+static CYTHON_INLINE void __Pyx_CyFunction_InitClassCell(PyObject *cyfunctions, |
+ PyObject *classobj); |
+ |
+//////////////////// CyFunctionClassCell //////////////////// |
+//@requires: CythonFunction |
+ |
+static CYTHON_INLINE void __Pyx_CyFunction_InitClassCell(PyObject *cyfunctions, PyObject *classobj) { |
+ int i; |
+ |
+ for (i = 0; i < PyList_GET_SIZE(cyfunctions); i++) { |
+ __pyx_CyFunctionObject *m = |
+ (__pyx_CyFunctionObject *) PyList_GET_ITEM(cyfunctions, i); |
+ m->func_classobj = classobj; |
+ Py_INCREF(classobj); |
+ } |
+} |
+ |
+//////////////////// FusedFunction.proto //////////////////// |
+typedef struct { |
+ __pyx_CyFunctionObject func; |
+ PyObject *__signatures__; |
+ PyObject *type; |
+ PyObject *self; |
+} __pyx_FusedFunctionObject; |
+ |
+#define __pyx_FusedFunction_NewEx(ml, flags, qualname, self, module, globals, code) \ |
+ __pyx_FusedFunction_New(__pyx_FusedFunctionType, ml, flags, qualname, self, module, globals, code) |
+static PyObject *__pyx_FusedFunction_New(PyTypeObject *type, |
+ PyMethodDef *ml, int flags, |
+ PyObject *qualname, PyObject *self, |
+ PyObject *module, PyObject *globals, |
+ PyObject *code); |
+ |
+static int __pyx_FusedFunction_clear(__pyx_FusedFunctionObject *self); |
+static PyTypeObject *__pyx_FusedFunctionType = NULL; |
+static int __pyx_FusedFunction_init(void); |
+ |
+#define __Pyx_FusedFunction_USED |
+ |
+//////////////////// FusedFunction //////////////////// |
+//@requires: CythonFunction |
+ |
+static PyObject * |
+__pyx_FusedFunction_New(PyTypeObject *type, PyMethodDef *ml, int flags, |
+ PyObject *qualname, PyObject *self, |
+ PyObject *module, PyObject *globals, |
+ PyObject *code) |
+{ |
+ __pyx_FusedFunctionObject *fusedfunc = |
+ (__pyx_FusedFunctionObject *) __Pyx_CyFunction_New(type, ml, flags, qualname, |
+ self, module, globals, code); |
+ if (!fusedfunc) |
+ return NULL; |
+ |
+ fusedfunc->__signatures__ = NULL; |
+ fusedfunc->type = NULL; |
+ fusedfunc->self = NULL; |
+ return (PyObject *) fusedfunc; |
+} |
+ |
+static void __pyx_FusedFunction_dealloc(__pyx_FusedFunctionObject *self) { |
+ __pyx_FusedFunction_clear(self); |
+ __pyx_FusedFunctionType->tp_free((PyObject *) self); |
+} |
+ |
+static int |
+__pyx_FusedFunction_traverse(__pyx_FusedFunctionObject *self, |
+ visitproc visit, |
+ void *arg) |
+{ |
+ Py_VISIT(self->self); |
+ Py_VISIT(self->type); |
+ Py_VISIT(self->__signatures__); |
+ return __Pyx_CyFunction_traverse((__pyx_CyFunctionObject *) self, visit, arg); |
+} |
+ |
+static int |
+__pyx_FusedFunction_clear(__pyx_FusedFunctionObject *self) |
+{ |
+ Py_CLEAR(self->self); |
+ Py_CLEAR(self->type); |
+ Py_CLEAR(self->__signatures__); |
+ return __Pyx_CyFunction_clear((__pyx_CyFunctionObject *) self); |
+} |
+ |
+ |
+static PyObject * |
+__pyx_FusedFunction_descr_get(PyObject *self, PyObject *obj, PyObject *type) |
+{ |
+ __pyx_FusedFunctionObject *func, *meth; |
+ |
+ func = (__pyx_FusedFunctionObject *) self; |
+ |
+ if (func->self || func->func.flags & __Pyx_CYFUNCTION_STATICMETHOD) { |
+ /* Do not allow rebinding and don't do anything for static methods */ |
+ Py_INCREF(self); |
+ return self; |
+ } |
+ |
+ if (obj == Py_None) |
+ obj = NULL; |
+ |
+ meth = (__pyx_FusedFunctionObject *) __pyx_FusedFunction_NewEx( |
+ ((PyCFunctionObject *) func)->m_ml, |
+ ((__pyx_CyFunctionObject *) func)->flags, |
+ ((__pyx_CyFunctionObject *) func)->func_qualname, |
+ ((__pyx_CyFunctionObject *) func)->func_closure, |
+ ((PyCFunctionObject *) func)->m_module, |
+ ((__pyx_CyFunctionObject *) func)->func_globals, |
+ ((__pyx_CyFunctionObject *) func)->func_code); |
+ if (!meth) |
+ return NULL; |
+ |
+ Py_XINCREF(func->func.func_classobj); |
+ meth->func.func_classobj = func->func.func_classobj; |
+ |
+ Py_XINCREF(func->__signatures__); |
+ meth->__signatures__ = func->__signatures__; |
+ |
+ Py_XINCREF(type); |
+ meth->type = type; |
+ |
+ Py_XINCREF(func->func.defaults_tuple); |
+ meth->func.defaults_tuple = func->func.defaults_tuple; |
+ |
+ if (func->func.flags & __Pyx_CYFUNCTION_CLASSMETHOD) |
+ obj = type; |
+ |
+ Py_XINCREF(obj); |
+ meth->self = obj; |
+ |
+ return (PyObject *) meth; |
+} |
+ |
+static PyObject * |
+_obj_to_str(PyObject *obj) |
+{ |
+ if (PyType_Check(obj)) |
+ return PyObject_GetAttr(obj, PYIDENT("__name__")); |
+ else |
+ return PyObject_Str(obj); |
+} |
+ |
+static PyObject * |
+__pyx_FusedFunction_getitem(__pyx_FusedFunctionObject *self, PyObject *idx) |
+{ |
+ PyObject *signature = NULL; |
+ PyObject *unbound_result_func; |
+ PyObject *result_func = NULL; |
+ |
+ if (self->__signatures__ == NULL) { |
+ PyErr_SetString(PyExc_TypeError, "Function is not fused"); |
+ return NULL; |
+ } |
+ |
+ if (PyTuple_Check(idx)) { |
+ PyObject *list = PyList_New(0); |
+ Py_ssize_t n = PyTuple_GET_SIZE(idx); |
+ PyObject *string = NULL; |
+ PyObject *sep = NULL; |
+ int i; |
+ |
+ if (!list) |
+ return NULL; |
+ |
+ for (i = 0; i < n; i++) { |
+ PyObject *item = PyTuple_GET_ITEM(idx, i); |
+ |
+ string = _obj_to_str(item); |
+ if (!string || PyList_Append(list, string) < 0) |
+ goto __pyx_err; |
+ |
+ Py_DECREF(string); |
+ } |
+ |
+ sep = PyUnicode_FromString("|"); |
+ if (sep) |
+ signature = PyUnicode_Join(sep, list); |
+__pyx_err: |
+; |
+ Py_DECREF(list); |
+ Py_XDECREF(sep); |
+ } else { |
+ signature = _obj_to_str(idx); |
+ } |
+ |
+ if (!signature) |
+ return NULL; |
+ |
+ unbound_result_func = PyObject_GetItem(self->__signatures__, signature); |
+ |
+ if (unbound_result_func) { |
+ if (self->self || self->type) { |
+ __pyx_FusedFunctionObject *unbound = (__pyx_FusedFunctionObject *) unbound_result_func; |
+ |
+ /* Todo: move this to InitClassCell */ |
+ Py_CLEAR(unbound->func.func_classobj); |
+ Py_XINCREF(self->func.func_classobj); |
+ unbound->func.func_classobj = self->func.func_classobj; |
+ |
+ result_func = __pyx_FusedFunction_descr_get(unbound_result_func, |
+ self->self, self->type); |
+ } else { |
+ result_func = unbound_result_func; |
+ Py_INCREF(result_func); |
+ } |
+ } |
+ |
+ Py_DECREF(signature); |
+ Py_XDECREF(unbound_result_func); |
+ |
+ return result_func; |
+} |
+ |
+static PyObject * |
+__pyx_FusedFunction_callfunction(PyObject *func, PyObject *args, PyObject *kw) |
+{ |
+ __pyx_CyFunctionObject *cyfunc = (__pyx_CyFunctionObject *) func; |
+ PyObject *result; |
+ int static_specialized = (cyfunc->flags & __Pyx_CYFUNCTION_STATICMETHOD && |
+ !((__pyx_FusedFunctionObject *) func)->__signatures__); |
+ |
+ if (cyfunc->flags & __Pyx_CYFUNCTION_CCLASS && !static_specialized) { |
+ Py_ssize_t argc; |
+ PyObject *new_args; |
+ PyObject *self; |
+ PyObject *m_self; |
+ |
+ argc = PyTuple_GET_SIZE(args); |
+ new_args = PyTuple_GetSlice(args, 1, argc); |
+ |
+ if (!new_args) |
+ return NULL; |
+ |
+ self = PyTuple_GetItem(args, 0); |
+ |
+ if (!self) |
+ return NULL; |
+ |
+ m_self = cyfunc->func.m_self; |
+ cyfunc->func.m_self = self; |
+ result = __Pyx_CyFunction_Call(func, new_args, kw); |
+ cyfunc->func.m_self = m_self; |
+ |
+ Py_DECREF(new_args); |
+ } else { |
+ result = __Pyx_CyFunction_Call(func, args, kw); |
+ } |
+ |
+ return result; |
+} |
+ |
+/* Note: the 'self' from method binding is passed in in the args tuple, |
+ whereas PyCFunctionObject's m_self is passed in as the first |
+ argument to the C function. For extension methods we need |
+ to pass 'self' as 'm_self' and not as the first element of the |
+ args tuple. |
+*/ |
+static PyObject * |
+__pyx_FusedFunction_call(PyObject *func, PyObject *args, PyObject *kw) |
+{ |
+ __pyx_FusedFunctionObject *binding_func = (__pyx_FusedFunctionObject *) func; |
+ Py_ssize_t argc = PyTuple_GET_SIZE(args); |
+ PyObject *new_args = NULL; |
+ __pyx_FusedFunctionObject *new_func = NULL; |
+ PyObject *result = NULL; |
+ PyObject *self = NULL; |
+ int is_staticmethod = binding_func->func.flags & __Pyx_CYFUNCTION_STATICMETHOD; |
+ int is_classmethod = binding_func->func.flags & __Pyx_CYFUNCTION_CLASSMETHOD; |
+ |
+ if (binding_func->self) { |
+ /* Bound method call, put 'self' in the args tuple */ |
+ Py_ssize_t i; |
+ new_args = PyTuple_New(argc + 1); |
+ if (!new_args) |
+ return NULL; |
+ |
+ self = binding_func->self; |
+ Py_INCREF(self); |
+ PyTuple_SET_ITEM(new_args, 0, self); |
+ |
+ for (i = 0; i < argc; i++) { |
+ PyObject *item = PyTuple_GET_ITEM(args, i); |
+ Py_INCREF(item); |
+ PyTuple_SET_ITEM(new_args, i + 1, item); |
+ } |
+ |
+ args = new_args; |
+ } else if (binding_func->type) { |
+ /* Unbound method call */ |
+ if (argc < 1) { |
+ PyErr_SetString(PyExc_TypeError, "Need at least one argument, 0 given."); |
+ return NULL; |
+ } |
+ self = PyTuple_GET_ITEM(args, 0); |
+ } |
+ |
+ if (self && !is_classmethod && !is_staticmethod && |
+ !PyObject_IsInstance(self, binding_func->type)) { |
+ PyErr_Format(PyExc_TypeError, |
+ "First argument should be of type %.200s, got %.200s.", |
+ ((PyTypeObject *) binding_func->type)->tp_name, |
+ self->ob_type->tp_name); |
+ goto __pyx_err; |
+ } |
+ |
+ if (binding_func->__signatures__) { |
+ PyObject *tup = PyTuple_Pack(4, binding_func->__signatures__, args, |
+ kw == NULL ? Py_None : kw, |
+ binding_func->func.defaults_tuple); |
+ if (!tup) |
+ goto __pyx_err; |
+ |
+ new_func = (__pyx_FusedFunctionObject *) __pyx_FusedFunction_callfunction(func, tup, NULL); |
+ Py_DECREF(tup); |
+ |
+ if (!new_func) |
+ goto __pyx_err; |
+ |
+ Py_XINCREF(binding_func->func.func_classobj); |
+ Py_CLEAR(new_func->func.func_classobj); |
+ new_func->func.func_classobj = binding_func->func.func_classobj; |
+ |
+ func = (PyObject *) new_func; |
+ } |
+ |
+ result = __pyx_FusedFunction_callfunction(func, args, kw); |
+__pyx_err: |
+ Py_XDECREF(new_args); |
+ Py_XDECREF((PyObject *) new_func); |
+ return result; |
+} |
+ |
+static PyMemberDef __pyx_FusedFunction_members[] = { |
+ {(char *) "__signatures__", |
+ T_OBJECT, |
+ offsetof(__pyx_FusedFunctionObject, __signatures__), |
+ READONLY, |
+ __Pyx_DOCSTR(0)}, |
+ {0, 0, 0, 0, 0}, |
+}; |
+ |
+static PyMappingMethods __pyx_FusedFunction_mapping_methods = { |
+ 0, |
+ (binaryfunc) __pyx_FusedFunction_getitem, |
+ 0, |
+}; |
+ |
+static PyTypeObject __pyx_FusedFunctionType_type = { |
+ PyVarObject_HEAD_INIT(0, 0) |
+ __Pyx_NAMESTR("fused_cython_function"), /*tp_name*/ |
+ sizeof(__pyx_FusedFunctionObject), /*tp_basicsize*/ |
+ 0, /*tp_itemsize*/ |
+ (destructor) __pyx_FusedFunction_dealloc, /*tp_dealloc*/ |
+ 0, /*tp_print*/ |
+ 0, /*tp_getattr*/ |
+ 0, /*tp_setattr*/ |
+#if PY_MAJOR_VERSION < 3 |
+ 0, /*tp_compare*/ |
+#else |
+ 0, /*reserved*/ |
+#endif |
+ 0, /*tp_repr*/ |
+ 0, /*tp_as_number*/ |
+ 0, /*tp_as_sequence*/ |
+ &__pyx_FusedFunction_mapping_methods, /*tp_as_mapping*/ |
+ 0, /*tp_hash*/ |
+ (ternaryfunc) __pyx_FusedFunction_call, /*tp_call*/ |
+ 0, /*tp_str*/ |
+ 0, /*tp_getattro*/ |
+ 0, /*tp_setattro*/ |
+ 0, /*tp_as_buffer*/ |
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_BASETYPE, /* tp_flags*/ |
+ 0, /*tp_doc*/ |
+ (traverseproc) __pyx_FusedFunction_traverse, /*tp_traverse*/ |
+ (inquiry) __pyx_FusedFunction_clear,/*tp_clear*/ |
+ 0, /*tp_richcompare*/ |
+ 0, /*tp_weaklistoffset*/ |
+ 0, /*tp_iter*/ |
+ 0, /*tp_iternext*/ |
+ 0, /*tp_methods*/ |
+ __pyx_FusedFunction_members, /*tp_members*/ |
+ /* __doc__ is None for the fused function type, but we need it to be */ |
+ /* a descriptor for the instance's __doc__, so rebuild descriptors in our subclass */ |
+ __pyx_CyFunction_getsets, /*tp_getset*/ |
+ &__pyx_CyFunctionType_type, /*tp_base*/ |
+ 0, /*tp_dict*/ |
+ __pyx_FusedFunction_descr_get, /*tp_descr_get*/ |
+ 0, /*tp_descr_set*/ |
+ 0, /*tp_dictoffset*/ |
+ 0, /*tp_init*/ |
+ 0, /*tp_alloc*/ |
+ 0, /*tp_new*/ |
+ 0, /*tp_free*/ |
+ 0, /*tp_is_gc*/ |
+ 0, /*tp_bases*/ |
+ 0, /*tp_mro*/ |
+ 0, /*tp_cache*/ |
+ 0, /*tp_subclasses*/ |
+ 0, /*tp_weaklist*/ |
+ 0, /*tp_del*/ |
+#if PY_VERSION_HEX >= 0x02060000 |
+ 0, /*tp_version_tag*/ |
+#endif |
+#if PY_VERSION_HEX >= 0x030400a1 |
+ 0, /*tp_finalize*/ |
+#endif |
+}; |
+ |
+static int __pyx_FusedFunction_init(void) { |
+ __pyx_FusedFunctionType = __Pyx_FetchCommonType(&__pyx_FusedFunctionType_type); |
+ if (__pyx_FusedFunctionType == NULL) { |
+ return -1; |
+ } |
+ return 0; |
+} |
+ |
+//////////////////// ClassMethod.proto //////////////////// |
+ |
+#include "descrobject.h" |
+static PyObject* __Pyx_Method_ClassMethod(PyObject *method); /*proto*/ |
+ |
+//////////////////// ClassMethod //////////////////// |
+ |
+static PyObject* __Pyx_Method_ClassMethod(PyObject *method) { |
+#if CYTHON_COMPILING_IN_PYPY |
+ if (PyObject_TypeCheck(method, &PyWrapperDescr_Type)) { /* cdef classes */ |
+ return PyClassMethod_New(method); |
+ } |
+#else |
+ /* It appears that PyMethodDescr_Type is not anywhere exposed in the Python/C API */ |
+ static PyTypeObject *methoddescr_type = NULL; |
+ if (methoddescr_type == NULL) { |
+ PyObject *meth = __Pyx_GetAttrString((PyObject*)&PyList_Type, "append"); |
+ if (!meth) return NULL; |
+ methoddescr_type = Py_TYPE(meth); |
+ Py_DECREF(meth); |
+ } |
+ if (PyObject_TypeCheck(method, methoddescr_type)) { /* cdef classes */ |
+ PyMethodDescrObject *descr = (PyMethodDescrObject *)method; |
+ #if PY_VERSION_HEX < 0x03020000 |
+ PyTypeObject *d_type = descr->d_type; |
+ #else |
+ PyTypeObject *d_type = descr->d_common.d_type; |
+ #endif |
+ return PyDescr_NewClassMethod(d_type, descr->d_method); |
+ } |
+#endif |
+ else if (PyMethod_Check(method)) { /* python classes */ |
+ return PyClassMethod_New(PyMethod_GET_FUNCTION(method)); |
+ } |
+ else if (PyCFunction_Check(method)) { |
+ return PyClassMethod_New(method); |
+ } |
+#ifdef __Pyx_CyFunction_USED |
+ else if (PyObject_TypeCheck(method, __pyx_CyFunctionType)) { |
+ return PyClassMethod_New(method); |
+ } |
+#endif |
+ PyErr_SetString(PyExc_TypeError, |
+ "Class-level classmethod() can only be called on " |
+ "a method_descriptor or instance method."); |
+ return NULL; |
+} |