]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-85283: Build _statistics extension with the limited C API (#116927)
authorVictor Stinner <vstinner@python.org>
Sun, 17 Mar 2024 17:59:02 +0000 (18:59 +0100)
committerGitHub <noreply@github.com>
Sun, 17 Mar 2024 17:59:02 +0000 (18:59 +0100)
Argument Clinic now inlines _PyArg_CheckPositional() for the limited
C API. The generated code should be as fast or even a little bit
faster.

Doc/whatsnew/3.13.rst
Misc/NEWS.d/next/C API/2024-03-14-10-33-58.gh-issue-85283.LOgmdU.rst
Modules/_statisticsmodule.c
Modules/clinic/_statisticsmodule.c.h

index 3e08d804d9494d9c5493518ed2ab03a9ce839221..a48db949d8f401259d6f97b2d85ad74b68e539cf 100644 (file)
@@ -1482,7 +1482,8 @@ Build Changes
 * The ``errno``, ``fcntl``, ``grp``, ``md5``, ``pwd``, ``resource``,
   ``termios``, ``winsound``,
   ``_ctypes_test``, ``_multiprocessing.posixshmem``, ``_scproxy``, ``_stat``,
-  ``_testimportmultiple`` and ``_uuid`` C extensions are now built with the
+  ``_statistics``, ``_testimportmultiple`` and ``_uuid``
+  C extensions are now built with the
   :ref:`limited C API <limited-c-api>`.
   (Contributed by Victor Stinner in :gh:`85283`.)
 
index bfb72db9d931d9ffb86d02e87e42554f92fd3eec..ef8a934b435a88ccb97cd431f71405a7b21316bf 100644 (file)
@@ -1,2 +1,2 @@
-The ``fcntl``, ``grp``, ``pwd`` and ``termios`` C extensions are now
+The ``fcntl``, ``grp``, ``pwd``, ``termios`` and ``_statistics`` C extensions are now
 built with the :ref:`limited C API <limited-c-api>`. Patch by Victor Stinner.
index a04a2a779a5d3d32efd3c8a60e1dcdc3831b8681..78a6552c4c9ec0c0a136c9a4a8801045ebff7e12 100644 (file)
@@ -1,8 +1,9 @@
 /* statistics accelerator C extension: _statistics module. */
 
-// clinic/_statisticsmodule.c.h uses internal pycore_modsupport.h API
-#ifndef Py_BUILD_CORE_BUILTIN
-#  define Py_BUILD_CORE_MODULE 1
+// Need limited C API version 3.12 for Py_MOD_PER_INTERPRETER_GIL_SUPPORTED
+#include "pyconfig.h"   // Py_GIL_DISABLED
+#ifndef Py_GIL_DISABLED
+#  define Py_LIMITED_API 0x030c0000
 #endif
 
 #include "Python.h"
index 653a2138aaad7043ef3b7d7f8a929b888b2aafa3..cd5b9bea8db2f2eb07c58ab266b01ad9b9a0b6ed 100644 (file)
@@ -2,15 +2,13 @@
 preserve
 [clinic start generated code]*/
 
-#include "pycore_modsupport.h"    // _PyArg_CheckPositional()
-
 PyDoc_STRVAR(_statistics__normal_dist_inv_cdf__doc__,
 "_normal_dist_inv_cdf($module, p, mu, sigma, /)\n"
 "--\n"
 "\n");
 
 #define _STATISTICS__NORMAL_DIST_INV_CDF_METHODDEF    \
-    {"_normal_dist_inv_cdf", _PyCFunction_CAST(_statistics__normal_dist_inv_cdf), METH_FASTCALL, _statistics__normal_dist_inv_cdf__doc__},
+    {"_normal_dist_inv_cdf", (PyCFunction)(void(*)(void))_statistics__normal_dist_inv_cdf, METH_FASTCALL, _statistics__normal_dist_inv_cdf__doc__},
 
 static double
 _statistics__normal_dist_inv_cdf_impl(PyObject *module, double p, double mu,
@@ -25,38 +23,21 @@ _statistics__normal_dist_inv_cdf(PyObject *module, PyObject *const *args, Py_ssi
     double sigma;
     double _return_value;
 
-    if (!_PyArg_CheckPositional("_normal_dist_inv_cdf", nargs, 3, 3)) {
+    if (nargs != 3) {
+        PyErr_Format(PyExc_TypeError, "_normal_dist_inv_cdf expected 3 arguments, got %zd", nargs);
         goto exit;
     }
-    if (PyFloat_CheckExact(args[0])) {
-        p = PyFloat_AS_DOUBLE(args[0]);
-    }
-    else
-    {
-        p = PyFloat_AsDouble(args[0]);
-        if (p == -1.0 && PyErr_Occurred()) {
-            goto exit;
-        }
-    }
-    if (PyFloat_CheckExact(args[1])) {
-        mu = PyFloat_AS_DOUBLE(args[1]);
-    }
-    else
-    {
-        mu = PyFloat_AsDouble(args[1]);
-        if (mu == -1.0 && PyErr_Occurred()) {
-            goto exit;
-        }
+    p = PyFloat_AsDouble(args[0]);
+    if (p == -1.0 && PyErr_Occurred()) {
+        goto exit;
     }
-    if (PyFloat_CheckExact(args[2])) {
-        sigma = PyFloat_AS_DOUBLE(args[2]);
+    mu = PyFloat_AsDouble(args[1]);
+    if (mu == -1.0 && PyErr_Occurred()) {
+        goto exit;
     }
-    else
-    {
-        sigma = PyFloat_AsDouble(args[2]);
-        if (sigma == -1.0 && PyErr_Occurred()) {
-            goto exit;
-        }
+    sigma = PyFloat_AsDouble(args[2]);
+    if (sigma == -1.0 && PyErr_Occurred()) {
+        goto exit;
     }
     _return_value = _statistics__normal_dist_inv_cdf_impl(module, p, mu, sigma);
     if ((_return_value == -1.0) && PyErr_Occurred()) {
@@ -67,4 +48,4 @@ _statistics__normal_dist_inv_cdf(PyObject *module, PyObject *const *args, Py_ssi
 exit:
     return return_value;
 }
-/*[clinic end generated code: output=e7cead17f9f3e19f input=a9049054013a1b77]*/
+/*[clinic end generated code: output=0f0c849d51f16f1b input=a9049054013a1b77]*/