summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFred Drake <fdrake@acm.org>2002-08-09 18:34:16 (GMT)
committerFred Drake <fdrake@acm.org>2002-08-09 18:34:16 (GMT)
commitf16c3dc81b33c5eaf977ff850c056f3c05143742 (patch)
tree7f31297379d22229ee8915f9ab1dabed393663e1
parentca3ac7f639cf48629b896ffc88b3be9308bf6596 (diff)
downloadcpython-f16c3dc81b33c5eaf977ff850c056f3c05143742.zip
cpython-f16c3dc81b33c5eaf977ff850c056f3c05143742.tar.gz
cpython-f16c3dc81b33c5eaf977ff850c056f3c05143742.tar.bz2
Add support for the iterator protocol to weakref proxy objects.
Part of fixing SF bug #591704.
-rw-r--r--Objects/weakrefobject.c102
1 files changed, 64 insertions, 38 deletions
diff --git a/Objects/weakrefobject.c b/Objects/weakrefobject.c
index 021670a..b059080 100644
--- a/Objects/weakrefobject.c
+++ b/Objects/weakrefobject.c
@@ -383,6 +383,24 @@ proxy_setitem(PyWeakReference *proxy, PyObject *key, PyObject *value)
return PyObject_SetItem(PyWeakref_GET_OBJECT(proxy), key, value);
}
+/* iterator slots */
+
+static PyObject *
+proxy_iter(PyWeakReference *proxy)
+{
+ if (!proxy_checkref(proxy))
+ return NULL;
+ return PyObject_GetIter(PyWeakref_GET_OBJECT(proxy));
+}
+
+static PyObject *
+proxy_iternext(PyWeakReference *proxy)
+{
+ if (!proxy_checkref(proxy))
+ return NULL;
+ return PyIter_Next(PyWeakref_GET_OBJECT(proxy));
+}
+
static PyNumberMethods proxy_as_number = {
(binaryfunc)proxy_add, /*nb_add*/
@@ -447,26 +465,30 @@ _PyWeakref_ProxyType = {
sizeof(PyWeakReference),
0,
/* methods */
- (destructor)weakref_dealloc,/*tp_dealloc*/
- (printfunc)proxy_print, /*tp_print*/
- 0, /*tp_getattr*/
- 0, /*tp_setattr*/
- proxy_compare, /*tp_compare*/
- (unaryfunc)proxy_repr, /*tp_repr*/
- &proxy_as_number, /*tp_as_number*/
- &proxy_as_sequence, /*tp_as_sequence*/
- &proxy_as_mapping, /*tp_as_mapping*/
- 0, /*tp_hash*/
- (ternaryfunc)0, /*tp_call*/
- (unaryfunc)proxy_str, /*tp_str*/
- (getattrofunc)proxy_getattr,/*tp_getattro*/
- (setattrofunc)proxy_setattr,/*tp_setattro*/
- 0, /*tp_as_buffer*/
+ (destructor)weakref_dealloc, /* tp_dealloc */
+ (printfunc)proxy_print, /* tp_print */
+ 0, /* tp_getattr */
+ 0, /* tp_setattr */
+ proxy_compare, /* tp_compare */
+ (unaryfunc)proxy_repr, /* tp_repr */
+ &proxy_as_number, /* tp_as_number */
+ &proxy_as_sequence, /* tp_as_sequence */
+ &proxy_as_mapping, /* tp_as_mapping */
+ 0, /* tp_hash */
+ (ternaryfunc)0, /* tp_call */
+ (unaryfunc)proxy_str, /* tp_str */
+ (getattrofunc)proxy_getattr, /* tp_getattro */
+ (setattrofunc)proxy_setattr, /* tp_setattro */
+ 0, /* tp_as_buffer */
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC
- |Py_TPFLAGS_CHECKTYPES, /*tp_flags*/
- 0, /*tp_doc*/
- (traverseproc)gc_traverse, /*tp_traverse*/
- (inquiry)gc_clear, /*tp_clear*/
+ | Py_TPFLAGS_CHECKTYPES, /* tp_flags */
+ 0, /* tp_doc */
+ (traverseproc)gc_traverse, /* tp_traverse */
+ (inquiry)gc_clear, /* tp_clear */
+ 0, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ (getiterfunc)proxy_iter, /* tp_iter */
+ (iternextfunc)proxy_iternext, /* tp_iternext */
};
@@ -478,26 +500,30 @@ _PyWeakref_CallableProxyType = {
sizeof(PyWeakReference),
0,
/* methods */
- (destructor)weakref_dealloc,/*tp_dealloc*/
- (printfunc)proxy_print, /*tp_print*/
- 0, /*tp_getattr*/
- 0, /*tp_setattr*/
- proxy_compare, /*tp_compare*/
- (unaryfunc)proxy_repr, /*tp_repr*/
- &proxy_as_number, /*tp_as_number*/
- &proxy_as_sequence, /*tp_as_sequence*/
- &proxy_as_mapping, /*tp_as_mapping*/
- 0, /*tp_hash*/
- (ternaryfunc)proxy_call, /*tp_call*/
- (unaryfunc)proxy_str, /*tp_str*/
- (getattrofunc)proxy_getattr,/*tp_getattro*/
- (setattrofunc)proxy_setattr,/*tp_setattro*/
- 0, /*tp_as_buffer*/
+ (destructor)weakref_dealloc, /* tp_dealloc */
+ (printfunc)proxy_print, /* tp_print */
+ 0, /* tp_getattr */
+ 0, /* tp_setattr */
+ proxy_compare, /* tp_compare */
+ (unaryfunc)proxy_repr, /* tp_repr */
+ &proxy_as_number, /* tp_as_number */
+ &proxy_as_sequence, /* tp_as_sequence */
+ &proxy_as_mapping, /* tp_as_mapping */
+ 0, /* tp_hash */
+ (ternaryfunc)proxy_call, /* tp_call */
+ (unaryfunc)proxy_str, /* tp_str */
+ (getattrofunc)proxy_getattr, /* tp_getattro */
+ (setattrofunc)proxy_setattr, /* tp_setattro */
+ 0, /* tp_as_buffer */
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC
- |Py_TPFLAGS_CHECKTYPES, /*tp_flags*/
- 0, /*tp_doc*/
- (traverseproc)gc_traverse, /*tp_traverse*/
- (inquiry)gc_clear, /*tp_clear*/
+ | Py_TPFLAGS_CHECKTYPES, /* tp_flags */
+ 0, /* tp_doc */
+ (traverseproc)gc_traverse, /* tp_traverse */
+ (inquiry)gc_clear, /* tp_clear */
+ 0, /* tp_richcompare */
+ 0, /* tp_weaklistoffset */
+ (getiterfunc)proxy_iter, /* tp_iter */
+ (iternextfunc)proxy_iternext, /* tp_iternext */
};