mirror of
https://github.com/python/cpython.git
synced 2025-08-04 00:48:58 +00:00
closes bpo-36188: Clean up 'unbound' method left-overs. (GH-12169)
Methods are always bound, and `__self__` can no longer be `NULL` (`method_new()` and `PyMethod_New()` both explicitly check for this). Moreover, once a bound method is bound, it *stays* bound and won't be re-bound to something else, so the section in the datamodel that talks about accessing an methods in a different descriptor-binding context doesn't apply any more in Python 3.
This commit is contained in:
parent
0983fcd0d5
commit
b727239575
3 changed files with 5 additions and 24 deletions
|
@ -267,10 +267,7 @@ static Py_hash_t
|
|||
method_hash(PyMethodObject *a)
|
||||
{
|
||||
Py_hash_t x, y;
|
||||
if (a->im_self == NULL)
|
||||
x = _Py_HashPointer(Py_None);
|
||||
else
|
||||
x = _Py_HashPointer(a->im_self);
|
||||
x = _Py_HashPointer(a->im_self);
|
||||
y = PyObject_Hash(a->im_func);
|
||||
if (y == -1)
|
||||
return -1;
|
||||
|
@ -294,11 +291,6 @@ method_call(PyObject *method, PyObject *args, PyObject *kwargs)
|
|||
PyObject *self, *func;
|
||||
|
||||
self = PyMethod_GET_SELF(method);
|
||||
if (self == NULL) {
|
||||
PyErr_BadInternalCall();
|
||||
return NULL;
|
||||
}
|
||||
|
||||
func = PyMethod_GET_FUNCTION(method);
|
||||
|
||||
return _PyObject_Call_Prepend(func, self, args, kwargs);
|
||||
|
@ -307,15 +299,8 @@ method_call(PyObject *method, PyObject *args, PyObject *kwargs)
|
|||
static PyObject *
|
||||
method_descr_get(PyObject *meth, PyObject *obj, PyObject *cls)
|
||||
{
|
||||
/* Don't rebind an already bound method of a class that's not a base
|
||||
class of cls. */
|
||||
if (PyMethod_GET_SELF(meth) != NULL) {
|
||||
/* Already bound */
|
||||
Py_INCREF(meth);
|
||||
return meth;
|
||||
}
|
||||
/* Bind it to obj */
|
||||
return PyMethod_New(PyMethod_GET_FUNCTION(meth), obj);
|
||||
Py_INCREF(meth);
|
||||
return meth;
|
||||
}
|
||||
|
||||
PyTypeObject PyMethod_Type = {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue