bpo-36346: Add Py_DEPRECATED to deprecated unicode APIs (GH-20878)

Co-authored-by: Kyle Stanley <aeros167@gmail.com>
Co-authored-by: Victor Stinner <vstinner@python.org>
(cherry picked from commit 2c4928d37e)
This commit is contained in:
Inada Naoki 2020-06-18 17:30:53 +09:00 committed by GitHub
parent 9a58f03dc2
commit 610a60c601
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 75 additions and 22 deletions

View File

@ -1097,6 +1097,12 @@ Porting to Python 3.9
internal C API (``pycore_gc.h``). internal C API (``pycore_gc.h``).
(Contributed by Victor Stinner in :issue:`40241`.) (Contributed by Victor Stinner in :issue:`40241`.)
* The ``Py_UNICODE_COPY``, ``Py_UNICODE_FILL``, ``PyUnicode_WSTR_LENGTH``,
:c:func:`PyUnicode_FromUnicode`, :c:func:`PyUnicode_AsUnicode`,
``_PyUnicode_AsUnicode``, and :c:func:`PyUnicode_AsUnicodeAndSize` are
marked as deprecated in C. They have been deprecated by :pep:`393` since
Python 3.3.
(Contributed by Inada Naoki in :issue:`36346`.)
Removed Removed
------- -------
@ -1165,3 +1171,8 @@ Removed
* Remove ``_PyUnicode_ClearStaticStrings()`` function. * Remove ``_PyUnicode_ClearStaticStrings()`` function.
(Contributed by Victor Stinner in :issue:`39465`.) (Contributed by Victor Stinner in :issue:`39465`.)
* Remove ``Py_UNICODE_MATCH``. It has been deprecated by :pep:`393`, and
broken since Python 3.3. The :c:func:`PyUnicode_Tailmatch` function can be
used instead.
(Contributed by Inada Naoki in :issue:`36346`.)

View File

