summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVictor Stinner <vstinner@wyplay.com>2011-10-03 12:42:39 (GMT)
committerVictor Stinner <vstinner@wyplay.com>2011-10-03 12:42:39 (GMT)
commit85041a54bd2712775fe152807ee3e76dea83b15a (patch)
tree5d55023ceb387a52a01374c02192ec20fdcf9d04
parent3cf4637e4e15fb79bc741be37524199ed21c64b2 (diff)
downloadcpython-85041a54bd2712775fe152807ee3e76dea83b15a.zip
cpython-85041a54bd2712775fe152807ee3e76dea83b15a.tar.gz
cpython-85041a54bd2712775fe152807ee3e76dea83b15a.tar.bz2
_PyUnicode_CheckConsistency() checks utf8 field consistency
-rw-r--r--Include/unicodeobject.h2
-rw-r--r--Objects/unicodeobject.c6
2 files changed, 8 insertions, 0 deletions
diff --git a/Include/unicodeobject.h b/Include/unicodeobject.h
index d7c9fa7..1b6d1c9 100644
--- a/Include/unicodeobject.h
+++ b/Include/unicodeobject.h
@@ -225,6 +225,7 @@ typedef struct {
* compact = 1
* ready = 1
* ascii = 0
+ * utf8 != data
- string created by the legacy API (not ready):
@@ -246,6 +247,7 @@ typedef struct {
* compact = 0
* ready = 1
* data.any is not NULL
+ * utf8 = data if ascii is 1
String created by the legacy API becomes ready when calling
PyUnicode_READY().
diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c
index c3e1f29..1d90f69 100644
--- a/Objects/unicodeobject.c
+++ b/Objects/unicodeobject.c
@@ -293,11 +293,13 @@ _PyUnicode_CheckConsistency(void *op)
assert(ascii->state.ready == 1);
}
else if (ascii->state.compact == 1) {
+ PyCompactUnicodeObject *compact = (PyCompactUnicodeObject *)op;
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));
} else {
PyCompactUnicodeObject *compact = (PyCompactUnicodeObject *)op;
PyUnicodeObject *unicode = (PyUnicodeObject *)op;
@@ -318,6 +320,10 @@ _PyUnicode_CheckConsistency(void *op)
assert(ascii->state.compact == 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);
}
}
return 1;