Unicode: document when the wstr pointer is shared with data

Add also related assertions to _PyUnicode_CheckConsistency().
This commit is contained in:
Victor Stinner 2011-10-04 00:00:20 +02:00
parent 03490918b7
commit 7f11ad4594
2 changed files with 30 additions and 2 deletions

View File

@ -226,6 +226,9 @@ typedef struct {
* ready = 1 * ready = 1
* ascii = 0 * ascii = 0
* utf8 != data * utf8 != data
* wstr is shared with data if kind=PyUnicode_2BYTE_KIND
and sizeof(wchar_t)=2 or if kind=PyUnicode_4BYTE_KIND and
sizeof(wchar_4)=4
- legacy string, not ready: - legacy string, not ready:
@ -247,7 +250,10 @@ 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 * utf8 is shared with data.any if ascii = 1
* wstr is shared with data.any if kind=PyUnicode_2BYTE_KIND
and sizeof(wchar_t)=2 or if kind=PyUnicode_4BYTE_KIND and
sizeof(wchar_4)=4
Compact strings use only one memory block (structure + characters), Compact strings use only one memory block (structure + characters),
whereas legacy strings use one block for the structure and one block whereas legacy strings use one block for the structure and one block

View File

@ -302,12 +302,24 @@ _PyUnicode_CheckConsistency(void *op)
} }
else if (ascii->state.compact == 1) { else if (ascii->state.compact == 1) {
PyCompactUnicodeObject *compact = (PyCompactUnicodeObject *)op; PyCompactUnicodeObject *compact = (PyCompactUnicodeObject *)op;
void *data;
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)); data = compact + 1;
assert (compact->utf8 != data);
if (
#if SIZEOF_WCHAR_T == 2
kind == PyUnicode_2BYTE_KIND
#else
kind == PyUnicode_4BYTE_KIND
#endif
)
assert(ascii->wstr == data);
else
assert(ascii->wstr != data);
} else { } else {
PyCompactUnicodeObject *compact = (PyCompactUnicodeObject *)op; PyCompactUnicodeObject *compact = (PyCompactUnicodeObject *)op;
PyUnicodeObject *unicode = (PyUnicodeObject *)op; PyUnicodeObject *unicode = (PyUnicodeObject *)op;
@ -332,6 +344,16 @@ _PyUnicode_CheckConsistency(void *op)
assert (compact->utf8 == unicode->data.any); assert (compact->utf8 == unicode->data.any);
else else
assert (compact->utf8 != unicode->data.any); assert (compact->utf8 != unicode->data.any);
if (
#if SIZEOF_WCHAR_T == 2
kind == PyUnicode_2BYTE_KIND
#else
kind == PyUnicode_4BYTE_KIND
#endif
)
assert(ascii->wstr == unicode->data.any);
else
assert(ascii->wstr != unicode->data.any);
} }
} }
return 1; return 1;