Add support for the iterator protocol to weakref proxy objects.
Part of fixing SF bug #591704.
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 @@
     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 @@
     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 @@
     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 */
 };