@ -50,13 +50,18 @@ extern "C" {
Py_UNICODE_ISDIGIT(ch) || \ Py_UNICODE_ISDIGIT(ch) || \
Py_UNICODE_ISNUMERIC(ch)) Py_UNICODE_ISNUMERIC(ch))
#define Py_UNICODE_COPY(target, source, length) \ Py_DEPRECATED(3.3) static inline void
memcpy((target), (source), (length)*sizeof(Py_UNICODE)) Py_UNICODE_COPY(Py_UNICODE *target, const Py_UNICODE *source, Py_ssize_t length) {
memcpy(target, source, length * sizeof(Py_UNICODE));
}
#define Py_UNICODE_FILL(target, value, length) \ Py_DEPRECATED(3.3) static inline void
do {Py_ssize_t i_; Py_UNICODE *t_ = (target); Py_UNICODE v_ = (value);\ Py_UNICODE_FILL(Py_UNICODE *target, Py_UNICODE value, Py_ssize_t length) {
for (i_ = 0; i_ < (length); i_++) t_[i_] = v_;\ Py_ssize_t i;
} while (0) for (i = 0; i < length; i++) {
target[i] = value;
}
}
/* macros to work with surrogates */ /* macros to work with surrogates */
#define Py_UNICODE_IS_SURROGATE(ch) (0xD800 <= (ch) && (ch) <= 0xDFFF) #define Py_UNICODE_IS_SURROGATE(ch) (0xD800 <= (ch) && (ch) <= 0xDFFF)
@ -71,14 +76,6 @@ extern "C" {
/* low surrogate = bottom 10 bits added to DC00 */ /* low surrogate = bottom 10 bits added to DC00 */
#define Py_UNICODE_LOW_SURROGATE(ch) (0xDC00 + ((ch) & 0x3FF)) #define Py_UNICODE_LOW_SURROGATE(ch) (0xDC00 + ((ch) & 0x3FF))
/* Check if substring matches at given offset. The offset must be
valid, and the substring must not be empty. */
#define Py_UNICODE_MATCH(string, offset, substring) \
((*((string)->wstr + (offset)) == *((substring)->wstr)) && \
((*((string)->wstr + (offset) + (substring)->wstr_length-1) == *((substring)->wstr + (substring)->wstr_length-1))) && \
!memcmp((string)->wstr + (offset), (substring)->wstr, (substring)->wstr_length*sizeof(Py_UNICODE)))
/* --- Unicode Type ------------------------------------------------------- */ /* --- Unicode Type ------------------------------------------------------- */
/* ASCII-only strings created through PyUnicode_New use the PyASCIIObject /* ASCII-only strings created through PyUnicode_New use the PyASCIIObject
@ -251,10 +248,6 @@ PyAPI_FUNC(int) _PyUnicode_CheckConsistency(
int check_content); int check_content);
/* Fast access macros */ /* Fast access macros */
#define PyUnicode_WSTR_LENGTH(op) \
(PyUnicode_IS_COMPACT_ASCII(op) ? \
((PyASCIIObject*)op)->length : \
((PyCompactUnicodeObject*)op)->wstr_length)
/* Returns the deprecated Py_UNICODE representation's size in code units /* Returns the deprecated Py_UNICODE representation's size in code units
(this includes surrogate pairs as 2 units). (this includes surrogate pairs as 2 units).
@ -449,6 +442,14 @@ enum PyUnicode_Kind {
(0xffffU) : \ (0xffffU) : \
(0x10ffffU))))) (0x10ffffU)))))
Py_DEPRECATED(3.3)
static inline Py_ssize_t _PyUnicode_get_wstr_length(PyObject *op) {
return PyUnicode_IS_COMPACT_ASCII(op) ?
((PyASCIIObject*)op)->length :
((PyCompactUnicodeObject*)op)->wstr_length;
}
#define PyUnicode_WSTR_LENGTH(op) _PyUnicode_get_wstr_length((PyObject*)op)
/* === Public API ========================================================= */ /* === Public API ========================================================= */
/* --- Plain Py_UNICODE --------------------------------------------------- */ /* --- Plain Py_UNICODE --------------------------------------------------- */
@ -547,7 +548,7 @@ PyAPI_FUNC(void) _PyUnicode_FastFill(
only allowed if u was set to NULL. only allowed if u was set to NULL.
The buffer is copied into the new object. */ The buffer is copied into the new object. */
/* Py_DEPRECATED(3.3) */ PyAPI_FUNC(PyObject*) PyUnicode_FromUnicode( Py_DEPRECATED(3.3) PyAPI_FUNC(PyObject*) PyUnicode_FromUnicode(
const Py_UNICODE *u, /* Unicode buffer */ const Py_UNICODE *u, /* Unicode buffer */
Py_ssize_t size /* size of buffer */ Py_ssize_t size /* size of buffer */
); );
@ -576,13 +577,13 @@ PyAPI_FUNC(Py_UCS4) _PyUnicode_FindMaxChar (
Py_UNICODE buffer. Py_UNICODE buffer.
If the wchar_t/Py_UNICODE representation is not yet available, this If the wchar_t/Py_UNICODE representation is not yet available, this
function will calculate it. */ function will calculate it. */
/* Py_DEPRECATED(3.3) */ PyAPI_FUNC(Py_UNICODE *) PyUnicode_AsUnicode( Py_DEPRECATED(3.3) PyAPI_FUNC(Py_UNICODE *) PyUnicode_AsUnicode(
PyObject *unicode /* Unicode object */ PyObject *unicode /* Unicode object */
); );
/* Similar to PyUnicode_AsUnicode(), but raises a ValueError if the string /* Similar to PyUnicode_AsUnicode(), but raises a ValueError if the string
contains null characters. */ contains null characters. */
PyAPI_FUNC(const Py_UNICODE *) _PyUnicode_AsUnicode( Py_DEPRECATED(3.3) PyAPI_FUNC(const Py_UNICODE *) _PyUnicode_AsUnicode(
PyObject *unicode /* Unicode object */ PyObject *unicode /* Unicode object */
); );
@ -591,7 +592,7 @@ PyAPI_FUNC(const Py_UNICODE *) _PyUnicode_AsUnicode(
If the wchar_t/Py_UNICODE representation is not yet available, this If the wchar_t/Py_UNICODE representation is not yet available, this
function will calculate it. */ function will calculate it. */
/* Py_DEPRECATED(3.3) */ PyAPI_FUNC(Py_UNICODE *) PyUnicode_AsUnicodeAndSize( Py_DEPRECATED(3.3) PyAPI_FUNC(Py_UNICODE *) PyUnicode_AsUnicodeAndSize(
PyObject *unicode, /* Unicode object */ PyObject *unicode, /* Unicode object */
Py_ssize_t *size /* location where to save the length */ Py_ssize_t *size /* location where to save the length */
); );

View File

@ -0,0 +1,4 @@
Mark ``Py_UNICODE_COPY``, ``Py_UNICODE_FILL``, ``PyUnicode_WSTR_LENGTH``,
``PyUnicode_FromUnicode``, ``PyUnicode_AsUnicode``, ``_PyUnicode_AsUnicode``,
and ``PyUnicode_AsUnicodeAndSize`` as deprecated in C. Remove ``Py_UNICODE_MATCH``
which was deprecated and broken since Python 3.3.

View File

@ -1668,6 +1668,10 @@ parse_tuple_and_keywords(PyObject *self, PyObject *args)
static volatile int x; static volatile int x;
/* Ignore use of deprecated APIs */
_Py_COMP_DIAG_PUSH
_Py_COMP_DIAG_IGNORE_DEPR_DECLS
/* Test the u and u# codes for PyArg_ParseTuple. May leak memory in case /* Test the u and u# codes for PyArg_ParseTuple. May leak memory in case
of an error. of an error.
*/ */
@ -1844,6 +1848,7 @@ test_widechar(PyObject *self, PyObject *Py_UNUSED(ignored))
Py_RETURN_NONE; Py_RETURN_NONE;
} }
_Py_COMP_DIAG_POP
static PyObject * static PyObject *
unicode_aswidechar(PyObject *self, PyObject *args) unicode_aswidechar(PyObject *self, PyObject *args)
@ -2064,6 +2069,10 @@ unicode_transformdecimaltoascii(PyObject *self, PyObject *args)
return PyUnicode_TransformDecimalToASCII(unicode, length); return PyUnicode_TransformDecimalToASCII(unicode, length);
} }
/* Ignore use of deprecated APIs */
_Py_COMP_DIAG_PUSH
_Py_COMP_DIAG_IGNORE_DEPR_DECLS
static PyObject * static PyObject *
unicode_legacy_string(PyObject *self, PyObject *args) unicode_legacy_string(PyObject *self, PyObject *args)
{ {
@ -2086,6 +2095,7 @@ unicode_legacy_string(PyObject *self, PyObject *args)
return u; return u;
} }
_Py_COMP_DIAG_POP
static PyObject * static PyObject *
getargs_w_star(PyObject *self, PyObject *args) getargs_w_star(PyObject *self, PyObject *args)

