Issue #13441: _PyUnicode_CheckConsistency() dumps the string if the maximum
character is bigger than U+10FFFF and locale.localeconv() dumps the string before decoding it. Temporary hack to debug the issue #13441.
This commit is contained in:
parent
a996f1e1a0
commit
da29cc36aa
|
@ -79,6 +79,23 @@ str2uni(const char* s)
|
|||
return res2;
|
||||
}
|
||||
|
||||
#ifdef Py_DEBUG
|
||||
void
|
||||
dump_str(const char *name, const char *value)
|
||||
{
|
||||
size_t i, len = strlen(value);
|
||||
printf("Decode localeconv() %s: {", name);
|
||||
for (i=0; i<len; i++) {
|
||||
unsigned char ch = value[i];
|
||||
if (i)
|
||||
printf(" 0x%02x", ch);
|
||||
else
|
||||
printf("0x%02x", ch);
|
||||
}
|
||||
printf("} (len=%u)\n", len);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* support functions for formatting floating point numbers */
|
||||
|
||||
PyDoc_STRVAR(setlocale__doc__,
|
||||
|
@ -184,11 +201,20 @@ PyLocale_localeconv(PyObject* self)
|
|||
/* hopefully, the localeconv result survives the C library calls
|
||||
involved herein */
|
||||
|
||||
#ifdef Py_DEBUG
|
||||
#define RESULT_STRING(s)\
|
||||
dump_str(#s, l->s); \
|
||||
x = str2uni(l->s); \
|
||||
if (!x) goto failed;\
|
||||
PyDict_SetItemString(result, #s, x);\
|
||||
Py_XDECREF(x)
|
||||
#else
|
||||
#define RESULT_STRING(s)\
|
||||
x = str2uni(l->s); \
|
||||
if (!x) goto failed;\
|
||||
PyDict_SetItemString(result, #s, x);\
|
||||
Py_XDECREF(x)
|
||||
#endif
|
||||
|
||||
#define RESULT_INT(i)\
|
||||
x = PyLong_FromLong(l->i);\
|
||||
|
|
|
@ -391,6 +391,19 @@ _PyUnicode_CheckConsistency(PyObject *op, int check_content)
|
|||
if (ch > maxchar)
|
||||
maxchar = ch;
|
||||
}
|
||||
if (maxchar > 0x10FFFF) {
|
||||
printf("Invalid Unicode string! {");
|
||||
for (i=0; i < ascii->length; i++)
|
||||
{
|
||||
Py_UCS4 ch = PyUnicode_READ(kind, data, i);
|
||||
if (i)
|
||||
printf(", U+%04x", ch);
|
||||
else
|
||||
printf("U+%04x", ch);
|
||||
}
|
||||
printf("} (len=%u)\n", ascii->length);
|
||||
abort();
|
||||
}
|
||||
if (kind == PyUnicode_1BYTE_KIND) {
|
||||
if (ascii->state.ascii == 0) {
|
||||
assert(maxchar >= 128);
|
||||
|
|
Loading…
Reference in New Issue