diff options
| author | orivej <[email protected]> | 2022-02-10 16:44:49 +0300 |
|---|---|---|
| committer | Daniil Cherednik <[email protected]> | 2022-02-10 16:44:49 +0300 |
| commit | 718c552901d703c502ccbefdfc3c9028d608b947 (patch) | |
| tree | 46534a98bbefcd7b1f3faa5b52c138ab27db75b7 /contrib/tools/python3/src/Objects/classobject.c | |
| parent | e9656aae26e0358d5378e5b63dcac5c8dbe0e4d0 (diff) | |
Restoring authorship annotation for <[email protected]>. Commit 1 of 2.
Diffstat (limited to 'contrib/tools/python3/src/Objects/classobject.c')
| -rw-r--r-- | contrib/tools/python3/src/Objects/classobject.c | 1038 |
1 files changed, 519 insertions, 519 deletions
diff --git a/contrib/tools/python3/src/Objects/classobject.c b/contrib/tools/python3/src/Objects/classobject.c index af73be3d262..e856a6c729a 100644 --- a/contrib/tools/python3/src/Objects/classobject.c +++ b/contrib/tools/python3/src/Objects/classobject.c @@ -1,36 +1,36 @@ -/* Class object implementation (dead now except for methods) */ - -#include "Python.h" +/* Class object implementation (dead now except for methods) */ + +#include "Python.h" #include "pycore_object.h" #include "pycore_pyerrors.h" #include "pycore_pystate.h" // _PyThreadState_GET() #include "structmember.h" // PyMemberDef - -#define TP_DESCR_GET(t) ((t)->tp_descr_get) - -_Py_IDENTIFIER(__name__); -_Py_IDENTIFIER(__qualname__); - -PyObject * -PyMethod_Function(PyObject *im) -{ - if (!PyMethod_Check(im)) { - PyErr_BadInternalCall(); - return NULL; - } - return ((PyMethodObject *)im)->im_func; -} - -PyObject * -PyMethod_Self(PyObject *im) -{ - if (!PyMethod_Check(im)) { - PyErr_BadInternalCall(); - return NULL; - } - return ((PyMethodObject *)im)->im_self; -} - + +#define TP_DESCR_GET(t) ((t)->tp_descr_get) + +_Py_IDENTIFIER(__name__); +_Py_IDENTIFIER(__qualname__); + +PyObject * +PyMethod_Function(PyObject *im) +{ + if (!PyMethod_Check(im)) { + PyErr_BadInternalCall(); + return NULL; + } + return ((PyMethodObject *)im)->im_func; +} + +PyObject * +PyMethod_Self(PyObject *im) +{ + if (!PyMethod_Check(im)) { + PyErr_BadInternalCall(); + return NULL; + } + return ((PyMethodObject *)im)->im_self; +} + static PyObject * method_vectorcall(PyObject *method, PyObject *const *args, @@ -90,522 +90,522 @@ method_vectorcall(PyObject *method, PyObject *const *args, } -/* Method objects are used for bound instance methods returned by - instancename.methodname. ClassName.methodname returns an ordinary - function. -*/ - -PyObject * -PyMethod_New(PyObject *func, PyObject *self) -{ - if (self == NULL) { - PyErr_BadInternalCall(); - return NULL; - } +/* Method objects are used for bound instance methods returned by + instancename.methodname. ClassName.methodname returns an ordinary + function. +*/ + +PyObject * +PyMethod_New(PyObject *func, PyObject *self) +{ + if (self == NULL) { + PyErr_BadInternalCall(); + return NULL; + } PyMethodObject *im = PyObject_GC_New(PyMethodObject, &PyMethod_Type); if (im == NULL) { return NULL; - } - im->im_weakreflist = NULL; - Py_INCREF(func); - im->im_func = func; + } + im->im_weakreflist = NULL; + Py_INCREF(func); + im->im_func = func; Py_INCREF(self); - im->im_self = self; + im->im_self = self; im->vectorcall = method_vectorcall; - _PyObject_GC_TRACK(im); - return (PyObject *)im; -} - -static PyObject * + _PyObject_GC_TRACK(im); + return (PyObject *)im; +} + +static PyObject * method_reduce(PyMethodObject *im, PyObject *Py_UNUSED(ignored)) -{ - PyObject *self = PyMethod_GET_SELF(im); - PyObject *func = PyMethod_GET_FUNCTION(im); - PyObject *funcname; - _Py_IDENTIFIER(getattr); - - funcname = _PyObject_GetAttrId(func, &PyId___name__); - if (funcname == NULL) { - return NULL; - } - return Py_BuildValue("N(ON)", _PyEval_GetBuiltinId(&PyId_getattr), - self, funcname); -} - -static PyMethodDef method_methods[] = { - {"__reduce__", (PyCFunction)method_reduce, METH_NOARGS, NULL}, - {NULL, NULL} -}; - -/* Descriptors for PyMethod attributes */ - -/* im_func and im_self are stored in the PyMethod object */ - -#define MO_OFF(x) offsetof(PyMethodObject, x) - -static PyMemberDef method_memberlist[] = { +{ + PyObject *self = PyMethod_GET_SELF(im); + PyObject *func = PyMethod_GET_FUNCTION(im); + PyObject *funcname; + _Py_IDENTIFIER(getattr); + + funcname = _PyObject_GetAttrId(func, &PyId___name__); + if (funcname == NULL) { + return NULL; + } + return Py_BuildValue("N(ON)", _PyEval_GetBuiltinId(&PyId_getattr), + self, funcname); +} + +static PyMethodDef method_methods[] = { + {"__reduce__", (PyCFunction)method_reduce, METH_NOARGS, NULL}, + {NULL, NULL} +}; + +/* Descriptors for PyMethod attributes */ + +/* im_func and im_self are stored in the PyMethod object */ + +#define MO_OFF(x) offsetof(PyMethodObject, x) + +static PyMemberDef method_memberlist[] = { {"__func__", T_OBJECT, MO_OFF(im_func), READONLY, - "the function (or other callable) implementing a method"}, + "the function (or other callable) implementing a method"}, {"__self__", T_OBJECT, MO_OFF(im_self), READONLY, - "the instance to which a method is bound"}, - {NULL} /* Sentinel */ -}; - -/* Christian Tismer argued convincingly that method attributes should - (nearly) always override function attributes. - The one exception is __doc__; there's a default __doc__ which - should only be used for the class, not for instances */ - -static PyObject * -method_get_doc(PyMethodObject *im, void *context) -{ - static PyObject *docstr; - if (docstr == NULL) { - docstr= PyUnicode_InternFromString("__doc__"); - if (docstr == NULL) - return NULL; - } - return PyObject_GetAttr(im->im_func, docstr); -} - -static PyGetSetDef method_getset[] = { - {"__doc__", (getter)method_get_doc, NULL, NULL}, - {0} -}; - -static PyObject * -method_getattro(PyObject *obj, PyObject *name) -{ - PyMethodObject *im = (PyMethodObject *)obj; + "the instance to which a method is bound"}, + {NULL} /* Sentinel */ +}; + +/* Christian Tismer argued convincingly that method attributes should + (nearly) always override function attributes. + The one exception is __doc__; there's a default __doc__ which + should only be used for the class, not for instances */ + +static PyObject * +method_get_doc(PyMethodObject *im, void *context) +{ + static PyObject *docstr; + if (docstr == NULL) { + docstr= PyUnicode_InternFromString("__doc__"); + if (docstr == NULL) + return NULL; + } + return PyObject_GetAttr(im->im_func, docstr); +} + +static PyGetSetDef method_getset[] = { + {"__doc__", (getter)method_get_doc, NULL, NULL}, + {0} +}; + +static PyObject * +method_getattro(PyObject *obj, PyObject *name) +{ + PyMethodObject *im = (PyMethodObject *)obj; PyTypeObject *tp = Py_TYPE(obj); - PyObject *descr = NULL; - - { - if (tp->tp_dict == NULL) { - if (PyType_Ready(tp) < 0) - return NULL; - } - descr = _PyType_Lookup(tp, name); - } - - if (descr != NULL) { + PyObject *descr = NULL; + + { + if (tp->tp_dict == NULL) { + if (PyType_Ready(tp) < 0) + return NULL; + } + descr = _PyType_Lookup(tp, name); + } + + if (descr != NULL) { descrgetfunc f = TP_DESCR_GET(Py_TYPE(descr)); - if (f != NULL) + if (f != NULL) return f(descr, obj, (PyObject *)Py_TYPE(obj)); - else { - Py_INCREF(descr); - return descr; - } - } - - return PyObject_GetAttr(im->im_func, name); -} - -PyDoc_STRVAR(method_doc, -"method(function, instance)\n\ -\n\ -Create a bound instance method object."); - -static PyObject * -method_new(PyTypeObject* type, PyObject* args, PyObject *kw) -{ - PyObject *func; - PyObject *self; - - if (!_PyArg_NoKeywords("method", kw)) - return NULL; - if (!PyArg_UnpackTuple(args, "method", 2, 2, - &func, &self)) - return NULL; - if (!PyCallable_Check(func)) { - PyErr_SetString(PyExc_TypeError, - "first argument must be callable"); - return NULL; - } - if (self == NULL || self == Py_None) { - PyErr_SetString(PyExc_TypeError, - "self must not be None"); - return NULL; - } - - return PyMethod_New(func, self); -} - -static void -method_dealloc(PyMethodObject *im) -{ - _PyObject_GC_UNTRACK(im); - if (im->im_weakreflist != NULL) - PyObject_ClearWeakRefs((PyObject *)im); - Py_DECREF(im->im_func); - Py_XDECREF(im->im_self); + else { + Py_INCREF(descr); + return descr; + } + } + + return PyObject_GetAttr(im->im_func, name); +} + +PyDoc_STRVAR(method_doc, +"method(function, instance)\n\ +\n\ +Create a bound instance method object."); + +static PyObject * +method_new(PyTypeObject* type, PyObject* args, PyObject *kw) +{ + PyObject *func; + PyObject *self; + + if (!_PyArg_NoKeywords("method", kw)) + return NULL; + if (!PyArg_UnpackTuple(args, "method", 2, 2, + &func, &self)) + return NULL; + if (!PyCallable_Check(func)) { + PyErr_SetString(PyExc_TypeError, + "first argument must be callable"); + return NULL; + } + if (self == NULL || self == Py_None) { + PyErr_SetString(PyExc_TypeError, + "self must not be None"); + return NULL; + } + + return PyMethod_New(func, self); +} + +static void +method_dealloc(PyMethodObject *im) +{ + _PyObject_GC_UNTRACK(im); + if (im->im_weakreflist != NULL) + PyObject_ClearWeakRefs((PyObject *)im); + Py_DECREF(im->im_func); + Py_XDECREF(im->im_self); PyObject_GC_Del(im); -} - -static PyObject * -method_richcompare(PyObject *self, PyObject *other, int op) -{ - PyMethodObject *a, *b; - PyObject *res; - int eq; - - if ((op != Py_EQ && op != Py_NE) || - !PyMethod_Check(self) || - !PyMethod_Check(other)) - { - Py_RETURN_NOTIMPLEMENTED; - } - a = (PyMethodObject *)self; - b = (PyMethodObject *)other; - eq = PyObject_RichCompareBool(a->im_func, b->im_func, Py_EQ); - if (eq == 1) { +} + +static PyObject * +method_richcompare(PyObject *self, PyObject *other, int op) +{ + PyMethodObject *a, *b; + PyObject *res; + int eq; + + if ((op != Py_EQ && op != Py_NE) || + !PyMethod_Check(self) || + !PyMethod_Check(other)) + { + Py_RETURN_NOTIMPLEMENTED; + } + a = (PyMethodObject *)self; + b = (PyMethodObject *)other; + eq = PyObject_RichCompareBool(a->im_func, b->im_func, Py_EQ); + if (eq == 1) { eq = (a->im_self == b->im_self); - } + } else if (eq < 0) - return NULL; - if (op == Py_EQ) - res = eq ? Py_True : Py_False; - else - res = eq ? Py_False : Py_True; - Py_INCREF(res); - return res; -} - -static PyObject * -method_repr(PyMethodObject *a) -{ - PyObject *self = a->im_self; - PyObject *func = a->im_func; - PyObject *funcname, *result; - const char *defname = "?"; - - if (_PyObject_LookupAttrId(func, &PyId___qualname__, &funcname) < 0 || - (funcname == NULL && - _PyObject_LookupAttrId(func, &PyId___name__, &funcname) < 0)) - { - return NULL; - } - - if (funcname != NULL && !PyUnicode_Check(funcname)) { - Py_DECREF(funcname); - funcname = NULL; - } - - /* XXX Shouldn't use repr()/%R here! */ - result = PyUnicode_FromFormat("<bound method %V of %R>", - funcname, defname, self); - - Py_XDECREF(funcname); - return result; -} - -static Py_hash_t -method_hash(PyMethodObject *a) -{ - Py_hash_t x, y; + return NULL; + if (op == Py_EQ) + res = eq ? Py_True : Py_False; + else + res = eq ? Py_False : Py_True; + Py_INCREF(res); + return res; +} + +static PyObject * +method_repr(PyMethodObject *a) +{ + PyObject *self = a->im_self; + PyObject *func = a->im_func; + PyObject *funcname, *result; + const char *defname = "?"; + + if (_PyObject_LookupAttrId(func, &PyId___qualname__, &funcname) < 0 || + (funcname == NULL && + _PyObject_LookupAttrId(func, &PyId___name__, &funcname) < 0)) + { + return NULL; + } + + if (funcname != NULL && !PyUnicode_Check(funcname)) { + Py_DECREF(funcname); + funcname = NULL; + } + + /* XXX Shouldn't use repr()/%R here! */ + result = PyUnicode_FromFormat("<bound method %V of %R>", + funcname, defname, self); + + Py_XDECREF(funcname); + return result; +} + +static Py_hash_t +method_hash(PyMethodObject *a) +{ + Py_hash_t x, y; x = _Py_HashPointer(a->im_self); - y = PyObject_Hash(a->im_func); - if (y == -1) - return -1; - x = x ^ y; - if (x == -1) - x = -2; - return x; -} - -static int -method_traverse(PyMethodObject *im, visitproc visit, void *arg) -{ - Py_VISIT(im->im_func); - Py_VISIT(im->im_self); - return 0; -} - -static PyObject * -method_descr_get(PyObject *meth, PyObject *obj, PyObject *cls) -{ + y = PyObject_Hash(a->im_func); + if (y == -1) + return -1; + x = x ^ y; + if (x == -1) + x = -2; + return x; +} + +static int +method_traverse(PyMethodObject *im, visitproc visit, void *arg) +{ + Py_VISIT(im->im_func); + Py_VISIT(im->im_self); + return 0; +} + +static PyObject * +method_descr_get(PyObject *meth, PyObject *obj, PyObject *cls) +{ Py_INCREF(meth); return meth; -} - -PyTypeObject PyMethod_Type = { - PyVarObject_HEAD_INIT(&PyType_Type, 0) - "method", - sizeof(PyMethodObject), - 0, - (destructor)method_dealloc, /* tp_dealloc */ +} + +PyTypeObject PyMethod_Type = { + PyVarObject_HEAD_INIT(&PyType_Type, 0) + "method", + sizeof(PyMethodObject), + 0, + (destructor)method_dealloc, /* tp_dealloc */ offsetof(PyMethodObject, vectorcall), /* tp_vectorcall_offset */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ 0, /* tp_as_async */ - (reprfunc)method_repr, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - (hashfunc)method_hash, /* tp_hash */ + (reprfunc)method_repr, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + (hashfunc)method_hash, /* tp_hash */ PyVectorcall_Call, /* tp_call */ - 0, /* tp_str */ - method_getattro, /* tp_getattro */ - PyObject_GenericSetAttr, /* tp_setattro */ - 0, /* tp_as_buffer */ + 0, /* tp_str */ + method_getattro, /* tp_getattro */ + PyObject_GenericSetAttr, /* tp_setattro */ + 0, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_HAVE_VECTORCALL, /* tp_flags */ - method_doc, /* tp_doc */ - (traverseproc)method_traverse, /* tp_traverse */ - 0, /* tp_clear */ - method_richcompare, /* tp_richcompare */ - offsetof(PyMethodObject, im_weakreflist), /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - method_methods, /* tp_methods */ - method_memberlist, /* tp_members */ - method_getset, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - method_descr_get, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - 0, /* tp_alloc */ - method_new, /* tp_new */ -}; - -/* ------------------------------------------------------------------------ - * instance method - */ - -PyObject * -PyInstanceMethod_New(PyObject *func) { - PyInstanceMethodObject *method; - method = PyObject_GC_New(PyInstanceMethodObject, - &PyInstanceMethod_Type); - if (method == NULL) return NULL; - Py_INCREF(func); - method->func = func; - _PyObject_GC_TRACK(method); - return (PyObject *)method; -} - -PyObject * -PyInstanceMethod_Function(PyObject *im) -{ - if (!PyInstanceMethod_Check(im)) { - PyErr_BadInternalCall(); - return NULL; - } - return PyInstanceMethod_GET_FUNCTION(im); -} - -#define IMO_OFF(x) offsetof(PyInstanceMethodObject, x) - -static PyMemberDef instancemethod_memberlist[] = { + method_doc, /* tp_doc */ + (traverseproc)method_traverse, /* tp_traverse */ + 0, /* tp_clear */ + method_richcompare, /* tp_richcompare */ + offsetof(PyMethodObject, im_weakreflist), /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + method_methods, /* tp_methods */ + method_memberlist, /* tp_members */ + method_getset, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + method_descr_get, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + 0, /* tp_alloc */ + method_new, /* tp_new */ +}; + +/* ------------------------------------------------------------------------ + * instance method + */ + +PyObject * +PyInstanceMethod_New(PyObject *func) { + PyInstanceMethodObject *method; + method = PyObject_GC_New(PyInstanceMethodObject, + &PyInstanceMethod_Type); + if (method == NULL) return NULL; + Py_INCREF(func); + method->func = func; + _PyObject_GC_TRACK(method); + return (PyObject *)method; +} + +PyObject * +PyInstanceMethod_Function(PyObject *im) +{ + if (!PyInstanceMethod_Check(im)) { + PyErr_BadInternalCall(); + return NULL; + } + return PyInstanceMethod_GET_FUNCTION(im); +} + +#define IMO_OFF(x) offsetof(PyInstanceMethodObject, x) + +static PyMemberDef instancemethod_memberlist[] = { {"__func__", T_OBJECT, IMO_OFF(func), READONLY, - "the function (or other callable) implementing a method"}, - {NULL} /* Sentinel */ -}; - -static PyObject * -instancemethod_get_doc(PyObject *self, void *context) -{ - static PyObject *docstr; - if (docstr == NULL) { - docstr = PyUnicode_InternFromString("__doc__"); - if (docstr == NULL) - return NULL; - } - return PyObject_GetAttr(PyInstanceMethod_GET_FUNCTION(self), docstr); -} - -static PyGetSetDef instancemethod_getset[] = { - {"__doc__", (getter)instancemethod_get_doc, NULL, NULL}, - {0} -}; - -static PyObject * -instancemethod_getattro(PyObject *self, PyObject *name) -{ + "the function (or other callable) implementing a method"}, + {NULL} /* Sentinel */ +}; + +static PyObject * +instancemethod_get_doc(PyObject *self, void *context) +{ + static PyObject *docstr; + if (docstr == NULL) { + docstr = PyUnicode_InternFromString("__doc__"); + if (docstr == NULL) + return NULL; + } + return PyObject_GetAttr(PyInstanceMethod_GET_FUNCTION(self), docstr); +} + +static PyGetSetDef instancemethod_getset[] = { + {"__doc__", (getter)instancemethod_get_doc, NULL, NULL}, + {0} +}; + +static PyObject * +instancemethod_getattro(PyObject *self, PyObject *name) +{ PyTypeObject *tp = Py_TYPE(self); - PyObject *descr = NULL; - - if (tp->tp_dict == NULL) { - if (PyType_Ready(tp) < 0) - return NULL; - } - descr = _PyType_Lookup(tp, name); - - if (descr != NULL) { + PyObject *descr = NULL; + + if (tp->tp_dict == NULL) { + if (PyType_Ready(tp) < 0) + return NULL; + } + descr = _PyType_Lookup(tp, name); + + if (descr != NULL) { descrgetfunc f = TP_DESCR_GET(Py_TYPE(descr)); - if (f != NULL) + if (f != NULL) return f(descr, self, (PyObject *)Py_TYPE(self)); - else { - Py_INCREF(descr); - return descr; - } - } - - return PyObject_GetAttr(PyInstanceMethod_GET_FUNCTION(self), name); -} - -static void -instancemethod_dealloc(PyObject *self) { - _PyObject_GC_UNTRACK(self); - Py_DECREF(PyInstanceMethod_GET_FUNCTION(self)); - PyObject_GC_Del(self); -} - -static int -instancemethod_traverse(PyObject *self, visitproc visit, void *arg) { - Py_VISIT(PyInstanceMethod_GET_FUNCTION(self)); - return 0; -} - -static PyObject * -instancemethod_call(PyObject *self, PyObject *arg, PyObject *kw) -{ + else { + Py_INCREF(descr); + return descr; + } + } + + return PyObject_GetAttr(PyInstanceMethod_GET_FUNCTION(self), name); +} + +static void +instancemethod_dealloc(PyObject *self) { + _PyObject_GC_UNTRACK(self); + Py_DECREF(PyInstanceMethod_GET_FUNCTION(self)); + PyObject_GC_Del(self); +} + +static int +instancemethod_traverse(PyObject *self, visitproc visit, void *arg) { + Py_VISIT(PyInstanceMethod_GET_FUNCTION(self)); + return 0; +} + +static PyObject * +instancemethod_call(PyObject *self, PyObject *arg, PyObject *kw) +{ return PyObject_Call(PyInstanceMethod_GET_FUNCTION(self), arg, kw); -} - -static PyObject * -instancemethod_descr_get(PyObject *descr, PyObject *obj, PyObject *type) { - PyObject *func = PyInstanceMethod_GET_FUNCTION(descr); - if (obj == NULL) { - Py_INCREF(func); - return func; - } - else - return PyMethod_New(func, obj); -} - -static PyObject * -instancemethod_richcompare(PyObject *self, PyObject *other, int op) -{ - PyInstanceMethodObject *a, *b; - PyObject *res; - int eq; - - if ((op != Py_EQ && op != Py_NE) || - !PyInstanceMethod_Check(self) || - !PyInstanceMethod_Check(other)) - { - Py_RETURN_NOTIMPLEMENTED; - } - a = (PyInstanceMethodObject *)self; - b = (PyInstanceMethodObject *)other; - eq = PyObject_RichCompareBool(a->func, b->func, Py_EQ); - if (eq < 0) - return NULL; - if (op == Py_EQ) - res = eq ? Py_True : Py_False; - else - res = eq ? Py_False : Py_True; - Py_INCREF(res); - return res; -} - -static PyObject * -instancemethod_repr(PyObject *self) -{ - PyObject *func = PyInstanceMethod_Function(self); - PyObject *funcname, *result; - const char *defname = "?"; - - if (func == NULL) { - PyErr_BadInternalCall(); - return NULL; - } - - if (_PyObject_LookupAttrId(func, &PyId___name__, &funcname) < 0) { - return NULL; - } - if (funcname != NULL && !PyUnicode_Check(funcname)) { - Py_DECREF(funcname); - funcname = NULL; - } - - result = PyUnicode_FromFormat("<instancemethod %V at %p>", - funcname, defname, self); - - Py_XDECREF(funcname); - return result; -} - -/* -static long -instancemethod_hash(PyObject *self) -{ - long x, y; - x = (long)self; - y = PyObject_Hash(PyInstanceMethod_GET_FUNCTION(self)); - if (y == -1) - return -1; - x = x ^ y; - if (x == -1) - x = -2; - return x; -} -*/ - -PyDoc_STRVAR(instancemethod_doc, -"instancemethod(function)\n\ -\n\ -Bind a function to a class."); - -static PyObject * -instancemethod_new(PyTypeObject* type, PyObject* args, PyObject *kw) -{ - PyObject *func; - - if (!_PyArg_NoKeywords("instancemethod", kw)) - return NULL; - if (!PyArg_UnpackTuple(args, "instancemethod", 1, 1, &func)) - return NULL; - if (!PyCallable_Check(func)) { - PyErr_SetString(PyExc_TypeError, - "first argument must be callable"); - return NULL; - } - - return PyInstanceMethod_New(func); -} - -PyTypeObject PyInstanceMethod_Type = { - PyVarObject_HEAD_INIT(&PyType_Type, 0) - "instancemethod", /* tp_name */ - sizeof(PyInstanceMethodObject), /* tp_basicsize */ - 0, /* tp_itemsize */ - instancemethod_dealloc, /* tp_dealloc */ +} + +static PyObject * +instancemethod_descr_get(PyObject *descr, PyObject *obj, PyObject *type) { + PyObject *func = PyInstanceMethod_GET_FUNCTION(descr); + if (obj == NULL) { + Py_INCREF(func); + return func; + } + else + return PyMethod_New(func, obj); +} + +static PyObject * +instancemethod_richcompare(PyObject *self, PyObject *other, int op) +{ + PyInstanceMethodObject *a, *b; + PyObject *res; + int eq; + + if ((op != Py_EQ && op != Py_NE) || + !PyInstanceMethod_Check(self) || + !PyInstanceMethod_Check(other)) + { + Py_RETURN_NOTIMPLEMENTED; + } + a = (PyInstanceMethodObject *)self; + b = (PyInstanceMethodObject *)other; + eq = PyObject_RichCompareBool(a->func, b->func, Py_EQ); + if (eq < 0) + return NULL; + if (op == Py_EQ) + res = eq ? Py_True : Py_False; + else + res = eq ? Py_False : Py_True; + Py_INCREF(res); + return res; +} + +static PyObject * +instancemethod_repr(PyObject *self) +{ + PyObject *func = PyInstanceMethod_Function(self); + PyObject *funcname, *result; + const char *defname = "?"; + + if (func == NULL) { + PyErr_BadInternalCall(); + return NULL; + } + + if (_PyObject_LookupAttrId(func, &PyId___name__, &funcname) < 0) { + return NULL; + } + if (funcname != NULL && !PyUnicode_Check(funcname)) { + Py_DECREF(funcname); + funcname = NULL; + } + + result = PyUnicode_FromFormat("<instancemethod %V at %p>", + funcname, defname, self); + + Py_XDECREF(funcname); + return result; +} + +/* +static long +instancemethod_hash(PyObject *self) +{ + long x, y; + x = (long)self; + y = PyObject_Hash(PyInstanceMethod_GET_FUNCTION(self)); + if (y == -1) + return -1; + x = x ^ y; + if (x == -1) + x = -2; + return x; +} +*/ + +PyDoc_STRVAR(instancemethod_doc, +"instancemethod(function)\n\ +\n\ +Bind a function to a class."); + +static PyObject * +instancemethod_new(PyTypeObject* type, PyObject* args, PyObject *kw) +{ + PyObject *func; + + if (!_PyArg_NoKeywords("instancemethod", kw)) + return NULL; + if (!PyArg_UnpackTuple(args, "instancemethod", 1, 1, &func)) + return NULL; + if (!PyCallable_Check(func)) { + PyErr_SetString(PyExc_TypeError, + "first argument must be callable"); + return NULL; + } + + return PyInstanceMethod_New(func); +} + +PyTypeObject PyInstanceMethod_Type = { + PyVarObject_HEAD_INIT(&PyType_Type, 0) + "instancemethod", /* tp_name */ + sizeof(PyInstanceMethodObject), /* tp_basicsize */ + 0, /* tp_itemsize */ + instancemethod_dealloc, /* tp_dealloc */ 0, /* tp_vectorcall_offset */ - 0, /* tp_getattr */ - 0, /* tp_setattr */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ 0, /* tp_as_async */ - (reprfunc)instancemethod_repr, /* tp_repr */ - 0, /* tp_as_number */ - 0, /* tp_as_sequence */ - 0, /* tp_as_mapping */ - 0, /*(hashfunc)instancemethod_hash, tp_hash */ - instancemethod_call, /* tp_call */ - 0, /* tp_str */ - instancemethod_getattro, /* tp_getattro */ - PyObject_GenericSetAttr, /* tp_setattro */ - 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT - | Py_TPFLAGS_HAVE_GC, /* tp_flags */ - instancemethod_doc, /* tp_doc */ - instancemethod_traverse, /* tp_traverse */ - 0, /* tp_clear */ - instancemethod_richcompare, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - 0, /* tp_methods */ - instancemethod_memberlist, /* tp_members */ - instancemethod_getset, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - instancemethod_descr_get, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - 0, /* tp_init */ - 0, /* tp_alloc */ - instancemethod_new, /* tp_new */ -}; + (reprfunc)instancemethod_repr, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /*(hashfunc)instancemethod_hash, tp_hash */ + instancemethod_call, /* tp_call */ + 0, /* tp_str */ + instancemethod_getattro, /* tp_getattro */ + PyObject_GenericSetAttr, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT + | Py_TPFLAGS_HAVE_GC, /* tp_flags */ + instancemethod_doc, /* tp_doc */ + instancemethod_traverse, /* tp_traverse */ + 0, /* tp_clear */ + instancemethod_richcompare, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + 0, /* tp_methods */ + instancemethod_memberlist, /* tp_members */ + instancemethod_getset, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + instancemethod_descr_get, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + 0, /* tp_alloc */ + instancemethod_new, /* tp_new */ +}; |
