]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-85283: Build pwd extension with the limited C API (#116841)
authorVictor Stinner <vstinner@python.org>
Fri, 15 Mar 2024 07:49:58 +0000 (08:49 +0100)
committerGitHub <noreply@github.com>
Fri, 15 Mar 2024 07:49:58 +0000 (08:49 +0100)
Argument Clinic now uses the PEP 737 "%T" format to format type name
for the limited C API.

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

index 856c6ee1d6e3f06b717c5be8a998cb7f8369d31a..03ae601890538002ac6e11f5c39d1fa2edee0dc2 100644 (file)
@@ -1469,7 +1469,7 @@ Build Changes
 * Building CPython now requires a compiler with support for the C11 atomic
   library, GCC built-in atomic functions, or MSVC interlocked intrinsics.
 
-* The ``errno``, ``fcntl``, ``grp``, ``md5``, ``resource``, ``winsound``,
+* The ``errno``, ``fcntl``, ``grp``, ``md5``, ``pwd``, ``resource``, ``winsound``,
   ``_ctypes_test``, ``_multiprocessing.posixshmem``, ``_scproxy``, ``_stat``,
   ``_testimportmultiple`` and ``_uuid`` C extensions are now built with the
   :ref:`limited C API <limited-c-api>`.
index a02b8a8210f9bd94a7dbd277e75551e04580edb8..8a3185a8649d7d4c595214787ad19586c9847be1 100644 (file)
@@ -1,2 +1,2 @@
-The ``fcntl`` and ``grp`` C extensions are now built with the :ref:`limited
+The ``fcntl``, ``grp`` and ``pwd`` C extensions are now built with the :ref:`limited
 C API <limited-c-api>`. (Contributed by Victor Stinner in :gh:`85283`.)
index 43d4825031c7e614c0a9ff19fbbb5a0de0bbb12d..365d99aab1dd22194b73f1d51357c14e47882393 100644 (file)
@@ -2,8 +2,6 @@
 preserve
 [clinic start generated code]*/
 
-#include "pycore_modsupport.h"    // _PyArg_BadArgument()
-
 PyDoc_STRVAR(pwd_getpwuid__doc__,
 "getpwuid($module, uidobj, /)\n"
 "--\n"
@@ -36,7 +34,7 @@ pwd_getpwnam(PyObject *module, PyObject *arg)
     PyObject *name;
 
     if (!PyUnicode_Check(arg)) {
-        _PyArg_BadArgument("getpwnam", "argument", "str", arg);
+        PyErr_Format(PyExc_TypeError, "getpwnam() argument must be str, not %T", arg);
         goto exit;
     }
     name = arg;
@@ -73,4 +71,4 @@ pwd_getpwall(PyObject *module, PyObject *Py_UNUSED(ignored))
 #ifndef PWD_GETPWALL_METHODDEF
     #define PWD_GETPWALL_METHODDEF
 #endif /* !defined(PWD_GETPWALL_METHODDEF) */
-/*[clinic end generated code: output=5a8fb12939ff4ea3 input=a9049054013a1b77]*/
+/*[clinic end generated code: output=dac88d500f6d6f49 input=a9049054013a1b77]*/
index c59a8e41aa292a3f0cd28c8de7168562f1cd891c..f58735aff997992282ffd3d2bf0bd1613cb424ef 100644 (file)
@@ -1,9 +1,16 @@
 
 /* UNIX password file access module */
 
+// Need limited C API version 3.13 for PyMem_RawRealloc()
+#include "pyconfig.h"   // Py_GIL_DISABLED
+#ifndef Py_GIL_DISABLED
+#  define Py_LIMITED_API 0x030d0000
+#endif
+
 #include "Python.h"
 #include "posixmodule.h"
 
+#include <errno.h>                // ERANGE
 #include <pwd.h>                  // getpwuid()
 #include <unistd.h>               // sysconf()
 
@@ -83,7 +90,7 @@ mkpwent(PyObject *module, struct passwd *p)
         if (item == NULL) {                                  \
             goto error;                                      \
         }                                                    \
-        PyStructSequence_SET_ITEM(v, setIndex++, item);      \
+        PyStructSequence_SetItem(v, setIndex++, item);       \
     } while(0)
 
     SET_STRING(p->pw_name);
index da28ba56a346a14ef4d3950ccae57377c2a5da23..744d03c2c1fea4ee93498569fab322000ec425ca 100644 (file)
@@ -426,13 +426,12 @@ class CConverter(metaclass=CConverterAutoRegister):
         if limited_capi:
             if expected_literal:
                 return (f'PyErr_Format(PyExc_TypeError, '
-                        f'"{{{{name}}}}() {displayname} must be {expected}, not %.50s", '
-                        f'{{argname}} == Py_None ? "None" : Py_TYPE({{argname}})->tp_name);')
+                        f'"{{{{name}}}}() {displayname} must be {expected}, not %T", '
+                        f'{{argname}});')
             else:
                 return (f'PyErr_Format(PyExc_TypeError, '
-                        f'"{{{{name}}}}() {displayname} must be %.50s, not %.50s", '
-                        f'"{expected}", '
-                        f'{{argname}} == Py_None ? "None" : Py_TYPE({{argname}})->tp_name);')
+                        f'"{{{{name}}}}() {displayname} must be %s, not %T", '
+                        f'"{expected}", {{argname}});')
         else:
             if expected_literal:
                 expected = f'"{expected}"'