summaryrefslogtreecommitdiffstats
path: root/Modules/_testcapi/clinic/exceptions.c.h
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2023-08-19 11:51:03 (GMT)
committerGitHub <noreply@github.com>2023-08-19 11:51:03 (GMT)
commit633ea217a85f6b6ba5bdbc73094254d5811b3485 (patch)
treec33fba2ad466d260ebdce2e743ca6df9e28a3152 /Modules/_testcapi/clinic/exceptions.c.h
parent79db9d9a0e8f51ad4ea5caae31d7ae4b29985271 (diff)
downloadcpython-633ea217a85f6b6ba5bdbc73094254d5811b3485.zip
cpython-633ea217a85f6b6ba5bdbc73094254d5811b3485.tar.gz
cpython-633ea217a85f6b6ba5bdbc73094254d5811b3485.tar.bz2
gh-107915: Handle errors in C API functions PyErr_Set*() and PyErr_Format() (GH-107918)
Such C API functions as PyErr_SetString(), PyErr_Format(), PyErr_SetFromErrnoWithFilename() and many others no longer crash or ignore errors if it failed to format the error message or decode the filename. Instead, they keep a corresponding error.
Diffstat (limited to 'Modules/_testcapi/clinic/exceptions.c.h')
-rw-r--r--Modules/_testcapi/clinic/exceptions.c.h64
1 files changed, 63 insertions, 1 deletions
diff --git a/Modules/_testcapi/clinic/exceptions.c.h b/Modules/_testcapi/clinic/exceptions.c.h
index 01730ff..16954a5 100644
--- a/Modules/_testcapi/clinic/exceptions.c.h
+++ b/Modules/_testcapi/clinic/exceptions.c.h
@@ -215,6 +215,68 @@ exit:
return return_value;
}
+PyDoc_STRVAR(_testcapi_err_setstring__doc__,
+"err_setstring($module, exc, value, /)\n"
+"--\n"
+"\n");
+
+#define _TESTCAPI_ERR_SETSTRING_METHODDEF \
+ {"err_setstring", _PyCFunction_CAST(_testcapi_err_setstring), METH_FASTCALL, _testcapi_err_setstring__doc__},
+
+static PyObject *
+_testcapi_err_setstring_impl(PyObject *module, PyObject *exc,
+ const char *value, Py_ssize_t value_length);
+
+static PyObject *
+_testcapi_err_setstring(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
+{
+ PyObject *return_value = NULL;
+ PyObject *exc;
+ const char *value;
+ Py_ssize_t value_length;
+
+ if (!_PyArg_ParseStack(args, nargs, "Oz#:err_setstring",
+ &exc, &value, &value_length)) {
+ goto exit;
+ }
+ return_value = _testcapi_err_setstring_impl(module, exc, value, value_length);
+
+exit:
+ return return_value;
+}
+
+PyDoc_STRVAR(_testcapi_err_setfromerrnowithfilename__doc__,
+"err_setfromerrnowithfilename($module, error, exc, value, /)\n"
+"--\n"
+"\n");
+
+#define _TESTCAPI_ERR_SETFROMERRNOWITHFILENAME_METHODDEF \
+ {"err_setfromerrnowithfilename", _PyCFunction_CAST(_testcapi_err_setfromerrnowithfilename), METH_FASTCALL, _testcapi_err_setfromerrnowithfilename__doc__},
+
+static PyObject *
+_testcapi_err_setfromerrnowithfilename_impl(PyObject *module, int error,
+ PyObject *exc, const char *value,
+ Py_ssize_t value_length);
+
+static PyObject *
+_testcapi_err_setfromerrnowithfilename(PyObject *module, PyObject *const *args, Py_ssize_t nargs)
+{
+ PyObject *return_value = NULL;
+ int error;
+ PyObject *exc;
+ const char *value;
+ Py_ssize_t value_length;
+
+ if (!_PyArg_ParseStack(args, nargs, "iOz#:err_setfromerrnowithfilename",
+ &error, &exc, &value, &value_length)) {
+ goto exit;
+ }
+ return_value = _testcapi_err_setfromerrnowithfilename_impl(module, error, exc, value, value_length);
+
+exit:
+ return return_value;
+}
+
PyDoc_STRVAR(_testcapi_raise_exception__doc__,
"raise_exception($module, exception, num_args, /)\n"
"--\n"
@@ -426,4 +488,4 @@ _testcapi_unstable_exc_prep_reraise_star(PyObject *module, PyObject *const *args
exit:
return return_value;
}
-/*[clinic end generated code: output=fd6aef54f195c77b input=a9049054013a1b77]*/
+/*[clinic end generated code: output=d574342d716e98b5 input=a9049054013a1b77]*/