summaryrefslogtreecommitdiffstats
path: root/Include
diff options
context:
space:
mode:
authorFred Drake <fdrake@acm.org>2004-07-02 18:57:45 (GMT)
committerFred Drake <fdrake@acm.org>2004-07-02 18:57:45 (GMT)
commit0a4dd390bf653128de8bc2e99da64967c8cdf86e (patch)
tree9c3b3989bc85eda1277464459cda1eae87f5d7a5 /Include
parent813914049de32303ce31cae11abe9c5a49a08a4e (diff)
downloadcpython-0a4dd390bf653128de8bc2e99da64967c8cdf86e.zip
cpython-0a4dd390bf653128de8bc2e99da64967c8cdf86e.tar.gz
cpython-0a4dd390bf653128de8bc2e99da64967c8cdf86e.tar.bz2
Make weak references subclassable:
- weakref.ref and weakref.ReferenceType will become aliases for each other - weakref.ref will be a modern, new-style class with proper __new__ and __init__ methods - weakref.WeakValueDictionary will have a lighter memory footprint, using a new weakref.ref subclass to associate the key with the value, allowing us to have only a single object of overhead for each dictionary entry (currently, there are 3 objects of overhead per entry: a weakref to the value, a weakref to the dictionary, and a function object used as a weakref callback; the weakref to the dictionary could be avoided without this change) - a new macro, PyWeakref_CheckRefExact(), will be added - PyWeakref_CheckRef() will check for subclasses of weakref.ref This closes SF patch #983019.
Diffstat (limited to 'Include')
-rw-r--r--Include/weakrefobject.h7
1 files changed, 6 insertions, 1 deletions
diff --git a/Include/weakrefobject.h b/Include/weakrefobject.h
index effa0ed..3503892 100644
--- a/Include/weakrefobject.h
+++ b/Include/weakrefobject.h
@@ -22,11 +22,16 @@ PyAPI_DATA(PyTypeObject) _PyWeakref_RefType;
PyAPI_DATA(PyTypeObject) _PyWeakref_ProxyType;
PyAPI_DATA(PyTypeObject) _PyWeakref_CallableProxyType;
-#define PyWeakref_CheckRef(op) \
+#define PyWeakref_CheckRef(op) PyObject_TypeCheck(op, &_PyWeakref_RefType)
+#define PyWeakref_CheckRefExact(op) \
((op)->ob_type == &_PyWeakref_RefType)
#define PyWeakref_CheckProxy(op) \
(((op)->ob_type == &_PyWeakref_ProxyType) || \
((op)->ob_type == &_PyWeakref_CallableProxyType))
+
+/* This macro calls PyWeakref_CheckRef() last since that can involve a
+ function call; this makes it more likely that the function call
+ will be avoided. */
#define PyWeakref_Check(op) \
(PyWeakref_CheckRef(op) || PyWeakref_CheckProxy(op))