[Python-checkins] cpython: Document utf8_length and wstr_length states

victor.stinner python-checkins at python.org
Tue Oct 4 01:16:16 CEST 2011


http://hg.python.org/cpython/rev/5346409167a7
changeset:   72629:5346409167a7
user:        Victor Stinner <victor.stinner at haypocalc.com>
date:        Tue Oct 04 01:05:08 2011 +0200
summary:
  Document utf8_length and wstr_length states

Ensure these states with assertions in _PyUnicode_CheckConsistency().

files:
  Include/unicodeobject.h |  19 +++--
  Objects/unicodeobject.c |  88 +++++++++++++++-------------
  2 files changed, 58 insertions(+), 49 deletions(-)


diff --git a/Include/unicodeobject.h b/Include/unicodeobject.h
--- a/Include/unicodeobject.h
+++ b/Include/unicodeobject.h
@@ -226,9 +226,11 @@
          * ready = 1
          * ascii = 0
          * 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
+         * utf8_length = 0 if utf8 is NULL
+         * wstr is shared with data and wstr_length=length
+           if kind=PyUnicode_2BYTE_KIND and sizeof(wchar_t)=2
+           or if kind=PyUnicode_4BYTE_KIND and sizeof(wchar_4)=4
+         * wstr_length = 0 if wstr is NULL
 
        - legacy string, not ready:
 
@@ -239,6 +241,7 @@
          * wstr is not NULL
          * data.any is NULL
          * utf8 is NULL
+         * utf8_length = 0
          * interned = SSTATE_NOT_INTERNED
          * ascii = 0
 
@@ -250,10 +253,12 @@
          * compact = 0
          * ready = 1
          * data.any is not NULL
-         * 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
+         * utf8 is shared and utf8_length = length with data.any if ascii = 1
+         * utf8_length = 0 if utf8 is NULL
+         * wstr is shared and wstr_length = length with data.any
+           if kind=PyUnicode_2BYTE_KIND and sizeof(wchar_t)=2
+           or if kind=PyUnicode_4BYTE_KIND and sizeof(wchar_4)=4
+         * wstr_length = 0 if wstr is NULL
 
        Compact strings use only one memory block (structure + characters),
        whereas legacy strings use one block for the structure and one block
diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c
--- a/Objects/unicodeobject.c
+++ b/Objects/unicodeobject.c
@@ -300,50 +300,47 @@
         assert(kind == PyUnicode_1BYTE_KIND);
         assert(ascii->state.ready == 1);
     }
-    else if (ascii->state.compact == 1) {
+    else {
         PyCompactUnicodeObject *compact = (PyCompactUnicodeObject *)op;
         void *data;
-        assert(kind == PyUnicode_1BYTE_KIND
-               || kind == PyUnicode_2BYTE_KIND
-               || kind == PyUnicode_4BYTE_KIND);
-        assert(ascii->state.ascii == 0);
-        assert(ascii->state.ready == 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 {
-        PyCompactUnicodeObject *compact = (PyCompactUnicodeObject *)op;
-        PyUnicodeObject *unicode = (PyUnicodeObject *)op;
-
-        if (kind == PyUnicode_WCHAR_KIND) {
-            assert(ascii->state.compact == 0);
-            assert(ascii->state.ascii == 0);
-            assert(ascii->state.ready == 0);
-            assert(ascii->wstr != NULL);
-            assert(unicode->data.any == NULL);
-            assert(compact->utf8 == NULL);
-            assert(ascii->state.interned == SSTATE_NOT_INTERNED);
-        }
-        else {
+
+        if (ascii->state.compact == 1) {
+            data = compact + 1;
             assert(kind == PyUnicode_1BYTE_KIND
                    || kind == PyUnicode_2BYTE_KIND
                    || kind == PyUnicode_4BYTE_KIND);
-            assert(ascii->state.compact == 0);
+            assert(ascii->state.ascii == 0);
             assert(ascii->state.ready == 1);
-            assert(unicode->data.any != NULL);
-            if (ascii->state.ascii)
-                assert (compact->utf8 == unicode->data.any);
-            else
-                assert (compact->utf8 != unicode->data.any);
+            assert (compact->utf8 != data);
+        } else {
+            PyUnicodeObject *unicode = (PyUnicodeObject *)op;
+
+            data = unicode->data.any;
+            if (kind == PyUnicode_WCHAR_KIND) {
+                assert(ascii->state.compact == 0);
+                assert(ascii->state.ascii == 0);
+                assert(ascii->state.ready == 0);
+                assert(ascii->wstr != NULL);
+                assert(data == NULL);
+                assert(compact->utf8 == NULL);
+                assert(ascii->state.interned == SSTATE_NOT_INTERNED);
+            }
+            else {
+                assert(kind == PyUnicode_1BYTE_KIND
+                       || kind == PyUnicode_2BYTE_KIND
+                       || kind == PyUnicode_4BYTE_KIND);
+                assert(ascii->state.compact == 0);
+                assert(ascii->state.ready == 1);
+                assert(data != NULL);
+                if (ascii->state.ascii) {
+                    assert (compact->utf8 == data);
+                    assert (compact->utf8_length == ascii->length);
+                }
+                else
+                    assert (compact->utf8 != data);
+            }
+        }
+        if (kind != PyUnicode_WCHAR_KIND) {
             if (
 #if SIZEOF_WCHAR_T == 2
                 kind == PyUnicode_2BYTE_KIND
@@ -351,10 +348,17 @@
                 kind == PyUnicode_4BYTE_KIND
 #endif
                )
-                assert(ascii->wstr == unicode->data.any);
-            else
-                assert(ascii->wstr != unicode->data.any);
-        }
+            {
+                assert(ascii->wstr == data);
+                assert(compact->wstr_length == ascii->length);
+            } else
+                assert(ascii->wstr != data);
+        }
+
+        if (compact->utf8 == NULL)
+            assert(compact->utf8_length == 0);
+        if (ascii->wstr == NULL)
+            assert(compact->wstr_length == 0);
     }
     return 1;
 }

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list