Skip to content

Commit 3379830

Browse files
committed
gh-102493: backport unit test for PyErr_SetObject
1 parent 895c7a4 commit 3379830

File tree

2 files changed

+43
-0
lines changed

2 files changed

+43
-0
lines changed

Lib/test/test_capi.py

+28
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,34 @@ def test_exc_info(self):
133133
else:
134134
self.assertTrue(False)
135135

136+
def test_set_object(self):
137+
# new exception as obj is not an exception
138+
with self.assertRaises(ValueError) as e:
139+
_testcapi.exc_set_object(ValueError, 42)
140+
self.assertEqual(e.exception.args, (42,))
141+
142+
# wraps the exception because unrelated types
143+
with self.assertRaises(ValueError) as e:
144+
_testcapi.exc_set_object(ValueError, TypeError(1,2,3))
145+
wrapped = e.exception.args[0]
146+
self.assertIsInstance(wrapped, TypeError)
147+
self.assertEqual(wrapped.args, (1, 2, 3))
148+
149+
# is superclass, so does not wrap
150+
with self.assertRaises(PermissionError) as e:
151+
_testcapi.exc_set_object(OSError, PermissionError(24))
152+
self.assertEqual(e.exception.args, (24,))
153+
154+
class Meta(type):
155+
def __subclasscheck__(cls, sub):
156+
1/0
157+
158+
class Broken(Exception, metaclass=Meta):
159+
pass
160+
161+
with self.assertRaises(ZeroDivisionError) as e:
162+
_testcapi.exc_set_object(Broken, Broken())
163+
136164
@unittest.skipUnless(_posixsubprocess, '_posixsubprocess required for this test.')
137165
def test_seq_bytes_to_charp_array(self):
138166
# Issue #15732: crash in _PySequence_BytesToCharpArray()

Modules/_testcapimodule.c

+15
Original file line numberDiff line numberDiff line change
@@ -2522,6 +2522,20 @@ pyobject_bytes_from_null(PyObject *self, PyObject *Py_UNUSED(ignored))
25222522
return PyObject_Bytes(NULL);
25232523
}
25242524

2525+
static PyObject *
2526+
exc_set_object(PyObject *self, PyObject *args)
2527+
{
2528+
PyObject *exc;
2529+
PyObject *obj;
2530+
2531+
if (!PyArg_ParseTuple(args, "OO:exc_set_object", &exc, &obj)) {
2532+
return NULL;
2533+
}
2534+
2535+
PyErr_SetObject(exc, obj);
2536+
return NULL;
2537+
}
2538+
25252539
static PyObject *
25262540
raise_exception(PyObject *self, PyObject *args)
25272541
{
@@ -6078,6 +6092,7 @@ static PyObject *getargs_s_hash_int(PyObject *, PyObject *, PyObject*);
60786092
static PyObject *getargs_s_hash_int2(PyObject *, PyObject *, PyObject*);
60796093

60806094
static PyMethodDef TestMethods[] = {
6095+
{"exc_set_object", exc_set_object, METH_VARARGS},
60816096
{"raise_exception", raise_exception, METH_VARARGS},
60826097
{"raise_memoryerror", raise_memoryerror, METH_NOARGS},
60836098
{"set_errno", set_errno, METH_VARARGS},

0 commit comments

Comments
 (0)