]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.12] gh-110525: Cover PySet_Add corner case with frozenset objects (GH-110544)...
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Mon, 9 Oct 2023 11:40:53 +0000 (13:40 +0200)
committerGitHub <noreply@github.com>
Mon, 9 Oct 2023 11:40:53 +0000 (11:40 +0000)
(cherry picked from commit ea39c877c0a8e7a717f2e4bf7d92a3a8780e67c0)

Co-authored-by: Nikita Sobolev <mail@sobolevn.me>
Modules/_testcapi/set.c

index f68a18596981325934ce8192df7278990b2cd71a..3c58f185638c758d659ccf4b8e400ba8520a81b0 100644 (file)
@@ -129,6 +129,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},
@@ -148,6 +183,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},
 };