[Python-checkins] cpython: Unicode: document when the wstr pointer is shared with data

victor.stinner python-checkins at python.org
Tue Oct 4 00:09:11 CEST 2011


http://hg.python.org/cpython/rev/3889fa2194f2
changeset:   72625:3889fa2194f2
user:        Victor Stinner <victor.stinner at haypocalc.com>
date:        Tue Oct 04 00:00:20 2011 +0200
summary:
  Unicode: document when the wstr pointer is shared with data

Add also related assertions to _PyUnicode_CheckConsistency().

files:
  Include/unicodeobject.h |   8 +++++++-
  Objects/unicodeobject.c |  24 +++++++++++++++++++++++-
  2 files changed, 30 insertions(+), 2 deletions(-)


diff --git a/Include/unicodeobject.h b/Include/unicodeobject.h
--- a/Include/unicodeobject.h
+++ b/Include/unicodeobject.h
@@ -226,6 +226,9 @@
          * 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
 
        - legacy string, not ready:
 
@@ -247,7 +250,10 @@
          * compact = 0
          * ready = 1
          * 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),
        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
@@ -302,12 +302,24 @@
     }
     else if (ascii->state.compact == 1) {
         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);
-        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 {
         PyCompactUnicodeObject *compact = (PyCompactUnicodeObject *)op;
         PyUnicodeObject *unicode = (PyUnicodeObject *)op;
@@ -332,6 +344,16 @@
                 assert (compact->utf8 == unicode->data.any);
             else
                 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;

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


More information about the Python-checkins mailing list