cpython: 513b728695fc (original) (raw)
--- a/Lib/test/test_codecs.py +++ b/Lib/test/test_codecs.py @@ -927,6 +927,50 @@ class EscapeDecodeTest(unittest.TestCase def test_empty(self): self.assertEqual(codecs.escape_decode(""), (b"", 0))
- def test_raw(self):
for b in range(256):[](#l1.8)
if b != b'\\'[0]:[](#l1.9)
self.assertEqual(codecs.escape_decode(bytes([b]) + b'0'),[](#l1.10)
(bytes([b]) + b'0', 2))[](#l1.11)
- def test_escape(self):
self.assertEqual(codecs.escape_decode(b"[\\\n]"), (b"[]", 4))[](#l1.14)
self.assertEqual(codecs.escape_decode(br'[\"]'), (b'["]', 4))[](#l1.15)
self.assertEqual(codecs.escape_decode(br"[\']"), (b"[']", 4))[](#l1.16)
self.assertEqual(codecs.escape_decode(br"[\\]"), (br"[\]", 4))[](#l1.17)
self.assertEqual(codecs.escape_decode(br"[\a]"), (b"[\x07]", 4))[](#l1.18)
self.assertEqual(codecs.escape_decode(br"[\b]"), (b"[\x08]", 4))[](#l1.19)
self.assertEqual(codecs.escape_decode(br"[\t]"), (b"[\x09]", 4))[](#l1.20)
self.assertEqual(codecs.escape_decode(br"[\n]"), (b"[\x0a]", 4))[](#l1.21)
self.assertEqual(codecs.escape_decode(br"[\v]"), (b"[\x0b]", 4))[](#l1.22)
self.assertEqual(codecs.escape_decode(br"[\f]"), (b"[\x0c]", 4))[](#l1.23)
self.assertEqual(codecs.escape_decode(br"[\r]"), (b"[\x0d]", 4))[](#l1.24)
self.assertEqual(codecs.escape_decode(br"[\7]"), (b"[\x07]", 4))[](#l1.25)
self.assertEqual(codecs.escape_decode(br"[\8]"), (br"[\8]", 4))[](#l1.26)
self.assertEqual(codecs.escape_decode(br"[\78]"), (b"[\x078]", 5))[](#l1.27)
self.assertEqual(codecs.escape_decode(br"[\41]"), (b"[!]", 5))[](#l1.28)
self.assertEqual(codecs.escape_decode(br"[\418]"), (b"[!8]", 6))[](#l1.29)
self.assertEqual(codecs.escape_decode(br"[\101]"), (b"[A]", 6))[](#l1.30)
self.assertEqual(codecs.escape_decode(br"[\1010]"), (b"[A0]", 7))[](#l1.31)
self.assertEqual(codecs.escape_decode(br"[\501]"), (b"[A]", 6))[](#l1.32)
self.assertEqual(codecs.escape_decode(br"[\x41]"), (b"[A]", 6))[](#l1.33)
self.assertEqual(codecs.escape_decode(br"[\X41]"), (br"[\X41]", 6))[](#l1.34)
self.assertEqual(codecs.escape_decode(br"[\x410]"), (b"[A0]", 7))[](#l1.35)
for b in range(256):[](#l1.36)
if b not in b'\n"\'\\abtnvfr01234567x':[](#l1.37)
self.assertEqual(codecs.escape_decode(b'\\' + bytes([b])),[](#l1.38)
(b'\\' + bytes([b]), 2))[](#l1.39)
- def test_errors(self):
self.assertRaises(ValueError, codecs.escape_decode, br"\x")[](#l1.42)
self.assertRaises(ValueError, codecs.escape_decode, br"[\x]")[](#l1.43)
self.assertEqual(codecs.escape_decode(br"[\x]\x", "ignore"), (b"[]", 6))[](#l1.44)
self.assertEqual(codecs.escape_decode(br"[\x]\x", "replace"), (b"[?]?", 6))[](#l1.45)
self.assertRaises(ValueError, codecs.escape_decode, br"\x0")[](#l1.46)
self.assertRaises(ValueError, codecs.escape_decode, br"[\x0]")[](#l1.47)
self.assertEqual(codecs.escape_decode(br"[\x0]\x0", "ignore"), (b"[]", 8))[](#l1.48)
self.assertEqual(codecs.escape_decode(br"[\x0]\x0", "replace"), (b"[?]?", 8))[](#l1.49)
+ class RecodingTest(unittest.TestCase): def test_recoding(self): f = io.BytesIO()
--- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,8 @@ What's New in Python 3.4.0 Alpha 1? Core and Builtins ----------------- +- Issue #16975: Fix error handling bug in the escape-decode bytes decoder. +
- Issue #14850: Now a charmap decoder treats U+FFFE as "undefined mapping" in any mapping, not only in a string.
--- a/Objects/bytesobject.c +++ b/Objects/bytesobject.c @@ -489,6 +489,10 @@ PyObject *PyBytes_DecodeEscape(const cha errors); goto failed; }
/* skip \x */[](#l3.7)
if (s < end && Py_ISXDIGIT(s[0]))[](#l3.8)
s++; /* and a hexdigit */[](#l3.9)
break;[](#l3.10) default:[](#l3.11) *p++ = '\\';[](#l3.12) s--;[](#l3.13)