mirror of
https://github.com/python/cpython.git
synced 2025-08-27 20:25:18 +00:00
Make chr() and ord() return/accept surrogate pairs in narrow builds.
The domain of chr() and the range of ord() are now always [0 ... 0x10FFFF].
This commit is contained in:
parent
49c12ac04e
commit
8ac004e698
3 changed files with 58 additions and 19 deletions
|
@ -915,21 +915,20 @@ Py_ssize_t PyUnicode_AsWideChar(PyUnicodeObject *unicode,
|
|||
|
||||
PyObject *PyUnicode_FromOrdinal(int ordinal)
|
||||
{
|
||||
Py_UNICODE s[1];
|
||||
Py_UNICODE s[2];
|
||||
|
||||
#ifdef Py_UNICODE_WIDE
|
||||
if (ordinal < 0 || ordinal > 0x10ffff) {
|
||||
PyErr_SetString(PyExc_ValueError,
|
||||
"chr() arg not in range(0x110000) "
|
||||
"(wide Python build)");
|
||||
"chr() arg not in range(0x110000)");
|
||||
return NULL;
|
||||
}
|
||||
#else
|
||||
if (ordinal < 0 || ordinal > 0xffff) {
|
||||
PyErr_SetString(PyExc_ValueError,
|
||||
"chr() arg not in range(0x10000) "
|
||||
"(narrow Python build)");
|
||||
return NULL;
|
||||
|
||||
#ifndef Py_UNICODE_WIDE
|
||||
if (ordinal > 0xffff) {
|
||||
ordinal -= 0x10000;
|
||||
s[0] = 0xD800 | (ordinal >> 10);
|
||||
s[1] = 0xDC00 | (ordinal & 0x3FF);
|
||||
return PyUnicode_FromUnicode(s, 2);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue