diff options
| author | shadchin <[email protected]> | 2025-06-18 20:33:12 +0300 |
|---|---|---|
| committer | shadchin <[email protected]> | 2025-06-18 21:16:29 +0300 |
| commit | 2fcfb855cd7780ab07751cc16c80a0a58168668a (patch) | |
| tree | 078f7a88f8a93e87eb89e67e0f43120c0e01528f /contrib/tools/python3/Objects/bytesobject.c | |
| parent | 6635b88fd4c0ff9c8545c3b277eaf5debaf40b8f (diff) | |
Update Python 3 to 3.12.11
commit_hash:0054a0810a95d3f1aa3d36410976d43e03ff7e86
Diffstat (limited to 'contrib/tools/python3/Objects/bytesobject.c')
| -rw-r--r-- | contrib/tools/python3/Objects/bytesobject.c | 54 |
1 files changed, 36 insertions, 18 deletions
diff --git a/contrib/tools/python3/Objects/bytesobject.c b/contrib/tools/python3/Objects/bytesobject.c index f3a978c86c3..dae84127a7d 100644 --- a/contrib/tools/python3/Objects/bytesobject.c +++ b/contrib/tools/python3/Objects/bytesobject.c @@ -1048,10 +1048,11 @@ _PyBytes_FormatEx(const char *format, Py_ssize_t format_len, } /* Unescape a backslash-escaped string. */ -PyObject *_PyBytes_DecodeEscape(const char *s, +PyObject *_PyBytes_DecodeEscape2(const char *s, Py_ssize_t len, const char *errors, - const char **first_invalid_escape) + int *first_invalid_escape_char, + const char **first_invalid_escape_ptr) { int c; char *p; @@ -1065,7 +1066,8 @@ PyObject *_PyBytes_DecodeEscape(const char *s, return NULL; writer.overallocate = 1; - *first_invalid_escape = NULL; + *first_invalid_escape_char = -1; + *first_invalid_escape_ptr = NULL; end = s + len; while (s < end) { @@ -1103,9 +1105,10 @@ PyObject *_PyBytes_DecodeEscape(const char *s, c = (c<<3) + *s++ - '0'; } if (c > 0377) { - if (*first_invalid_escape == NULL) { - *first_invalid_escape = s-3; /* Back up 3 chars, since we've - already incremented s. */ + if (*first_invalid_escape_char == -1) { + *first_invalid_escape_char = c; + /* Back up 3 chars, since we've already incremented s. */ + *first_invalid_escape_ptr = s - 3; } } *p++ = c; @@ -1146,9 +1149,10 @@ PyObject *_PyBytes_DecodeEscape(const char *s, break; default: - if (*first_invalid_escape == NULL) { - *first_invalid_escape = s-1; /* Back up one char, since we've - already incremented s. */ + if (*first_invalid_escape_char == -1) { + *first_invalid_escape_char = (unsigned char)s[-1]; + /* Back up one char, since we've already incremented s. */ + *first_invalid_escape_ptr = s - 1; } *p++ = '\\'; s--; @@ -1162,23 +1166,37 @@ PyObject *_PyBytes_DecodeEscape(const char *s, return NULL; } +// Export for binary compatibility. +PyObject *_PyBytes_DecodeEscape(const char *s, + Py_ssize_t len, + const char *errors, + const char **first_invalid_escape) +{ + int first_invalid_escape_char; + return _PyBytes_DecodeEscape2( + s, len, errors, + &first_invalid_escape_char, + first_invalid_escape); +} + PyObject *PyBytes_DecodeEscape(const char *s, Py_ssize_t len, const char *errors, Py_ssize_t Py_UNUSED(unicode), const char *Py_UNUSED(recode_encoding)) { - const char* first_invalid_escape; - PyObject *result = _PyBytes_DecodeEscape(s, len, errors, - &first_invalid_escape); + int first_invalid_escape_char; + const char *first_invalid_escape_ptr; + PyObject *result = _PyBytes_DecodeEscape2(s, len, errors, + &first_invalid_escape_char, + &first_invalid_escape_ptr); if (result == NULL) return NULL; - if (first_invalid_escape != NULL) { - unsigned char c = *first_invalid_escape; - if ('4' <= c && c <= '7') { + if (first_invalid_escape_char != -1) { + if (first_invalid_escape_char > 0xff) { if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1, - "invalid octal escape sequence '\\%.3s'", - first_invalid_escape) < 0) + "invalid octal escape sequence '\\%o'", + first_invalid_escape_char) < 0) { Py_DECREF(result); return NULL; @@ -1187,7 +1205,7 @@ PyObject *PyBytes_DecodeEscape(const char *s, else { if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1, "invalid escape sequence '\\%c'", - c) < 0) + first_invalid_escape_char) < 0) { Py_DECREF(result); return NULL; |
