{
PyGC_Head *gc = finalizers->gc.gc_next;
+ assert(!PyErr_Occurred());
if (_PyRuntime.gc.garbage == NULL) {
_PyRuntime.gc.garbage = PyList_New(0);
if (_PyRuntime.gc.garbage == NULL)
PyObject *op = FROM_GC(gc);
if ((_PyRuntime.gc.debug & DEBUG_SAVEALL) || has_legacy_finalizer(op)) {
- if (PyList_Append(_PyRuntime.gc.garbage, op) < 0)
+ if (PyList_Append(_PyRuntime.gc.garbage, op) < 0) {
+ PyErr_Clear();
break;
+ }
}
}
_PyGCHead_SET_FINALIZED(gc, 1);
Py_INCREF(op);
finalize(op);
+ assert(!PyErr_Occurred());
Py_DECREF(op);
}
}
{
inquiry clear;
+ assert(!PyErr_Occurred());
while (!gc_list_is_empty(collectable)) {
PyGC_Head *gc = collectable->gc.gc_next;
PyObject *op = FROM_GC(gc);
if (_PyRuntime.gc.debug & DEBUG_SAVEALL) {
- PyList_Append(_PyRuntime.gc.garbage, op);
+ assert(_PyRuntime.gc.garbage != NULL);
+ if (PyList_Append(_PyRuntime.gc.garbage, op) < 0) {
+ PyErr_Clear();
+ }
}
else {
if ((clear = Py_TYPE(op)->tp_clear) != NULL) {
Py_INCREF(op);
- clear(op);
+ (void) clear(op);
+ if (PyErr_Occurred()) {
+ PySys_WriteStderr("Exception ignored in tp_clear of "
+ "%.50s\n", Py_TYPE(op)->tp_name);
+ PyErr_WriteUnraisable(NULL);
+ }
Py_DECREF(op);
}
}
if (PyDTrace_GC_DONE_ENABLED())
PyDTrace_GC_DONE(n+m);
+ assert(!PyErr_Occurred());
return n+m;
}
Py_ssize_t i;
PyObject *info = NULL;
+ assert(!PyErr_Occurred());
/* we may get called very early */
if (_PyRuntime.gc.callbacks == NULL)
return;
/* The local variable cannot be rebound, check it for sanity */
- assert(_PyRuntime.gc.callbacks != NULL && PyList_CheckExact(_PyRuntime.gc.callbacks));
+ assert(PyList_CheckExact(_PyRuntime.gc.callbacks));
if (PyList_GET_SIZE(_PyRuntime.gc.callbacks) != 0) {
info = Py_BuildValue("{sisnsn}",
"generation", generation,
Py_DECREF(cb);
}
Py_XDECREF(info);
+ assert(!PyErr_Occurred());
}
/* Perform garbage collection of a generation and invoke
collect_with_callback(int generation)
{
Py_ssize_t result, collected, uncollectable;
+ assert(!PyErr_Occurred());
invoke_gc_callback("start", generation, 0, 0);
result = collect(generation, &collected, &uncollectable, 0);
invoke_gc_callback("stop", generation, collected, uncollectable);
+ assert(!PyErr_Occurred());
return result;
}
{
Py_ssize_t n;
+ assert(!PyErr_Occurred());
/* Ideally, this function is only called on interpreter shutdown,
and therefore not recursively. Unfortunately, when there are daemon
threads, a daemon thread can start a cyclic garbage collection