From 85041a54bd2712775fe152807ee3e76dea83b15a Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 3 Oct 2011 14:42:39 +0200 Subject: [PATCH] _PyUnicode_CheckConsistency() checks utf8 field consistency --- Include/unicodeobject.h | 2 ++ Objects/unicodeobject.c | 6 ++++++ 2 files changed, 8 insertions(+) diff --git a/Include/unicodeobject.h b/Include/unicodeobject.h index d7c9fa773c..1b6d1c94e1 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 c3e1f290e1..1d90f69be0 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; -- 2.49.0