[Python-Dev] Difference between PyUnicode_IS_ASCII and PyUnicode_IS_COMPACT_ASCII ?

Victor Stinner victor.stinner at haypocalc.com
Tue Dec 20 20:26:51 CET 2011


On 20/12/2011 09:54, Antoine Pitrou wrote:
>> Hello,
>> The include file (unicodeobject.h) seems to imply that some pure ASCII
> strings can be non-compact, but I don't understand how that can happen.

If you create a string from Py_UNICODE* or wchar_t* (using the legacy 
API), PyUnicode_READY() may create a non-compact but ASCII string.
Such string would be in the following state (extract of unicodeobject.h):
 - legacy string, ready:
 * structure = PyUnicodeObject structure
 * test: !PyUnicode_IS_COMPACT(op) && kind != PyUnicode_WCHAR_KIND
 * kind = PyUnicode_1BYTE_KIND, PyUnicode_2BYTE_KIND or
 PyUnicode_4BYTE_KIND
 * compact = 0
 * ready = 1
 * data.any is not NULL
 * utf8 is shared and utf8_length = length with data.any if 
ascii = 1
 * utf8_length = 0 if utf8 is NULL
> Besides, the following comment also seems wrong:
>> - compact:
>> * structure = PyCompactUnicodeObject
> * test: PyUnicode_IS_ASCII(op)&& !PyUnicode_IS_COMPACT(op)

I added the "test" lines recently because I always forget how to get the 
structure type. The correct test should be:
 - compact:
 * structure = PyCompactUnicodeObject
 * test: PyUnicode_IS_COMPACT(op) && !PyUnicode_IS_ASCII(op)
Victor


More information about the Python-Dev mailing list

AltStyle によって変換されたページ (->オリジナル) /