From f16c3dc81b33c5eaf977ff850c056f3c05143742 Mon Sep 17 00:00:00 2001 From: Fred Drake Date: Fri, 9 Aug 2002 18:34:16 +0000 Subject: Add support for the iterator protocol to weakref proxy objects. Part of fixing SF bug #591704. --- Objects/weakrefobject.c | 102 ++++++++++++++++++++++++++++++------------------ 1 file 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 */ }; -- cgit v0.12