mirror of
https://github.com/python/cpython.git
synced 2025-09-26 18:29:57 +00:00
bpo-44523: Remove the pass-through for hash() in weakref proxy objects (GH-26950)
This commit is contained in:
parent
12803c59d5
commit
e2fea101fd
3 changed files with 15 additions and 20 deletions
|
@ -422,14 +422,20 @@ class ReferencesTestCase(TestBase):
|
||||||
self.assertEqual("".join(reversed(weakref.proxy(obj))), "cba")
|
self.assertEqual("".join(reversed(weakref.proxy(obj))), "cba")
|
||||||
|
|
||||||
def test_proxy_hash(self):
|
def test_proxy_hash(self):
|
||||||
cool_hash = 299_792_458
|
|
||||||
|
|
||||||
class MyObj:
|
class MyObj:
|
||||||
def __hash__(self):
|
def __hash__(self):
|
||||||
return cool_hash
|
return 42
|
||||||
|
|
||||||
obj = MyObj()
|
obj = MyObj()
|
||||||
self.assertEqual(hash(weakref.proxy(obj)), cool_hash)
|
with self.assertRaises(TypeError):
|
||||||
|
hash(weakref.proxy(obj))
|
||||||
|
|
||||||
|
class MyObj:
|
||||||
|
__hash__ = None
|
||||||
|
|
||||||
|
obj = MyObj()
|
||||||
|
with self.assertRaises(TypeError):
|
||||||
|
hash(weakref.proxy(obj))
|
||||||
|
|
||||||
def test_getweakrefcount(self):
|
def test_getweakrefcount(self):
|
||||||
o = C()
|
o = C()
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
Remove the pass-through for :func:`hash` of :class:`weakref.proxy` objects
|
||||||
|
to prevent unintended consequences when the original referred object
|
||||||
|
dies while the proxy is part of a hashable object. Patch by Pablo Galindo.
|
|
@ -732,21 +732,6 @@ static PyMappingMethods proxy_as_mapping = {
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
static Py_hash_t
|
|
||||||
proxy_hash(PyObject *self)
|
|
||||||
{
|
|
||||||
PyWeakReference *proxy = (PyWeakReference *)self;
|
|
||||||
if (!proxy_checkref(proxy)) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
PyObject *obj = PyWeakref_GET_OBJECT(proxy);
|
|
||||||
Py_INCREF(obj);
|
|
||||||
Py_hash_t res = PyObject_Hash(obj);
|
|
||||||
Py_DECREF(obj);
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
PyTypeObject
|
PyTypeObject
|
||||||
_PyWeakref_ProxyType = {
|
_PyWeakref_ProxyType = {
|
||||||
PyVarObject_HEAD_INIT(&PyType_Type, 0)
|
PyVarObject_HEAD_INIT(&PyType_Type, 0)
|
||||||
|
@ -763,7 +748,8 @@ _PyWeakref_ProxyType = {
|
||||||
&proxy_as_number, /* tp_as_number */
|
&proxy_as_number, /* tp_as_number */
|
||||||
&proxy_as_sequence, /* tp_as_sequence */
|
&proxy_as_sequence, /* tp_as_sequence */
|
||||||
&proxy_as_mapping, /* tp_as_mapping */
|
&proxy_as_mapping, /* tp_as_mapping */
|
||||||
proxy_hash, /* tp_hash */
|
// Notice that tp_hash is intentionally omitted as proxies are "mutable" (when the reference dies).
|
||||||
|
0, /* tp_hash */
|
||||||
0, /* tp_call */
|
0, /* tp_call */
|
||||||
proxy_str, /* tp_str */
|
proxy_str, /* tp_str */
|
||||||
proxy_getattr, /* tp_getattro */
|
proxy_getattr, /* tp_getattro */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue