[Python-checkins] cpython: Issue #14923: Optimize continuation-byte check in UTF-8 decoding. Patch by
mark.dickinson
python-checkins at python.org
Sat Jun 23 22:45:25 CEST 2012
http://hg.python.org/cpython/rev/3214c9ebcf5e
changeset: 77649:3214c9ebcf5e
user: Mark Dickinson <mdickinson at enthought.com>
date: Sat Jun 23 21:45:14 2012 +0100
summary:
Issue #14923: Optimize continuation-byte check in UTF-8 decoding. Patch by Serhiy Storchaka.
files:
Objects/stringlib/codecs.h | 16 ++++++++++------
1 files changed, 10 insertions(+), 6 deletions(-)
diff --git a/Objects/stringlib/codecs.h b/Objects/stringlib/codecs.h
--- a/Objects/stringlib/codecs.h
+++ b/Objects/stringlib/codecs.h
@@ -15,6 +15,9 @@
# error C 'long' size should be either 4 or 8!
#endif
+/* 10xxxxxx */
+#define IS_CONTINUATION_BYTE(ch) ((ch) >= 0x80 && (ch) < 0xC0)
+
Py_LOCAL_INLINE(Py_UCS4)
STRINGLIB(utf8_decode)(const char **inptr, const char *end,
STRINGLIB_CHAR *dest,
@@ -107,7 +110,7 @@
break;
}
ch2 = (unsigned char)s[1];
- if ((ch2 & 0xC0) != 0x80)
+ if (!IS_CONTINUATION_BYTE(ch2))
/* invalid continuation byte */
goto InvalidContinuation;
ch = (ch << 6) + ch2 -
@@ -131,8 +134,8 @@
}
ch2 = (unsigned char)s[1];
ch3 = (unsigned char)s[2];
- if ((ch2 & 0xC0) != 0x80 ||
- (ch3 & 0xC0) != 0x80) {
+ if (!IS_CONTINUATION_BYTE(ch2) ||
+ !IS_CONTINUATION_BYTE(ch3)) {
/* invalid continuation byte */
goto InvalidContinuation;
}
@@ -172,9 +175,9 @@
ch2 = (unsigned char)s[1];
ch3 = (unsigned char)s[2];
ch4 = (unsigned char)s[3];
- if ((ch2 & 0xC0) != 0x80 ||
- (ch3 & 0xC0) != 0x80 ||
- (ch4 & 0xC0) != 0x80) {
+ if (!IS_CONTINUATION_BYTE(ch2) ||
+ !IS_CONTINUATION_BYTE(ch3) ||
+ !IS_CONTINUATION_BYTE(ch4)) {
/* invalid continuation byte */
goto InvalidContinuation;
}
@@ -216,6 +219,7 @@
}
#undef ASCII_CHAR_MASK
+#undef IS_CONTINUATION_BYTE
/* UTF-8 encoder specialized for a Unicode kind to avoid the slow
--
Repository URL: http://hg.python.org/cpython
More information about the Python-checkins
mailing list