bpo-36346: Raise DeprecationWarning when creating legacy Unicode (GH-20933)

This commit is contained in:
Inada Naoki 2020-06-30 15:26:56 +09:00 committed by GitHub
parent 349f76c6aa
commit 038dd0f79d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 30 additions and 4 deletions

View File

@ -213,6 +213,11 @@ Porting to Python 3.10
for historical reason. It is no longer allowed.
(Contributed by Victor Stinner in :issue:`40839`.)
* ``PyUnicode_FromUnicode(NULL, size)`` and ``PyUnicode_FromStringAndSize(NULL, size)``
raise ``DeprecationWarning`` now. Use :c:func:`PyUnicode_New` to allocate
Unicode object without initial data.
(Contributed by Inada Naoki in :issue:`36346`.)
Removed
-------

View File

@ -725,7 +725,9 @@ class UnicodeTest(string_tests.CommonTest,
import _testcapi
u = '𝖀𝖓𝖎𝖈𝖔𝖉𝖊'
self.assertTrue(u.isidentifier())
self.assertTrue(_testcapi.unicode_legacy_string(u).isidentifier())
with support.check_warnings():
warnings.simplefilter('ignore', DeprecationWarning)
self.assertTrue(_testcapi.unicode_legacy_string(u).isidentifier())
def test_isprintable(self):
self.assertTrue("".isprintable())

View File

@ -0,0 +1,2 @@
Raises DeprecationWarning for ``PyUnicode_FromUnicode(NULL, size)`` and
``PyUnicode_FromStringAndSize(NULL, size)`` with ``size > 0``.

View File

@ -2179,8 +2179,16 @@ unicode_char(Py_UCS4 ch)
PyObject *
PyUnicode_FromUnicode(const Py_UNICODE *u, Py_ssize_t size)
{
if (u == NULL)
if (u == NULL) {
if (size > 0) {
if (PyErr_WarnEx(PyExc_DeprecationWarning,
"PyUnicode_FromUnicode(NULL, size) is deprecated; "
"use PyUnicode_New() instead", 1) < 0) {
return NULL;
}
}
return (PyObject*)_PyUnicode_New(size);
}
if (size < 0) {
PyErr_BadInternalCall();
@ -2266,10 +2274,19 @@ PyUnicode_FromStringAndSize(const char *u, Py_ssize_t size)
"Negative size passed to PyUnicode_FromStringAndSize");
return NULL;
}
if (u != NULL)
if (u != NULL) {
return PyUnicode_DecodeUTF8Stateful(u, size, NULL, NULL);
else
}
else {
if (size > 0) {
if (PyErr_WarnEx(PyExc_DeprecationWarning,
"PyUnicode_FromStringAndSize(NULL, size) is deprecated; "
"use PyUnicode_New() instead", 1) < 0) {
return NULL;
}
}
return (PyObject *)_PyUnicode_New(size);
}
}
PyObject *