Replace PyErr_WriteUnraisable() with PyErr_FormatUnraisable().
{
StgInfo *info = _PyStgInfo_FromType_NoState(self);
if (!info) {
- PyErr_WriteUnraisable(self);
+ PyErr_FormatUnraisable("Exception ignored while "
+ "calling ctypes traverse function %R", self);
}
if (info) {
Py_VISIT(info->proto);
{
StgInfo *info = _PyStgInfo_FromType_NoState(self);
if (!info) {
- PyErr_WriteUnraisable(self);
+ PyErr_FormatUnraisable("Exception ignored while "
+ "clearing ctypes %R", self);
}
if (info) {
ctype_clear_stginfo(info);
{
StgInfo *info = _PyStgInfo_FromType_NoState(self);
if (!info) {
- PyErr_WriteUnraisable(NULL); // NULL avoids segfault here
+ PyErr_FormatUnraisable("Exception ignored while "
+ "deallocating ctypes %R", self);
}
if (info) {
PyMem_Free(info->ffi_type_pointer.elements);
{
PyObject *func, *result;
long retval;
- static PyObject *context;
-
- if (context == NULL)
- context = PyUnicode_InternFromString("_ctypes.DllGetClassObject");
func = PyImport_ImportModuleAttrString("ctypes", "DllGetClassObject");
if (!func) {
- PyErr_WriteUnraisable(context ? context : Py_None);
/* There has been a warning before about this already */
- return E_FAIL;
+ goto error;
}
{
PyObject *py_rclsid = PyLong_FromVoidPtr((void *)rclsid);
if (py_rclsid == NULL) {
Py_DECREF(func);
- PyErr_WriteUnraisable(context ? context : Py_None);
- return E_FAIL;
+ goto error;
}
PyObject *py_riid = PyLong_FromVoidPtr((void *)riid);
if (py_riid == NULL) {
Py_DECREF(func);
Py_DECREF(py_rclsid);
- PyErr_WriteUnraisable(context ? context : Py_None);
- return E_FAIL;
+ goto error;
}
PyObject *py_ppv = PyLong_FromVoidPtr(ppv);
if (py_ppv == NULL) {
Py_DECREF(py_rclsid);
Py_DECREF(py_riid);
Py_DECREF(func);
- PyErr_WriteUnraisable(context ? context : Py_None);
- return E_FAIL;
+ goto error;
}
result = PyObject_CallFunctionObjArgs(func,
py_rclsid,
}
Py_DECREF(func);
if (!result) {
- PyErr_WriteUnraisable(context ? context : Py_None);
- return E_FAIL;
+ goto error;
}
retval = PyLong_AsLong(result);
if (PyErr_Occurred()) {
- PyErr_WriteUnraisable(context ? context : Py_None);
- retval = E_FAIL;
+ Py_DECREF(result);
+ goto error;
}
Py_DECREF(result);
return retval;
+
+error:
+ PyErr_FormatUnraisable("Exception ignored while calling "
+ "ctypes.DllGetClassObject");
+ return E_FAIL;
}
STDAPI DllGetClassObject(REFCLSID rclsid,
{
PyObject *mod, *func, *result;
long retval;
- static PyObject *context;
-
- if (context == NULL)
- context = PyUnicode_InternFromString("_ctypes.DllCanUnloadNow");
mod = PyImport_ImportModule("ctypes");
if (!mod) {
func = PyObject_GetAttrString(mod, "DllCanUnloadNow");
Py_DECREF(mod);
if (!func) {
- PyErr_WriteUnraisable(context ? context : Py_None);
- return E_FAIL;
+ goto error;
}
result = _PyObject_CallNoArgs(func);
Py_DECREF(func);
if (!result) {
- PyErr_WriteUnraisable(context ? context : Py_None);
- return E_FAIL;
+ goto error;
}
retval = PyLong_AsLong(result);
if (PyErr_Occurred()) {
- PyErr_WriteUnraisable(context ? context : Py_None);
- retval = E_FAIL;
+ Py_DECREF(result);
+ goto error;
}
Py_DECREF(result);
return retval;
+
+error:
+ PyErr_FormatUnraisable("Exception ignored while calling "
+ "ctypes.DllCanUnloadNow");
+ return E_FAIL;
}
/*
pObj->flags &= ~POF_EXT_TIMER;
if (o == NULL) {
- PyErr_WriteUnraisable(pObj->externalTimer);
+ PyErr_FormatUnraisable("Exception ignored while calling "
+ "_lsprof timer %R", pObj->externalTimer);
return 0;
}
}
Py_DECREF(o);
if (err < 0) {
- PyErr_WriteUnraisable(pObj->externalTimer);
+ PyErr_FormatUnraisable("Exception ignored while calling "
+ "_lsprof timer %R", pObj->externalTimer);
return 0;
}
return result;
PyObject *popped;
int r = PyDict_Pop(interned, unicode, &popped);
if (r == -1) {
- PyErr_WriteUnraisable(unicode);
+ PyErr_FormatUnraisable("Exception ignored while "
+ "removing an interned string %R",
+ unicode);
// We don't know what happened to the string. It's probably
// best to leak it:
// - if it was popped, there are no more references to it
{
PyObject *cbresult = PyObject_CallOneArg(callback, (PyObject *)ref);
- if (cbresult == NULL)
- PyErr_WriteUnraisable(callback);
- else
+ if (cbresult == NULL) {
+ PyErr_FormatUnraisable("Exception ignored while "
+ "calling weakref callback %R", callback);
+ }
+ else {
Py_DECREF(cbresult);
+ }
}
/* This function is called by the tp_dealloc handler to clear weak references.