From: Pieter Eendebak Date: Fri, 18 Apr 2025 14:50:29 +0000 (+0200) Subject: gh-132657: Avoid locking in frozenset.__contains__ (#132659) X-Git-Tag: v3.14.0b1~412 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=e77d6784e754d9d656238bb5691534857598c000;p=thirdparty%2FPython%2Fcpython.git gh-132657: Avoid locking in frozenset.__contains__ (#132659) --- diff --git a/Objects/clinic/setobject.c.h b/Objects/clinic/setobject.c.h index 96c70d0ae95a..488be4435f81 100644 --- a/Objects/clinic/setobject.c.h +++ b/Objects/clinic/setobject.c.h @@ -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]*/ diff --git a/Objects/setobject.c b/Objects/setobject.c index acbb53aafc0a..347888389b8d 100644 --- a/Objects/setobject.c +++ b/Objects/setobject.c @@ -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