Kaydet (Commit) f16c3dc8 authored tarafından Fred Drake's avatar Fred Drake

Add support for the iterator protocol to weakref proxy objects.

Part of fixing SF bug #591704.
üst ca3ac7f6
...@@ -383,6 +383,24 @@ proxy_setitem(PyWeakReference *proxy, PyObject *key, PyObject *value) ...@@ -383,6 +383,24 @@ proxy_setitem(PyWeakReference *proxy, PyObject *key, PyObject *value)
return PyObject_SetItem(PyWeakref_GET_OBJECT(proxy), key, 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 = { static PyNumberMethods proxy_as_number = {
(binaryfunc)proxy_add, /*nb_add*/ (binaryfunc)proxy_add, /*nb_add*/
...@@ -447,26 +465,30 @@ _PyWeakref_ProxyType = { ...@@ -447,26 +465,30 @@ _PyWeakref_ProxyType = {
sizeof(PyWeakReference), sizeof(PyWeakReference),
0, 0,
/* methods */ /* methods */
(destructor)weakref_dealloc,/*tp_dealloc*/ (destructor)weakref_dealloc, /* tp_dealloc */
(printfunc)proxy_print, /*tp_print*/ (printfunc)proxy_print, /* tp_print */
0, /*tp_getattr*/ 0, /* tp_getattr */
0, /*tp_setattr*/ 0, /* tp_setattr */
proxy_compare, /*tp_compare*/ proxy_compare, /* tp_compare */
(unaryfunc)proxy_repr, /*tp_repr*/ (unaryfunc)proxy_repr, /* tp_repr */
&proxy_as_number, /*tp_as_number*/ &proxy_as_number, /* tp_as_number */
&proxy_as_sequence, /*tp_as_sequence*/ &proxy_as_sequence, /* tp_as_sequence */
&proxy_as_mapping, /*tp_as_mapping*/ &proxy_as_mapping, /* tp_as_mapping */
0, /*tp_hash*/ 0, /* tp_hash */
(ternaryfunc)0, /*tp_call*/ (ternaryfunc)0, /* tp_call */
(unaryfunc)proxy_str, /*tp_str*/ (unaryfunc)proxy_str, /* tp_str */
(getattrofunc)proxy_getattr,/*tp_getattro*/ (getattrofunc)proxy_getattr, /* tp_getattro */
(setattrofunc)proxy_setattr,/*tp_setattro*/ (setattrofunc)proxy_setattr, /* tp_setattro */
0, /*tp_as_buffer*/ 0, /* tp_as_buffer */
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC
|Py_TPFLAGS_CHECKTYPES, /*tp_flags*/ | Py_TPFLAGS_CHECKTYPES, /* tp_flags */
0, /*tp_doc*/ 0, /* tp_doc */
(traverseproc)gc_traverse, /*tp_traverse*/ (traverseproc)gc_traverse, /* tp_traverse */
(inquiry)gc_clear, /*tp_clear*/ (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 = { ...@@ -478,26 +500,30 @@ _PyWeakref_CallableProxyType = {
sizeof(PyWeakReference), sizeof(PyWeakReference),
0, 0,
/* methods */ /* methods */
(destructor)weakref_dealloc,/*tp_dealloc*/ (destructor)weakref_dealloc, /* tp_dealloc */
(printfunc)proxy_print, /*tp_print*/ (printfunc)proxy_print, /* tp_print */
0, /*tp_getattr*/ 0, /* tp_getattr */
0, /*tp_setattr*/ 0, /* tp_setattr */
proxy_compare, /*tp_compare*/ proxy_compare, /* tp_compare */
(unaryfunc)proxy_repr, /*tp_repr*/ (unaryfunc)proxy_repr, /* tp_repr */
&proxy_as_number, /*tp_as_number*/ &proxy_as_number, /* tp_as_number */
&proxy_as_sequence, /*tp_as_sequence*/ &proxy_as_sequence, /* tp_as_sequence */
&proxy_as_mapping, /*tp_as_mapping*/ &proxy_as_mapping, /* tp_as_mapping */
0, /*tp_hash*/ 0, /* tp_hash */
(ternaryfunc)proxy_call, /*tp_call*/ (ternaryfunc)proxy_call, /* tp_call */
(unaryfunc)proxy_str, /*tp_str*/ (unaryfunc)proxy_str, /* tp_str */
(getattrofunc)proxy_getattr,/*tp_getattro*/ (getattrofunc)proxy_getattr, /* tp_getattro */
(setattrofunc)proxy_setattr,/*tp_setattro*/ (setattrofunc)proxy_setattr, /* tp_setattro */
0, /*tp_as_buffer*/ 0, /* tp_as_buffer */
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC
|Py_TPFLAGS_CHECKTYPES, /*tp_flags*/ | Py_TPFLAGS_CHECKTYPES, /* tp_flags */
0, /*tp_doc*/ 0, /* tp_doc */
(traverseproc)gc_traverse, /*tp_traverse*/ (traverseproc)gc_traverse, /* tp_traverse */
(inquiry)gc_clear, /*tp_clear*/ (inquiry)gc_clear, /* tp_clear */
0, /* tp_richcompare */
0, /* tp_weaklistoffset */
(getiterfunc)proxy_iter, /* tp_iter */
(iternextfunc)proxy_iternext, /* tp_iternext */
}; };
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment