diff options
author | Fred Drake <fdrake@acm.org> | 2001-12-19 16:44:30 +0000 |
---|---|---|
committer | Fred Drake <fdrake@acm.org> | 2001-12-19 16:44:30 +0000 |
commit | c0af6675db5e7fa83e0fd460bb8e2eeb84929e10 (patch) | |
tree | 3c2b683791271b57ef67de70b3ae9142b219ac67 /Objects/weakrefobject.c | |
parent | e48480465607cdfa9680685bb3c0fb5b78d1f28d (diff) | |
download | cpython-c0af6675db5e7fa83e0fd460bb8e2eeb84929e10.tar.gz |
proxy_compare(): Make sure that we unwrap both objects being compared if
both are proxy objects.
Diffstat (limited to 'Objects/weakrefobject.c')
-rw-r--r-- | Objects/weakrefobject.c | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/Objects/weakrefobject.c b/Objects/weakrefobject.c index 9a94fd4fc5..2e02cf27ca 100644 --- a/Objects/weakrefobject.c +++ b/Objects/weakrefobject.c @@ -220,6 +220,13 @@ proxy_checkref(PyWeakReference *proxy) o = PyWeakref_GET_OBJECT(o); \ } +#define UNWRAP_I(o) \ + if (PyWeakref_CheckProxy(o)) { \ + if (!proxy_checkref((PyWeakReference *)o)) \ + return -1; \ + o = PyWeakref_GET_OBJECT(o); \ + } + #define WRAP_UNARY(method, generic) \ static PyObject * \ method(PyObject *proxy) { \ @@ -284,11 +291,11 @@ proxy_setattr(PyWeakReference *proxy, PyObject *name, PyObject *value) } static int -proxy_compare(PyWeakReference *proxy, PyObject *v) +proxy_compare(PyObject *proxy, PyObject *v) { - if (!proxy_checkref(proxy)) - return -1; - return PyObject_Compare(PyWeakref_GET_OBJECT(proxy), v); + UNWRAP_I(proxy); + UNWRAP_I(v); + return PyObject_Compare(proxy, v); } /* number slots */ @@ -451,7 +458,7 @@ _PyWeakref_ProxyType = { (printfunc)proxy_print, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ - (cmpfunc)proxy_compare, /*tp_compare*/ + proxy_compare, /*tp_compare*/ (unaryfunc)proxy_repr, /*tp_repr*/ &proxy_as_number, /*tp_as_number*/ &proxy_as_sequence, /*tp_as_sequence*/ @@ -482,7 +489,7 @@ _PyWeakref_CallableProxyType = { (printfunc)proxy_print, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ - (cmpfunc)proxy_compare, /*tp_compare*/ + proxy_compare, /*tp_compare*/ (unaryfunc)proxy_repr, /*tp_repr*/ &proxy_as_number, /*tp_as_number*/ &proxy_as_sequence, /*tp_as_sequence*/ |