[Python-checkins] r68856 - in python/branches/release30-maint: Lib/test/test_codecs.py Misc/NEWS Modules/_codecsmodule.c

antoine.pitrou python-checkins at python.org
Thu Jan 22 11:31:34 CET 2009


Author: antoine.pitrou
Date: Thu Jan 22 11:31:33 2009
New Revision: 68856

Log:
Merged revisions 68855 via svnmerge from 
svn+ssh://pythondev@svn.python.org/python/branches/py3k

........
  r68855 | antoine.pitrou | 2009-01-22 11:11:36 +0100 (jeu., 22 janv. 2009) | 3 lines
  
  Issue #4874: Most builtin decoders now reject unicode input.
........


Modified:
   python/branches/release30-maint/   (props changed)
   python/branches/release30-maint/Lib/test/test_codecs.py
   python/branches/release30-maint/Misc/NEWS
   python/branches/release30-maint/Modules/_codecsmodule.c

Modified: python/branches/release30-maint/Lib/test/test_codecs.py
==============================================================================
--- python/branches/release30-maint/Lib/test/test_codecs.py	(original)
+++ python/branches/release30-maint/Lib/test/test_codecs.py	Thu Jan 22 11:31:33 2009
@@ -1475,6 +1475,36 @@
                                        info.streamwriter, 'strict') as srw:
             self.assertEquals(srw.read(), "\xfc")
 
+class TypesTest(unittest.TestCase):
+    def test_decode_unicode(self):
+        # Most decoders don't accept unicode input
+        decoders = [
+            codecs.utf_7_decode,
+            codecs.utf_8_decode,
+            codecs.utf_16_le_decode,
+            codecs.utf_16_be_decode,
+            codecs.utf_16_ex_decode,
+            codecs.utf_32_decode,
+            codecs.utf_32_le_decode,
+            codecs.utf_32_be_decode,
+            codecs.utf_32_ex_decode,
+            codecs.latin_1_decode,
+            codecs.ascii_decode,
+            codecs.charmap_decode,
+        ]
+        if hasattr(codecs, "mbcs_decode"):
+            decoders.append(codecs.mbcs_decode)
+        for decoder in decoders:
+            self.assertRaises(TypeError, decoder, "xxx")
+
+    def test_unicode_escape(self):
+        # Escape-decoding an unicode string is supported ang gives the same
+        # result as decoding the equivalent ASCII bytes string.
+        self.assertEquals(codecs.unicode_escape_decode(r"\u1234"), ("\u1234", 6))
+        self.assertEquals(codecs.unicode_escape_decode(br"\u1234"), ("\u1234", 6))
+        self.assertEquals(codecs.raw_unicode_escape_decode(r"\u1234"), ("\u1234", 6))
+        self.assertEquals(codecs.raw_unicode_escape_decode(br"\u1234"), ("\u1234", 6))
+
 
 def test_main():
     support.run_unittest(
@@ -1501,6 +1531,7 @@
         BasicUnicodeTest,
         CharmapTest,
         WithStmtTest,
+        TypesTest,
     )
 
 

Modified: python/branches/release30-maint/Misc/NEWS
==============================================================================
--- python/branches/release30-maint/Misc/NEWS	(original)
+++ python/branches/release30-maint/Misc/NEWS	Thu Jan 22 11:31:33 2009
@@ -12,6 +12,8 @@
 Core and Builtins
 -----------------
 
+- Issue #4874: Most builtin decoders now reject unicode input.
+
 - Issue #4842: Don't allow trailing 'L' when constructing an integer
   from a string.
 

Modified: python/branches/release30-maint/Modules/_codecsmodule.c
==============================================================================
--- python/branches/release30-maint/Modules/_codecsmodule.c	(original)
+++ python/branches/release30-maint/Modules/_codecsmodule.c	Thu Jan 22 11:31:33 2009
@@ -258,7 +258,7 @@
     Py_ssize_t consumed;
     PyObject *decoded = NULL;
 
