]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-110525: Cover PySet_Add corner case with frozenset objects (GH-110544)
authorNikita Sobolev <mail@sobolevn.me>
Mon, 9 Oct 2023 11:04:49 +0000 (14:04 +0300)
committerGitHub <noreply@github.com>
Mon, 9 Oct 2023 11:04:49 +0000 (14:04 +0300)
Modules/_testcapi/set.c

index 35e686e1e293fe8daafb5610ec9f0549678e7374..2fbd0aeffcd9f9540e6e21cb4f81c954392b7baa 100644 (file)
@@ -127,6 +127,41 @@ set_clear(PyObject *self, PyObject *obj)
     RETURN_INT(PySet_Clear(obj));
 }
 
+static PyObject *
+test_frozenset_add_in_capi(PyObject *self, PyObject *Py_UNUSED(obj))
+{
+    // Test that `frozenset` can be used with `PySet_Add`,
+    // when frozenset is just created in CAPI.
+    PyObject *fs = PyFrozenSet_New(NULL);
+    if (fs == NULL) {
+        return NULL;
+    }
+    PyObject *num = PyLong_FromLong(1);
+    if (num == NULL) {
+        goto error;
+    }
+    if (PySet_Add(fs, num) < 0) {
+        goto error;
+    }
+    int contains = PySet_Contains(fs, num);
+    if (contains < 0) {
+        goto error;
+    }
+    else if (contains == 0) {
+        goto unexpected;
+    }
+    Py_DECREF(fs);
+    Py_DECREF(num);
+    Py_RETURN_NONE;
+
+unexpected:
+    PyErr_SetString(PyExc_ValueError, "set does not contain expected value");
+error:
+    Py_DECREF(fs);
+    Py_XDECREF(num);
+    return NULL;
+}
+
 static PyMethodDef test_methods[] = {
     {"set_check", set_check, METH_O},
     {"set_checkexact", set_checkexact, METH_O},
@@ -146,6 +181,8 @@ static PyMethodDef test_methods[] = {
     {"set_pop", set_pop, METH_O},
     {"set_clear", set_clear, METH_O},
 
+    {"test_frozenset_add_in_capi", test_frozenset_add_in_capi, METH_NOARGS},
+
     {NULL},
 };