[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