summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Doc/whatsnew/3.10.rst5
-rw-r--r--Lib/test/test_unicode.py4
-rw-r--r--Misc/NEWS.d/next/C API/2020-06-17-20-31-12.bpo-36346.mwIyxi.rst2
-rw-r--r--Objects/unicodeobject.c23
4 files changed, 30 insertions, 4 deletions
diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst
index 0674ce8..a3b53ba 100644
--- a/Doc/whatsnew/3.10.rst
+++ b/Doc/whatsnew/3.10.rst
@@ -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
-------
diff --git a/Lib/test/test_unicode.py b/Lib/test/test_unicode.py
index 6e39716..5969793 100644
--- a/Lib/test/test_unicode.py
+++ b/Lib/test/test_unicode.py
@@ -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())
diff --git a/Misc/NEWS.d/next/C API/2020-06-17-20-31-12.bpo-36346.mwIyxi.rst b/Misc/NEWS.d/next/C API/2020-06-17-20-31-12.bpo-36346.mwIyxi.rst
new file mode 100644
index 0000000..9b04003
--- /dev/null
+++ b/Misc/NEWS.d/next/C API/2020-06-17-20-31-12.bpo-36346.mwIyxi.rst
@@ -0,0 +1,2 @@
+Raises DeprecationWarning for ``PyUnicode_FromUnicode(NULL, size)`` and
+``PyUnicode_FromStringAndSize(NULL, size)`` with ``size > 0``.
diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c
index db3f55e..fe46de2 100644
--- a/Objects/unicodeobject.c
+++ b/Objects/unicodeobject.c
@@ -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 *