]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-132657: Avoid locking in frozenset.__contains__ (#132659)
authorPieter Eendebak <pieter.eendebak@gmail.com>
Fri, 18 Apr 2025 14:50:29 +0000 (16:50 +0200)
committerGitHub <noreply@github.com>
Fri, 18 Apr 2025 14:50:29 +0000 (20:20 +0530)
Objects/clinic/setobject.c.h
Objects/setobject.c

index 96c70d0ae95a46d588481703ad6ad08572d22ce9..488be4435f81d74497e02d617b37b226372ac3bd 100644 (file)
@@ -432,6 +432,28 @@ set___contains__(PyObject *so, PyObject *key)
     return return_value;
 }
 
+PyDoc_STRVAR(frozenset___contains____doc__,
+"__contains__($self, object, /)\n"
+"--\n"
+"\n"
+"x.__contains__(y) <==> y in x.");
+
+#define FROZENSET___CONTAINS___METHODDEF    \
+    {"__contains__", (PyCFunction)frozenset___contains__, METH_O|METH_COEXIST, frozenset___contains____doc__},
+
+static PyObject *
+frozenset___contains___impl(PySetObject *so, PyObject *key);
+
+static PyObject *
+frozenset___contains__(PyObject *so, PyObject *key)
+{
+    PyObject *return_value = NULL;
+
+    return_value = frozenset___contains___impl((PySetObject *)so, key);
+
+    return return_value;
+}
+
 PyDoc_STRVAR(set_remove__doc__,
 "remove($self, object, /)\n"
 "--\n"
@@ -532,4 +554,4 @@ set___sizeof__(PyObject *so, PyObject *Py_UNUSED(ignored))
 
     return return_value;
 }
-/*[clinic end generated code: output=e2f1470de062d661 input=a9049054013a1b77]*/
+/*[clinic end generated code: output=7f7fe845ca165078 input=a9049054013a1b77]*/
index acbb53aafc0a26e82cc9fff1cd2c9c972d0adfcd..347888389b8dcd72a9b2f5552c0c24920b9891fa 100644 (file)
@@ -2253,6 +2253,28 @@ set___contains___impl(PySetObject *so, PyObject *key)
     return PyBool_FromLong(result);
 }
 
+/*[clinic input]
+@coexist
+frozenset.__contains__
+    so: setobject
+    object as key: object
+    /
+
+x.__contains__(y) <==> y in x.
+[clinic start generated code]*/
+
+static PyObject *
+frozenset___contains___impl(PySetObject *so, PyObject *key)
+/*[clinic end generated code: output=2301ed91bc3a6dd5 input=2f04922a98d8bab7]*/
+{
+    long result;
+
+    result = set_contains_lock_held(so, key);
+    if (result < 0)
+        return NULL;
+    return PyBool_FromLong(result);
+}
+
 /*[clinic input]
 @critical_section
 set.remove
@@ -2555,7 +2577,7 @@ PyTypeObject PySet_Type = {
 
 
 static PyMethodDef frozenset_methods[] = {
-    SET___CONTAINS___METHODDEF
+    FROZENSET___CONTAINS___METHODDEF
     FROZENSET_COPY_METHODDEF
     SET_DIFFERENCE_MULTI_METHODDEF
     SET_INTERSECTION_MULTI_METHODDEF