]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
closes bpo-36188: Clean up 'unbound' method left-overs. (GH-12169)
authorMartijn Pieters <github.com@zopatista.com>
Tue, 5 Mar 2019 05:19:34 +0000 (05:19 +0000)
committerBenjamin Peterson <benjamin@python.org>
Tue, 5 Mar 2019 05:19:34 +0000 (21:19 -0800)
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.

Doc/reference/datamodel.rst
Misc/NEWS.d/next/Core and Builtins/2019-03-04-18-05-31.bpo-36188.EuUZNz.rst [new file with mode: 0644]
Objects/classobject.c

index 9422ae66cb9c11bfc120351d62d5372b36a98a32..c3e79ce6c88120705030a13e2f025be6083a8437 100644 (file)
@@ -578,12 +578,6 @@ Callable types
       to be bound.  The new method's :attr:`__func__` attribute is the original
       function object.
 
-      When a user-defined method object is created by retrieving another method
-      object from a class or instance, the behaviour is the same as for a
-      function object, except that the :attr:`__func__` attribute of the new
-      instance is not the original method object but its :attr:`__func__`
-      attribute.
-
       When an instance method object is created by retrieving a class method
       object from a class or instance, its :attr:`__self__` attribute is the
       class itself, and its :attr:`__func__` attribute is the function object
diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-03-04-18-05-31.bpo-36188.EuUZNz.rst b/Misc/NEWS.d/next/Core and Builtins/2019-03-04-18-05-31.bpo-36188.EuUZNz.rst
new file mode 100644 (file)
index 0000000..f018e31
--- /dev/null
@@ -0,0 +1,2 @@
+Cleaned up left-over vestiges of Python 2 unbound method handling in method objects and documentation.\r
+Patch by Martijn Pieters
\ No newline at end of file
index 0d1cf7a95ccca66d39120225cd8ebc4bc336494f..1ee897847fb03e33f45fddcbd867fdf0e8e5d8ff 100644 (file)
@@ -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 = {