mirror of
https://github.com/python/cpython.git
synced 2025-12-10 11:00:14 +00:00
Add support for the iterator protocol to weakref proxy objects.
Part of fixing SF bug #591704.
This commit is contained in:
parent
ca3ac7f639
commit
f16c3dc81b
1 changed files with 64 additions and 38 deletions
|
|
@ -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 = {
|
||||||
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 = {
|
||||||
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 */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue