mirror of
https://github.com/python/cpython.git
synced 2025-08-04 08:59:19 +00:00
gh-104922: Make PY_SSIZE_T_CLEAN
not mandatory again (#105051)
This commit is contained in:
parent
f90d3f68db
commit
adccff3b3f
15 changed files with 105 additions and 397 deletions
|
@ -12,44 +12,17 @@
|
|||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
int PyArg_Parse(PyObject *, const char *, ...);
|
||||
int PyArg_ParseTuple(PyObject *, const char *, ...);
|
||||
int PyArg_VaParse(PyObject *, const char *, va_list);
|
||||
|
||||
int PyArg_ParseTupleAndKeywords(PyObject *, PyObject *,
|
||||
const char *, char **, ...);
|
||||
int PyArg_VaParseTupleAndKeywords(PyObject *, PyObject *,
|
||||
const char *, char **, va_list);
|
||||
|
||||
int _PyArg_ParseTupleAndKeywordsFast(PyObject *, PyObject *,
|
||||
struct _PyArg_Parser *, ...);
|
||||
int _PyArg_VaParseTupleAndKeywordsFast(PyObject *, PyObject *,
|
||||
struct _PyArg_Parser *, va_list);
|
||||
|
||||
#ifdef HAVE_DECLSPEC_DLL
|
||||
/* Export functions */
|
||||
/* Export Stable ABIs (abi only) */
|
||||
PyAPI_FUNC(int) _PyArg_Parse_SizeT(PyObject *, const char *, ...);
|
||||
PyAPI_FUNC(int) _PyArg_ParseStack_SizeT(PyObject *const *args, Py_ssize_t nargs,
|
||||
const char *format, ...);
|
||||
PyAPI_FUNC(int) _PyArg_ParseStackAndKeywords_SizeT(PyObject *const *args, Py_ssize_t nargs,
|
||||
PyObject *kwnames,
|
||||
struct _PyArg_Parser *parser, ...);
|
||||
PyAPI_FUNC(int) _PyArg_ParseTuple_SizeT(PyObject *, const char *, ...);
|
||||
PyAPI_FUNC(int) _PyArg_ParseTupleAndKeywords_SizeT(PyObject *, PyObject *,
|
||||
const char *, char **, ...);
|
||||
PyAPI_FUNC(PyObject *) _Py_BuildValue_SizeT(const char *, ...);
|
||||
PyAPI_FUNC(int) _PyArg_VaParse_SizeT(PyObject *, const char *, va_list);
|
||||
PyAPI_FUNC(int) _PyArg_VaParseTupleAndKeywords_SizeT(PyObject *, PyObject *,
|
||||
const char *, char **, va_list);
|
||||
|
||||
PyAPI_FUNC(int) _PyArg_ParseTupleAndKeywordsFast_SizeT(PyObject *, PyObject *,
|
||||
struct _PyArg_Parser *, ...);
|
||||
PyAPI_FUNC(int) _PyArg_VaParseTupleAndKeywordsFast_SizeT(PyObject *, PyObject *,
|
||||
struct _PyArg_Parser *, va_list);
|
||||
#endif
|
||||
|
||||
#define FLAG_COMPAT 1
|
||||
#define FLAG_SIZE_T 2
|
||||
|
||||
typedef int (*destr_t)(PyObject *, void *);
|
||||
|
||||
|
@ -114,7 +87,7 @@ _PyArg_Parse_SizeT(PyObject *args, const char *format, ...)
|
|||
va_list va;
|
||||
|
||||
va_start(va, format);
|
||||
retval = vgetargs1(args, format, &va, FLAG_COMPAT|FLAG_SIZE_T);
|
||||
retval = vgetargs1(args, format, &va, FLAG_COMPAT);
|
||||
va_end(va);
|
||||
return retval;
|
||||
}
|
||||
|
@ -132,14 +105,14 @@ PyArg_ParseTuple(PyObject *args, const char *format, ...)
|
|||
return retval;
|
||||
}
|
||||
|
||||
PyAPI_FUNC(int)
|
||||
int
|
||||
_PyArg_ParseTuple_SizeT(PyObject *args, const char *format, ...)
|
||||
{
|
||||
int retval;
|
||||
va_list va;
|
||||
|
||||
va_start(va, format);
|
||||
retval = vgetargs1(args, format, &va, FLAG_SIZE_T);
|
||||
retval = vgetargs1(args, format, &va, 0);
|
||||
va_end(va);
|
||||
return retval;
|
||||
}
|
||||
|
@ -157,19 +130,6 @@ _PyArg_ParseStack(PyObject *const *args, Py_ssize_t nargs, const char *format, .
|
|||
return retval;
|
||||
}
|
||||
|
||||
PyAPI_FUNC(int)
|
||||
_PyArg_ParseStack_SizeT(PyObject *const *args, Py_ssize_t nargs, const char *format, ...)
|
||||
{
|
||||
int retval;
|
||||
va_list va;
|
||||
|
||||
va_start(va, format);
|
||||
retval = vgetargs1_impl(NULL, args, nargs, format, &va, FLAG_SIZE_T);
|
||||
va_end(va);
|
||||
return retval;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
PyArg_VaParse(PyObject *args, const char *format, va_list va)
|
||||
{
|
||||
|
@ -183,7 +143,7 @@ PyArg_VaParse(PyObject *args, const char *format, va_list va)
|
|||
return retval;
|
||||
}
|
||||
|
||||
PyAPI_FUNC(int)
|
||||
int
|
||||
_PyArg_VaParse_SizeT(PyObject *args, const char *format, va_list va)
|
||||
{
|
||||
va_list lva;
|
||||
|
@ -191,7 +151,7 @@ _PyArg_VaParse_SizeT(PyObject *args, const char *format, va_list va)
|
|||
|
||||
va_copy(lva, va);
|
||||
|
||||
retval = vgetargs1(args, format, &lva, FLAG_SIZE_T);
|
||||
retval = vgetargs1(args, format, &lva, 0);
|
||||
va_end(lva);
|
||||
return retval;
|
||||
}
|
||||
|
@ -657,13 +617,6 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
|
|||
char *msgbuf, size_t bufsize, freelist_t *freelist)
|
||||
{
|
||||
#define RETURN_ERR_OCCURRED return msgbuf
|
||||
/* For # codes */
|
||||
#define REQUIRE_PY_SSIZE_T_CLEAN \
|
||||
if (!(flags & FLAG_SIZE_T)) { \
|
||||
PyErr_SetString(PyExc_SystemError, \
|
||||
"PY_SSIZE_T_CLEAN macro must be defined for '#' formats"); \
|
||||
RETURN_ERR_OCCURRED; \
|
||||
}
|
||||
|
||||
const char *format = *p_format;
|
||||
char c = *format++;
|
||||
|
@ -917,7 +870,6 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
|
|||
if (count < 0)
|
||||
return converterr(buf, arg, msgbuf, bufsize);
|
||||
if (*format == '#') {
|
||||
REQUIRE_PY_SSIZE_T_CLEAN;
|
||||
Py_ssize_t *psize = va_arg(*p_va, Py_ssize_t*);
|
||||
*psize = count;
|
||||
format++;
|
||||
|
@ -961,7 +913,6 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
|
|||
} else if (*format == '#') { /* a string or read-only bytes-like object */
|
||||
/* "s#" or "z#" */
|
||||
const void **p = (const void **)va_arg(*p_va, const char **);
|
||||
REQUIRE_PY_SSIZE_T_CLEAN;
|
||||
Py_ssize_t *psize = va_arg(*p_va, Py_ssize_t*);
|
||||
|
||||
if (c == 'z' && arg == Py_None) {
|
||||
|
@ -1099,7 +1050,6 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
|
|||
trailing 0-byte
|
||||
|
||||
*/
|
||||
REQUIRE_PY_SSIZE_T_CLEAN;
|
||||
Py_ssize_t *psize = va_arg(*p_va, Py_ssize_t*);
|
||||
|
||||
format++;
|
||||
|
@ -1274,7 +1224,6 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
|
|||
*p_format = format;
|
||||
return NULL;
|
||||
|
||||
#undef REQUIRE_PY_SSIZE_T_CLEAN
|
||||
#undef RETURN_ERR_OCCURRED
|
||||
}
|
||||
|
||||
|
@ -1343,7 +1292,7 @@ PyArg_ParseTupleAndKeywords(PyObject *args,
|
|||
return retval;
|
||||
}
|
||||
|
||||
PyAPI_FUNC(int)
|
||||
int
|
||||
_PyArg_ParseTupleAndKeywords_SizeT(PyObject *args,
|
||||
PyObject *keywords,
|
||||
const char *format,
|
||||
|
@ -1363,7 +1312,7 @@ _PyArg_ParseTupleAndKeywords_SizeT(PyObject *args,
|
|||
|
||||
va_start(va, kwlist);
|
||||
retval = vgetargskeywords(args, keywords, format,
|
||||
kwlist, &va, FLAG_SIZE_T);
|
||||
kwlist, &va, 0);
|
||||
va_end(va);
|
||||
return retval;
|
||||
}
|
||||
|
@ -1394,7 +1343,7 @@ PyArg_VaParseTupleAndKeywords(PyObject *args,
|
|||
return retval;
|
||||
}
|
||||
|
||||
PyAPI_FUNC(int)
|
||||
int
|
||||
_PyArg_VaParseTupleAndKeywords_SizeT(PyObject *args,
|
||||
PyObject *keywords,
|
||||
const char *format,
|
||||
|
@ -1415,7 +1364,7 @@ _PyArg_VaParseTupleAndKeywords_SizeT(PyObject *args,
|
|||
va_copy(lva, va);
|
||||
|
||||
retval = vgetargskeywords(args, keywords, format,
|
||||
kwlist, &lva, FLAG_SIZE_T);
|
||||
kwlist, &lva, 0);
|
||||
va_end(lva);
|
||||
return retval;
|
||||
}
|
||||
|
@ -1433,7 +1382,7 @@ _PyArg_ParseTupleAndKeywordsFast(PyObject *args, PyObject *keywords,
|
|||
return retval;
|
||||
}
|
||||
|
||||
PyAPI_FUNC(int)
|
||||
int
|
||||
_PyArg_ParseTupleAndKeywordsFast_SizeT(PyObject *args, PyObject *keywords,
|
||||
struct _PyArg_Parser *parser, ...)
|
||||
{
|
||||
|
@ -1441,12 +1390,12 @@ _PyArg_ParseTupleAndKeywordsFast_SizeT(PyObject *args, PyObject *keywords,
|
|||
va_list va;
|
||||
|
||||
va_start(va, parser);
|
||||
retval = vgetargskeywordsfast(args, keywords, parser, &va, FLAG_SIZE_T);
|
||||
retval = vgetargskeywordsfast(args, keywords, parser, &va, 0);
|
||||
va_end(va);
|
||||
return retval;
|
||||
}
|
||||
|
||||
PyAPI_FUNC(int)
|
||||
int
|
||||
_PyArg_ParseStackAndKeywords(PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames,
|
||||
struct _PyArg_Parser *parser, ...)
|
||||
{
|
||||
|
@ -1459,7 +1408,7 @@ _PyArg_ParseStackAndKeywords(PyObject *const *args, Py_ssize_t nargs, PyObject *
|
|||
return retval;
|
||||
}
|
||||
|
||||
PyAPI_FUNC(int)
|
||||
int
|
||||
_PyArg_ParseStackAndKeywords_SizeT(PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames,
|
||||
struct _PyArg_Parser *parser, ...)
|
||||
{
|
||||
|
@ -1467,7 +1416,7 @@ _PyArg_ParseStackAndKeywords_SizeT(PyObject *const *args, Py_ssize_t nargs, PyOb
|
|||
va_list va;
|
||||
|
||||
va_start(va, parser);
|
||||
retval = vgetargskeywordsfast_impl(args, nargs, NULL, kwnames, parser, &va, FLAG_SIZE_T);
|
||||
retval = vgetargskeywordsfast_impl(args, nargs, NULL, kwnames, parser, &va, 0);
|
||||
va_end(va);
|
||||
return retval;
|
||||
}
|
||||
|
@ -1487,20 +1436,6 @@ _PyArg_VaParseTupleAndKeywordsFast(PyObject *args, PyObject *keywords,
|
|||
return retval;
|
||||
}
|
||||
|
||||
PyAPI_FUNC(int)
|
||||
_PyArg_VaParseTupleAndKeywordsFast_SizeT(PyObject *args, PyObject *keywords,
|
||||
struct _PyArg_Parser *parser, va_list va)
|
||||
{
|
||||
int retval;
|
||||
va_list lva;
|
||||
|
||||
va_copy(lva, va);
|
||||
|
||||
retval = vgetargskeywordsfast(args, keywords, parser, &lva, FLAG_SIZE_T);
|
||||
va_end(lva);
|
||||
return retval;
|
||||
}
|
||||
|
||||
static void
|
||||
error_unexpected_keyword_arg(PyObject *kwargs, PyObject *kwnames, PyObject *kwtuple, const char *fname)
|
||||
{
|
||||
|
@ -2710,9 +2645,6 @@ skipitem(const char **p_format, va_list *p_va, int flags)
|
|||
}
|
||||
if (*format == '#') {
|
||||
if (p_va != NULL) {
|
||||
if (!(flags & FLAG_SIZE_T)) {
|
||||
return "PY_SSIZE_T_CLEAN macro must be defined for '#' formats";
|
||||
}
|
||||
(void) va_arg(*p_va, Py_ssize_t *);
|
||||
}
|
||||
format++;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue