]> granicus.if.org Git - python/commitdiff
Add support for the iterator protocol to weakref proxy objects.
authorFred Drake <fdrake@acm.org>
Fri, 9 Aug 2002 18:34:16 +0000 (18:34 +0000)
committerFred Drake <fdrake@acm.org>
Fri, 9 Aug 2002 18:34:16 +0000 (18:34 +0000)
Part of fixing SF bug #591704.

Objects/weakrefobject.c

index 021670a9936a74b3f1e104c6a15fdd8dd8b1e24d..b059080ab42ab78fe74f3b71f5d2394a40ed10d5 100644 (file)
@@ -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 */
 };