summaryrefslogtreecommitdiffstats
path: root/Include/unicodeobject.h
diff options
context:
space:
mode:
Diffstat (limited to 'Include/unicodeobject.h')
-rw-r--r--Include/unicodeobject.h41
1 files changed, 25 insertions, 16 deletions
diff --git a/Include/unicodeobject.h b/Include/unicodeobject.h
index ba73e56..d7c9fa7 100644
--- a/Include/unicodeobject.h
+++ b/Include/unicodeobject.h
@@ -224,7 +224,7 @@ typedef struct {
PyUnicode_4BYTE_KIND
* compact = 1
* ready = 1
- * (ascii = 0)
+ * ascii = 0
- string created by the legacy API (not ready):
@@ -236,7 +236,7 @@ typedef struct {
* data.any is NULL
* utf8 is NULL
* interned = SSTATE_NOT_INTERNED
- * (ascii = 0)
+ * ascii = 0
- string created by the legacy API, ready:
@@ -246,7 +246,6 @@ typedef struct {
* compact = 0
* ready = 1
* data.any is not NULL
- * (ascii = 0)
String created by the legacy API becomes ready when calling
PyUnicode_READY().
@@ -278,8 +277,9 @@ typedef struct {
one block for the PyUnicodeObject struct and another for its data
buffer. */
unsigned int compact:1;
- /* Compact objects which are ASCII-only also have the state.compact
- flag set, and use the PyASCIIObject struct. */
+ /* kind is PyUnicode_1BYTE_KIND but data contains only ASCII
+ characters. If ascii is 1 and compact is 1, use the PyASCIIObject
+ structure. */
unsigned int ascii:1;
/* The ready flag indicates whether the object layout is initialized
completely. This means that this is either a compact object, or
@@ -304,7 +304,7 @@ typedef struct {
/* Strings allocated through PyUnicode_FromUnicode(NULL, len) use the
PyUnicodeObject structure. The actual string data is initially in the wstr
- block, and copied into the data block using PyUnicode_Ready. */
+ block, and copied into the data block using _PyUnicode_Ready. */
typedef struct {
PyCompactUnicodeObject _base;
union {
@@ -327,7 +327,7 @@ PyAPI_DATA(PyTypeObject) PyUnicodeIter_Type;
#ifndef Py_LIMITED_API
#define PyUnicode_WSTR_LENGTH(op) \
- (((PyASCIIObject*)op)->state.ascii ? \
+ (PyUnicode_IS_COMPACT_ASCII(op) ? \
((PyASCIIObject*)op)->length : \
((PyCompactUnicodeObject*)op)->wstr_length)
@@ -369,10 +369,24 @@ PyAPI_DATA(PyTypeObject) PyUnicodeIter_Type;
#define SSTATE_INTERNED_MORTAL 1
#define SSTATE_INTERNED_IMMORTAL 2
-#define PyUnicode_IS_COMPACT_ASCII(op) (((PyASCIIObject*)op)->state.ascii)
+/* Return true if the string contains only ASCII characters, or 0 if not. The
+ string may be compact (PyUnicode_IS_COMPACT_ASCII) or not. No type checks
+ or Ready calls are performed. */
+#define PyUnicode_IS_ASCII(op) \
+ (((PyASCIIObject*)op)->state.ascii)
+
+/* Return true if the string is compact or 0 if not.
+ No type checks or Ready calls are performed. */
+#define PyUnicode_IS_COMPACT(op) \
+ (((PyASCIIObject*)(op))->state.compact)
+
+/* Return true if the string is a compact ASCII string (use PyASCIIObject
+ structure), or 0 if not. No type checks or Ready calls are performed. */
+#define PyUnicode_IS_COMPACT_ASCII(op) \
+ (PyUnicode_IS_ASCII(op) && PyUnicode_IS_COMPACT(op))
/* String contains only wstr byte characters. This is only possible
- when the string was created with a legacy API and PyUnicode_Ready()
+ when the string was created with a legacy API and _PyUnicode_Ready()
has not been called yet. */
#define PyUnicode_WCHAR_KIND 0
@@ -399,11 +413,6 @@ PyAPI_DATA(PyTypeObject) PyUnicodeIter_Type;
#define PyUnicode_2BYTE_DATA(op) ((Py_UCS2*)PyUnicode_DATA(op))
#define PyUnicode_4BYTE_DATA(op) ((Py_UCS4*)PyUnicode_DATA(op))
-/* Return true if the string is compact or 0 if not.
- No type checks or Ready calls are performed. */
-#define PyUnicode_IS_COMPACT(op) \
- (((PyASCIIObject*)(op))->state.compact)
-
/* Return one of the PyUnicode_*_KIND values defined above. */
#define PyUnicode_KIND(op) \
(assert(PyUnicode_Check(op)), \
@@ -500,9 +509,9 @@ PyAPI_DATA(PyTypeObject) PyUnicodeIter_Type;
#define PyUnicode_IS_READY(op) (((PyASCIIObject*)op)->state.ready)
-/* PyUnicode_READY() does less work than PyUnicode_Ready() in the best
+/* PyUnicode_READY() does less work than _PyUnicode_Ready() in the best
case. If the canonical representation is not yet set, it will still call
- PyUnicode_Ready().
+ _PyUnicode_Ready().
Returns 0 on success and -1 on errors. */
#define PyUnicode_READY(op) \
(assert(PyUnicode_Check(op)), \