View File

@ -120,6 +120,13 @@ extern "C" {
_PyUnicode_UTF8_LENGTH(op)) _PyUnicode_UTF8_LENGTH(op))
#define _PyUnicode_WSTR(op) \ #define _PyUnicode_WSTR(op) \
(((PyASCIIObject*)(op))->wstr) (((PyASCIIObject*)(op))->wstr)
/* Don't use deprecated macro of unicodeobject.h */
#undef PyUnicode_WSTR_LENGTH
#define PyUnicode_WSTR_LENGTH(op) \
(PyUnicode_IS_COMPACT_ASCII(op) ? \
((PyASCIIObject*)op)->length : \
((PyCompactUnicodeObject*)op)->wstr_length)
#define _PyUnicode_WSTR_LENGTH(op) \ #define _PyUnicode_WSTR_LENGTH(op) \
(((PyCompactUnicodeObject*)(op))->wstr_length) (((PyCompactUnicodeObject*)(op))->wstr_length)
#define _PyUnicode_LENGTH(op) \ #define _PyUnicode_LENGTH(op) \
@ -964,11 +971,14 @@ ensure_unicode(PyObject *obj)
#include "stringlib/find_max_char.h" #include "stringlib/find_max_char.h"
#include "stringlib/undef.h" #include "stringlib/undef.h"
_Py_COMP_DIAG_PUSH
_Py_COMP_DIAG_IGNORE_DEPR_DECLS
#include "stringlib/unicodedefs.h" #include "stringlib/unicodedefs.h"
#include "stringlib/fastsearch.h" #include "stringlib/fastsearch.h"
#include "stringlib/count.h" #include "stringlib/count.h"
#include "stringlib/find.h" #include "stringlib/find.h"
#include "stringlib/undef.h" #include "stringlib/undef.h"
_Py_COMP_DIAG_POP
/* --- Unicode Object ----------------------------------------------------- */ /* --- Unicode Object ----------------------------------------------------- */
@ -4087,6 +4097,11 @@ PyUnicode_AsUnicodeAndSize(PyObject *unicode, Py_ssize_t *size)
return w; return w;
} }
/* Deprecated APIs */
_Py_COMP_DIAG_PUSH
_Py_COMP_DIAG_IGNORE_DEPR_DECLS
Py_UNICODE * Py_UNICODE *
PyUnicode_AsUnicode(PyObject *unicode) PyUnicode_AsUnicode(PyObject *unicode)
{ {
@ -4125,6 +4140,8 @@ PyUnicode_GetSize(PyObject *unicode)
return -1; return -1;
} }
_Py_COMP_DIAG_POP
Py_ssize_t Py_ssize_t
PyUnicode_GetLength(PyObject *unicode) PyUnicode_GetLength(PyObject *unicode)
{ {
@ -12352,6 +12369,8 @@ PyUnicode_IsIdentifier(PyObject *self)
return len && i == len; return len && i == len;
} }
else { else {
_Py_COMP_DIAG_PUSH
_Py_COMP_DIAG_IGNORE_DEPR_DECLS
Py_ssize_t i = 0, len = PyUnicode_GET_SIZE(self); Py_ssize_t i = 0, len = PyUnicode_GET_SIZE(self);
if (len == 0) { if (len == 0) {
/* an empty string is not a valid identifier */ /* an empty string is not a valid identifier */
@ -12389,6 +12408,7 @@ PyUnicode_IsIdentifier(PyObject *self)
} }
} }
return 1; return 1;
_Py_COMP_DIAG_POP
} }
} }
@ -15944,7 +15964,10 @@ PyUnicode_AsUnicodeCopy(PyObject *unicode)
PyErr_BadArgument(); PyErr_BadArgument();
return NULL; return NULL;
} }
_Py_COMP_DIAG_PUSH
_Py_COMP_DIAG_IGNORE_DEPR_DECLS
u = PyUnicode_AsUnicodeAndSize(unicode, &len); u = PyUnicode_AsUnicodeAndSize(unicode, &len);
_Py_COMP_DIAG_POP
if (u == NULL) if (u == NULL)
return NULL; return NULL;
/* Ensure we won't overflow the size. */ /* Ensure we won't overflow the size. */

View File

@ -1070,6 +1070,9 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
case 'u': /* raw unicode buffer (Py_UNICODE *) */ case 'u': /* raw unicode buffer (Py_UNICODE *) */
case 'Z': /* raw unicode buffer or None */ case 'Z': /* raw unicode buffer or None */
{ {
// TODO: Raise DeprecationWarning
_Py_COMP_DIAG_PUSH
_Py_COMP_DIAG_IGNORE_DEPR_DECLS
Py_UNICODE **p = va_arg(*p_va, Py_UNICODE **); Py_UNICODE **p = va_arg(*p_va, Py_UNICODE **);
if (*format == '#') { if (*format == '#') {
@ -1109,6 +1112,7 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
arg, msgbuf, bufsize); arg, msgbuf, bufsize);
} }
break; break;
_Py_COMP_DIAG_POP
} }
case 'e': {/* encoded string */ case 'e': {/* encoded string */