summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Doc/reference/datamodel.rst6
-rw-r--r--Misc/NEWS.d/next/Core and Builtins/2019-03-04-18-05-31.bpo-36188.EuUZNz.rst2
-rw-r--r--Objects/classobject.c21
3 files changed, 5 insertions, 24 deletions
diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst
index 9422ae6..c3e79ce 100644
--- a/Doc/reference/datamodel.rst
+++ b/Doc/reference/datamodel.rst
@@ -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
index 0000000..f018e31
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2019-03-04-18-05-31.bpo-36188.EuUZNz.rst
@@ -0,0 +1,2 @@
+Cleaned up left-over vestiges of Python 2 unbound method handling in method objects and documentation.
+Patch by Martijn Pieters \ No newline at end of file
diff --git a/Objects/classobject.c b/Objects/classobject.c
index 0d1cf7a..1ee8978 100644
--- a/Objects/classobject.c
+++ b/Objects/classobject.c
@@ -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 = {