mirror of
https://github.com/python/cpython.git
synced 2025-11-25 04:34:37 +00:00
bpo-1617161: Make the hash and equality of methods not depending on the value of self. (GH-7848)
* The hash of BuiltinMethodType instances no longer depends on the hash of __self__. It depends now on the hash of id(__self__). * The hash and equality of ModuleType and MethodWrapperType instances no longer depend on the hash and equality of __self__. They depend now on the hash and equality of id(__self__). * MethodWrapperType instances no longer support ordering.
This commit is contained in:
parent
c48e26dcad
commit
ac20e0f98d
6 changed files with 112 additions and 73 deletions
|
|
@ -225,13 +225,9 @@ method_richcompare(PyObject *self, PyObject *other, int op)
|
|||
b = (PyMethodObject *)other;
|
||||
eq = PyObject_RichCompareBool(a->im_func, b->im_func, Py_EQ);
|
||||
if (eq == 1) {
|
||||
if (a->im_self == NULL || b->im_self == NULL)
|
||||
eq = a->im_self == b->im_self;
|
||||
else
|
||||
eq = PyObject_RichCompareBool(a->im_self, b->im_self,
|
||||
Py_EQ);
|
||||
eq = (a->im_self == b->im_self);
|
||||
}
|
||||
if (eq < 0)
|
||||
else if (eq < 0)
|
||||
return NULL;
|
||||
if (op == Py_EQ)
|
||||
res = eq ? Py_True : Py_False;
|
||||
|
|
@ -274,11 +270,9 @@ method_hash(PyMethodObject *a)
|
|||
{
|
||||
Py_hash_t x, y;
|
||||
if (a->im_self == NULL)
|
||||
x = PyObject_Hash(Py_None);
|
||||
x = _Py_HashPointer(Py_None);
|
||||
else
|
||||
x = PyObject_Hash(a->im_self);
|
||||
if (x == -1)
|
||||
return -1;
|
||||
x = _Py_HashPointer(a->im_self);
|
||||
y = PyObject_Hash(a->im_func);
|
||||
if (y == -1)
|
||||
return -1;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue