bpo-36381: warn when no PY_SSIZE_T_CLEAN defined (GH-12473)
We will remove int support from 3.10 or 4.0.
This commit is contained in:
parent
d60f658fc0
commit
d3c72a223a
|
@ -708,6 +708,16 @@ Changes in the Python API
|
||||||
set for regular user accounts.
|
set for regular user accounts.
|
||||||
|
|
||||||
|
|
||||||
|
Changes in the C API
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
* Use of ``#`` variants of formats in parsing or building value (e.g.
|
||||||
|
:c:func:`PyArg_ParseTuple`, :c:func:`Py_BuildValue`, :c:func:`PyObject_CallFunction`,
|
||||||
|
etc.) without ``PY_SSIZE_T_CLEAN`` defined raises ``DeprecationWarning`` now.
|
||||||
|
It will be removed in 3.10 or 4.0. Read :ref:`arg-parsing` for detail.
|
||||||
|
(Contributed by Inada Naoki in :issue:`36381`.)
|
||||||
|
|
||||||
|
|
||||||
CPython bytecode changes
|
CPython bytecode changes
|
||||||
------------------------
|
------------------------
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
Raise ``DeprecationWarning`` when '#' formats are used for building or
|
||||||
|
parsing values without ``PY_SSIZE_T_CLEAN``.
|
|
@ -681,7 +681,13 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
|
||||||
/* For # codes */
|
/* For # codes */
|
||||||
#define FETCH_SIZE int *q=NULL;Py_ssize_t *q2=NULL;\
|
#define FETCH_SIZE int *q=NULL;Py_ssize_t *q2=NULL;\
|
||||||
if (flags & FLAG_SIZE_T) q2=va_arg(*p_va, Py_ssize_t*); \
|
if (flags & FLAG_SIZE_T) q2=va_arg(*p_va, Py_ssize_t*); \
|
||||||
else q=va_arg(*p_va, int*);
|
else { \
|
||||||
|
if (PyErr_WarnEx(PyExc_DeprecationWarning, \
|
||||||
|
"PY_SSIZE_T_CLEAN will be required for '#' formats", 1)) { \
|
||||||
|
return NULL; \
|
||||||
|
} \
|
||||||
|
q=va_arg(*p_va, int*); \
|
||||||
|
}
|
||||||
#define STORE_SIZE(s) \
|
#define STORE_SIZE(s) \
|
||||||
if (flags & FLAG_SIZE_T) \
|
if (flags & FLAG_SIZE_T) \
|
||||||
*q2=s; \
|
*q2=s; \
|
||||||
|
@ -2591,9 +2597,14 @@ skipitem(const char **p_format, va_list *p_va, int flags)
|
||||||
if (p_va != NULL) {
|
if (p_va != NULL) {
|
||||||
if (flags & FLAG_SIZE_T)
|
if (flags & FLAG_SIZE_T)
|
||||||
(void) va_arg(*p_va, Py_ssize_t *);
|
(void) va_arg(*p_va, Py_ssize_t *);
|
||||||
else
|
else {
|
||||||
|
if (PyErr_WarnEx(PyExc_DeprecationWarning,
|
||||||
|
"PY_SSIZE_T_CLEAN will be required for '#' formats", 1)) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
(void) va_arg(*p_va, int *);
|
(void) va_arg(*p_va, int *);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
format++;
|
format++;
|
||||||
} else if ((c == 's' || c == 'z' || c == 'y' || c == 'w')
|
} else if ((c == 's' || c == 'z' || c == 'y' || c == 'w')
|
||||||
&& *format == '*')
|
&& *format == '*')
|
||||||
|
|
|
@ -342,9 +342,14 @@ do_mkvalue(const char **p_format, va_list *p_va, int flags)
|
||||||
++*p_format;
|
++*p_format;
|
||||||
if (flags & FLAG_SIZE_T)
|
if (flags & FLAG_SIZE_T)
|
||||||
n = va_arg(*p_va, Py_ssize_t);
|
n = va_arg(*p_va, Py_ssize_t);
|
||||||
else
|
else {
|
||||||
|
if (PyErr_WarnEx(PyExc_DeprecationWarning,
|
||||||
|
"PY_SSIZE_T_CLEAN will be required for '#' formats", 1)) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
n = va_arg(*p_va, int);
|
n = va_arg(*p_va, int);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
n = -1;
|
n = -1;
|
||||||
if (u == NULL) {
|
if (u == NULL) {
|
||||||
|
@ -390,9 +395,14 @@ do_mkvalue(const char **p_format, va_list *p_va, int flags)
|
||||||
++*p_format;
|
++*p_format;
|
||||||
if (flags & FLAG_SIZE_T)
|
if (flags & FLAG_SIZE_T)
|
||||||
n = va_arg(*p_va, Py_ssize_t);
|
n = va_arg(*p_va, Py_ssize_t);
|
||||||
else
|
else {
|
||||||
|
if (PyErr_WarnEx(PyExc_DeprecationWarning,
|
||||||
|
"PY_SSIZE_T_CLEAN will be required for '#' formats", 1)) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
n = va_arg(*p_va, int);
|
n = va_arg(*p_va, int);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
n = -1;
|
n = -1;
|
||||||
if (str == NULL) {
|
if (str == NULL) {
|
||||||
|
@ -423,9 +433,14 @@ do_mkvalue(const char **p_format, va_list *p_va, int flags)
|
||||||
++*p_format;
|
++*p_format;
|
||||||
if (flags & FLAG_SIZE_T)
|
if (flags & FLAG_SIZE_T)
|
||||||
n = va_arg(*p_va, Py_ssize_t);
|
n = va_arg(*p_va, Py_ssize_t);
|
||||||
else
|
else {
|
||||||
|
if (PyErr_WarnEx(PyExc_DeprecationWarning,
|
||||||
|
"PY_SSIZE_T_CLEAN will be required for '#' formats", 1)) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
n = va_arg(*p_va, int);
|
n = va_arg(*p_va, int);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
n = -1;
|
n = -1;
|
||||||
if (str == NULL) {
|
if (str == NULL) {
|
||||||
|
|
Loading…
Reference in New Issue