-    if (!PyArg_ParseTuple(args, "s*|zi:utf_7_decode",
+    if (!PyArg_ParseTuple(args, "y*|zi:utf_7_decode",
 			  &pbuf, &errors, &final))
 	return NULL;
     consumed = pbuf.len;
@@ -281,7 +281,7 @@
     Py_ssize_t consumed;
     PyObject *decoded = NULL;
 
-    if (!PyArg_ParseTuple(args, "s*|zi:utf_8_decode",
+    if (!PyArg_ParseTuple(args, "y*|zi:utf_8_decode",
 			  &pbuf, &errors, &final))
 	return NULL;
     consumed = pbuf.len;
@@ -305,7 +305,7 @@
     Py_ssize_t consumed;
     PyObject *decoded;
 
-    if (!PyArg_ParseTuple(args, "s*|zi:utf_16_decode",
+    if (!PyArg_ParseTuple(args, "y*|zi:utf_16_decode",
 			  &pbuf, &errors, &final))
 	return NULL;
     consumed = pbuf.len; /* This is overwritten unless final is true. */
@@ -328,7 +328,7 @@
     Py_ssize_t consumed;
     PyObject *decoded = NULL;
 
-    if (!PyArg_ParseTuple(args, "s*|zi:utf_16_le_decode",
+    if (!PyArg_ParseTuple(args, "y*|zi:utf_16_le_decode",
 			  &pbuf, &errors, &final))
 	return NULL;
 
@@ -352,7 +352,7 @@
     Py_ssize_t consumed;
     PyObject *decoded = NULL;
 
-    if (!PyArg_ParseTuple(args, "s*|zi:utf_16_be_decode",
+    if (!PyArg_ParseTuple(args, "y*|zi:utf_16_be_decode",
 			  &pbuf, &errors, &final))
 	return NULL;
 
@@ -384,7 +384,7 @@
     int final = 0;
     Py_ssize_t consumed;
 
-    if (!PyArg_ParseTuple(args, "s*|zii:utf_16_ex_decode",
+    if (!PyArg_ParseTuple(args, "y*|zii:utf_16_ex_decode",
 			  &pbuf, &errors, &byteorder, &final))
 	return NULL;
     consumed = pbuf.len; /* This is overwritten unless final is true. */
@@ -409,7 +409,7 @@
     Py_ssize_t consumed;
     PyObject *decoded;
 
-    if (!PyArg_ParseTuple(args, "s*|zi:utf_32_decode",
+    if (!PyArg_ParseTuple(args, "y*|zi:utf_32_decode",
 			  &pbuf, &errors, &final))
 	return NULL;
     consumed = pbuf.len; /* This is overwritten unless final is true. */
@@ -432,7 +432,7 @@
     Py_ssize_t consumed;
     PyObject *decoded;
 
-    if (!PyArg_ParseTuple(args, "s*|zi:utf_32_le_decode",
+    if (!PyArg_ParseTuple(args, "y*|zi:utf_32_le_decode",
 			  &pbuf, &errors, &final))
 	return NULL;
     consumed = pbuf.len; /* This is overwritten unless final is true. */
@@ -455,7 +455,7 @@
     Py_ssize_t consumed;
     PyObject *decoded;
 
-    if (!PyArg_ParseTuple(args, "s*|zi:utf_32_be_decode",
+    if (!PyArg_ParseTuple(args, "y*|zi:utf_32_be_decode",
 			  &pbuf, &errors, &final))
 	return NULL;
     consumed = pbuf.len; /* This is overwritten unless final is true. */
@@ -486,7 +486,7 @@
     int final = 0;
     Py_ssize_t consumed;
 
-    if (!PyArg_ParseTuple(args, "s*|zii:utf_32_ex_decode",
+    if (!PyArg_ParseTuple(args, "y*|zii:utf_32_ex_decode",
 			  &pbuf, &errors, &byteorder, &final))
 	return NULL;
     consumed = pbuf.len; /* This is overwritten unless final is true. */
@@ -542,7 +542,7 @@
 	PyObject *unicode;
     const char *errors = NULL;
 
-    if (!PyArg_ParseTuple(args, "s*|z:latin_1_decode",
+    if (!PyArg_ParseTuple(args, "y*|z:latin_1_decode",
 			  &pbuf, &errors))
 	return NULL;
 
@@ -559,7 +559,7 @@
 	PyObject *unicode;
     const char *errors = NULL;
 
-    if (!PyArg_ParseTuple(args, "s*|z:ascii_decode",
+    if (!PyArg_ParseTuple(args, "y*|z:ascii_decode",
 			  &pbuf, &errors))
 	return NULL;
 
@@ -577,7 +577,7 @@
     const char *errors = NULL;
     PyObject *mapping = NULL;
 
-    if (!PyArg_ParseTuple(args, "s*|zO:charmap_decode",
+    if (!PyArg_ParseTuple(args, "y*|zO:charmap_decode",
 			  &pbuf, &errors, &mapping))
 	return NULL;
     if (mapping == Py_None)
@@ -600,7 +600,7 @@
     Py_ssize_t consumed;
     PyObject *decoded = NULL;
 
-    if (!PyArg_ParseTuple(args, "s*|zi:mbcs_decode",
+    if (!PyArg_ParseTuple(args, "y*|zi:mbcs_decode",
 			  &pbuf, &errors, &final))
 	return NULL;
     consumed = pbuf.len;


More information about the Python-checkins mailing list