from .test_misc import decode_stderr
-# Skip this test if the _testcapi module isn't available.
+# Skip this test if the _testcapi or _testinternalcapi module isn't available.
_testcapi = import_helper.import_module('_testcapi')
+_testinternalcapi = import_helper.import_module('_testinternalcapi')
NULL = None
b'<string>:7: RuntimeWarning: Testing PyErr_WarnEx',
])
+ def test__pyerr_setkeyerror(self):
+ # Test _PyErr_SetKeyError()
+ _pyerr_setkeyerror = _testinternalcapi._pyerr_setkeyerror
+ for arg in (
+ "key",
+ # check that a tuple argument is not unpacked
+ (1, 2, 3),
+ # PyErr_SetObject(exc_type, exc_value) uses exc_value if it's
+ # already an exception, but _PyErr_SetKeyError() always creates a
+ # new KeyError.
+ KeyError('arg'),
+ ):
+ with self.subTest(arg=arg):
+ with self.assertRaises(KeyError) as cm:
+ # Test calling _PyErr_SetKeyError() with an exception set
+ # to check that the function overrides the current
+ # exception.
+ _pyerr_setkeyerror(arg)
+ self.assertEqual(cm.exception.args, (arg,))
+
class Test_FatalError(unittest.TestCase):
}
+static PyObject *
+_pyerr_setkeyerror(PyObject *self, PyObject *arg)
+{
+ // Test that _PyErr_SetKeyError() overrides the current exception
+ // if an exception is set
+ PyErr_NoMemory();
+
+ _PyErr_SetKeyError(arg);
+
+ assert(PyErr_Occurred());
+ return NULL;
+}
+
+
static PyMethodDef module_functions[] = {
{"get_configs", get_configs, METH_NOARGS},
{"get_recursion_depth", get_recursion_depth, METH_NOARGS},
{"uop_symbols_test", _Py_uop_symbols_test, METH_NOARGS},
#endif
GH_119213_GETARGS_METHODDEF
+ {"_pyerr_setkeyerror", _pyerr_setkeyerror, METH_O},
{NULL, NULL} /* sentinel */
};