Mercurial > cpython-lru_cache-weakref
comparison Python/bltinmodule.c @ 83167:504eed5a82a3
Revert a premature patch for issue #14010 (changeset 846bd418aee5).
| author | Serhiy Storchaka <storchaka@gmail.com> |
|---|---|
| date | Sat, 06 Apr 2013 22:55:12 +0300 |
| parents | 846bd418aee5 7b75f0bd9a5e |
| children | cc59c215f19e |
comparison
equal
deleted
inserted
replaced
| 83164:f315fecdfeb8 | 83167:504eed5a82a3 |
|---|---|
| 389 | 389 |
| 390 static void | 390 static void |
| 391 filter_dealloc(filterobject *lz) | 391 filter_dealloc(filterobject *lz) |
| 392 { | 392 { |
| 393 PyObject_GC_UnTrack(lz); | 393 PyObject_GC_UnTrack(lz); |
| 394 Py_TRASHCAN_SAFE_BEGIN(lz) | |
| 395 Py_XDECREF(lz->func); | 394 Py_XDECREF(lz->func); |
| 396 Py_XDECREF(lz->it); | 395 Py_XDECREF(lz->it); |
| 397 Py_TYPE(lz)->tp_free(lz); | 396 Py_TYPE(lz)->tp_free(lz); |
| 398 Py_TRASHCAN_SAFE_END(lz) | |
| 399 } | 397 } |
| 400 | 398 |
| 401 static int | 399 static int |
| 402 filter_traverse(filterobject *lz, visitproc visit, void *arg) | 400 filter_traverse(filterobject *lz, visitproc visit, void *arg) |
| 403 { | 401 { |
| 414 long ok; | 412 long ok; |
| 415 PyObject *(*iternext)(PyObject *); | 413 PyObject *(*iternext)(PyObject *); |
| 416 | 414 |
| 417 iternext = *Py_TYPE(it)->tp_iternext; | 415 iternext = *Py_TYPE(it)->tp_iternext; |
| 418 for (;;) { | 416 for (;;) { |
| 419 if (Py_EnterRecursiveCall(" while iterating")) | |
| 420 return NULL; | |
| 421 item = iternext(it); | 417 item = iternext(it); |
| 422 Py_LeaveRecursiveCall(); | |
| 423 if (item == NULL) | 418 if (item == NULL) |
| 424 return NULL; | 419 return NULL; |
| 425 | 420 |
| 426 if (lz->func == Py_None || lz->func == (PyObject *)&PyBool_Type) { | 421 if (lz->func == Py_None || lz->func == (PyObject *)&PyBool_Type) { |
| 427 ok = PyObject_IsTrue(item); | 422 ok = PyObject_IsTrue(item); |
| 1034 | 1029 |
| 1035 static void | 1030 static void |
| 1036 map_dealloc(mapobject *lz) | 1031 map_dealloc(mapobject *lz) |
| 1037 { | 1032 { |
| 1038 PyObject_GC_UnTrack(lz); | 1033 PyObject_GC_UnTrack(lz); |
| 1039 Py_TRASHCAN_SAFE_BEGIN(lz) | |
| 1040 Py_XDECREF(lz->iters); | 1034 Py_XDECREF(lz->iters); |
| 1041 Py_XDECREF(lz->func); | 1035 Py_XDECREF(lz->func); |
| 1042 Py_TYPE(lz)->tp_free(lz); | 1036 Py_TYPE(lz)->tp_free(lz); |
| 1043 Py_TRASHCAN_SAFE_END(lz) | |
| 1044 } | 1037 } |
| 1045 | 1038 |
| 1046 static int | 1039 static int |
| 1047 map_traverse(mapobject *lz, visitproc visit, void *arg) | 1040 map_traverse(mapobject *lz, visitproc visit, void *arg) |
| 1048 { | 1041 { |
| 2225 | 2218 |
| 2226 static void | 2219 static void |
| 2227 zip_dealloc(zipobject *lz) | 2220 zip_dealloc(zipobject *lz) |
| 2228 { | 2221 { |
| 2229 PyObject_GC_UnTrack(lz); | 2222 PyObject_GC_UnTrack(lz); |
| 2230 Py_TRASHCAN_SAFE_BEGIN(lz) | |
| 2231 Py_XDECREF(lz->ittuple); | 2223 Py_XDECREF(lz->ittuple); |
| 2232 Py_XDECREF(lz->result); | 2224 Py_XDECREF(lz->result); |
| 2233 Py_TYPE(lz)->tp_free(lz); | 2225 Py_TYPE(lz)->tp_free(lz); |
| 2234 Py_TRASHCAN_SAFE_END(lz) | |
| 2235 } | 2226 } |
| 2236 | 2227 |
| 2237 static int | 2228 static int |
| 2238 zip_traverse(zipobject *lz, visitproc visit, void *arg) | 2229 zip_traverse(zipobject *lz, visitproc visit, void *arg) |
| 2239 { | 2230 { |
| 2252 PyObject *item; | 2243 PyObject *item; |
| 2253 PyObject *olditem; | 2244 PyObject *olditem; |
| 2254 | 2245 |
| 2255 if (tuplesize == 0) | 2246 if (tuplesize == 0) |
| 2256 return NULL; | 2247 return NULL; |
| 2257 if (Py_EnterRecursiveCall(" while iterating")) | |
| 2258 return NULL; | |
| 2259 if (Py_REFCNT(result) == 1) { | 2248 if (Py_REFCNT(result) == 1) { |
| 2260 Py_INCREF(result); | 2249 Py_INCREF(result); |
| 2261 for (i=0 ; i < tuplesize ; i++) { | 2250 for (i=0 ; i < tuplesize ; i++) { |
| 2262 it = PyTuple_GET_ITEM(lz->ittuple, i); | 2251 it = PyTuple_GET_ITEM(lz->ittuple, i); |
| 2263 item = (*Py_TYPE(it)->tp_iternext)(it); | 2252 item = (*Py_TYPE(it)->tp_iternext)(it); |
| 2264 if (item == NULL) | 2253 if (item == NULL) { |
| 2265 goto error; | 2254 Py_DECREF(result); |
| 2255 return NULL; | |
| 2256 } | |
| 2266 olditem = PyTuple_GET_ITEM(result, i); | 2257 olditem = PyTuple_GET_ITEM(result, i); |
| 2267 PyTuple_SET_ITEM(result, i, item); | 2258 PyTuple_SET_ITEM(result, i, item); |
| 2268 Py_DECREF(olditem); | 2259 Py_DECREF(olditem); |
| 2269 } | 2260 } |
| 2270 } else { | 2261 } else { |
| 2271 result = PyTuple_New(tuplesize); | 2262 result = PyTuple_New(tuplesize); |
| 2272 if (result == NULL) | 2263 if (result == NULL) |
| 2273 goto error; | 2264 return NULL; |
| 2274 for (i=0 ; i < tuplesize ; i++) { | 2265 for (i=0 ; i < tuplesize ; i++) { |
| 2275 it = PyTuple_GET_ITEM(lz->ittuple, i); | 2266 it = PyTuple_GET_ITEM(lz->ittuple, i); |
| 2276 item = (*Py_TYPE(it)->tp_iternext)(it); | 2267 item = (*Py_TYPE(it)->tp_iternext)(it); |
| 2277 if (item == NULL) | 2268 if (item == NULL) { |
| 2278 goto error; | 2269 Py_DECREF(result); |
| 2270 return NULL; | |
| 2271 } | |
| 2279 PyTuple_SET_ITEM(result, i, item); | 2272 PyTuple_SET_ITEM(result, i, item); |
| 2280 } | 2273 } |
| 2281 } | 2274 } |
| 2282 Py_LeaveRecursiveCall(); | |
| 2283 return result; | 2275 return result; |
| 2284 error: | |
| 2285 Py_XDECREF(result); | |
| 2286 Py_LeaveRecursiveCall(); | |
| 2287 return NULL; | |
| 2288 } | 2276 } |
| 2289 | 2277 |
| 2290 static PyObject * | 2278 static PyObject * |
| 2291 zip_reduce(zipobject *lz) | 2279 zip_reduce(zipobject *lz) |
| 2292 { | 2280 { |
