Commit 8af37342 authored by Victor Stinner's avatar Victor Stinner

_PyUnicode_CheckConsistency() checks utf8 field consistency

parent c609ed2e
...@@ -225,6 +225,7 @@ typedef struct { ...@@ -225,6 +225,7 @@ typedef struct {
* compact = 1 * compact = 1
* ready = 1 * ready = 1
* ascii = 0 * ascii = 0
* utf8 != data
- string created by the legacy API (not ready): - string created by the legacy API (not ready):
...@@ -246,6 +247,7 @@ typedef struct { ...@@ -246,6 +247,7 @@ typedef struct {
* compact = 0 * compact = 0
* ready = 1 * ready = 1
* data.any is not NULL * data.any is not NULL
* utf8 = data if ascii is 1
String created by the legacy API becomes ready when calling String created by the legacy API becomes ready when calling
PyUnicode_READY(). PyUnicode_READY().
......
...@@ -293,11 +293,13 @@ _PyUnicode_CheckConsistency(void *op) ...@@ -293,11 +293,13 @@ _PyUnicode_CheckConsistency(void *op)
assert(ascii->state.ready == 1); assert(ascii->state.ready == 1);
} }
else if (ascii->state.compact == 1) { else if (ascii->state.compact == 1) {
PyCompactUnicodeObject *compact = (PyCompactUnicodeObject *)op;
assert(kind == PyUnicode_1BYTE_KIND assert(kind == PyUnicode_1BYTE_KIND
|| kind == PyUnicode_2BYTE_KIND || kind == PyUnicode_2BYTE_KIND
|| kind == PyUnicode_4BYTE_KIND); || kind == PyUnicode_4BYTE_KIND);
assert(ascii->state.ascii == 0); assert(ascii->state.ascii == 0);
assert(ascii->state.ready == 1); assert(ascii->state.ready == 1);
assert (compact->utf8 != (void*)(compact + 1));
} else { } else {
PyCompactUnicodeObject *compact = (PyCompactUnicodeObject *)op; PyCompactUnicodeObject *compact = (PyCompactUnicodeObject *)op;
PyUnicodeObject *unicode = (PyUnicodeObject *)op; PyUnicodeObject *unicode = (PyUnicodeObject *)op;
...@@ -318,6 +320,10 @@ _PyUnicode_CheckConsistency(void *op) ...@@ -318,6 +320,10 @@ _PyUnicode_CheckConsistency(void *op)
assert(ascii->state.compact == 0); assert(ascii->state.compact == 0);
assert(ascii->state.ready == 1); assert(ascii->state.ready == 1);
assert(unicode->data.any != NULL); assert(unicode->data.any != NULL);
if (ascii->state.ascii)
assert (compact->utf8 == unicode->data.any);
else
assert (compact->utf8 != unicode->data.any);
} }
} }
return 1; return 1;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment