cpython: fe410292cba6 (original) (raw)
--- a/Lib/test/test_strlit.py +++ b/Lib/test/test_strlit.py @@ -50,6 +50,10 @@ f = '\u1881' assert ord(f) == 0x1881 g = r'\u1881' assert list(map(ord, g)) == [92, 117, 49, 56, 56, 49] +h = '\U0001d120' +assert ord(h) == 0x1d120 +i = r'\U0001d120' +assert list(map(ord, i)) == [92, 85, 48, 48, 48, 49, 100, 49, 50, 48] """ @@ -82,6 +86,24 @@ class TestLiterals(unittest.TestCase): self.assertEqual(eval(""" '\x81' """), chr(0x81)) self.assertEqual(eval(r""" '\u1881' """), chr(0x1881)) self.assertEqual(eval(""" '\u1881' """), chr(0x1881))
self.assertEqual(eval(r""" '\U0001d120' """), chr(0x1d120))[](#l1.18)
self.assertEqual(eval(""" '\U0001d120' """), chr(0x1d120))[](#l1.19)
- def test_eval_str_incomplete(self):
self.assertRaises(SyntaxError, eval, r""" '\x' """)[](#l1.22)
self.assertRaises(SyntaxError, eval, r""" '\x0' """)[](#l1.23)
self.assertRaises(SyntaxError, eval, r""" '\u' """)[](#l1.24)
self.assertRaises(SyntaxError, eval, r""" '\u0' """)[](#l1.25)
self.assertRaises(SyntaxError, eval, r""" '\u00' """)[](#l1.26)
self.assertRaises(SyntaxError, eval, r""" '\u000' """)[](#l1.27)
self.assertRaises(SyntaxError, eval, r""" '\U' """)[](#l1.28)
self.assertRaises(SyntaxError, eval, r""" '\U0' """)[](#l1.29)
self.assertRaises(SyntaxError, eval, r""" '\U00' """)[](#l1.30)
self.assertRaises(SyntaxError, eval, r""" '\U000' """)[](#l1.31)
self.assertRaises(SyntaxError, eval, r""" '\U0000' """)[](#l1.32)
self.assertRaises(SyntaxError, eval, r""" '\U00000' """)[](#l1.33)
self.assertRaises(SyntaxError, eval, r""" '\U000000' """)[](#l1.34)
self.assertRaises(SyntaxError, eval, r""" '\U0000000' """)[](#l1.35)
def test_eval_str_raw(self): self.assertEqual(eval(""" r'x' """), 'x') @@ -91,6 +113,8 @@ class TestLiterals(unittest.TestCase): self.assertEqual(eval(""" r'\x81' """), chr(0x81)) self.assertEqual(eval(r""" r'\u1881' """), '\' + 'u1881') self.assertEqual(eval(""" r'\u1881' """), chr(0x1881))
self.assertEqual(eval(r""" r'\U0001d120' """), '\\' + 'U0001d120')[](#l1.43)
self.assertEqual(eval(""" r'\U0001d120' """), chr(0x1d120))[](#l1.44)
def test_eval_bytes_normal(self): self.assertEqual(eval(""" b'x' """), b'x') @@ -100,6 +124,12 @@ class TestLiterals(unittest.TestCase): self.assertRaises(SyntaxError, eval, """ b'\x81' """) self.assertEqual(eval(r""" b'\u1881' """), b'\' + b'u1881') self.assertRaises(SyntaxError, eval, """ b'\u1881' """)
self.assertEqual(eval(r""" b'\U0001d120' """), b'\\' + b'U0001d120')[](#l1.52)
self.assertRaises(SyntaxError, eval, """ b'\U0001d120' """)[](#l1.53)
- def test_eval_bytes_incomplete(self):
self.assertRaises(SyntaxError, eval, r""" b'\x' """)[](#l1.56)
self.assertRaises(SyntaxError, eval, r""" b'\x0' """)[](#l1.57)
def test_eval_bytes_raw(self): self.assertEqual(eval(""" br'x' """), b'x') @@ -116,6 +146,10 @@ class TestLiterals(unittest.TestCase): self.assertEqual(eval(r""" rb'\u1881' """), b"\" + b"u1881") self.assertRaises(SyntaxError, eval, """ br'\u1881' """) self.assertRaises(SyntaxError, eval, """ rb'\u1881' """)
self.assertEqual(eval(r""" br'\U0001d120' """), b"\\" + b"U0001d120")[](#l1.65)
self.assertEqual(eval(r""" rb'\U0001d120' """), b"\\" + b"U0001d120")[](#l1.66)
self.assertRaises(SyntaxError, eval, """ br'\U0001d120' """)[](#l1.67)
self.assertRaises(SyntaxError, eval, """ rb'\U0001d120' """)[](#l1.68) self.assertRaises(SyntaxError, eval, """ bb'' """)[](#l1.69) self.assertRaises(SyntaxError, eval, """ rr'' """)[](#l1.70) self.assertRaises(SyntaxError, eval, """ brr'' """)[](#l1.71)
--- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,9 @@ What's New in Python 3.4.0 Alpha 1? Core and Builtins ----------------- +- Issue #12983: Bytes literals with invalid \x escape now raise a SyntaxError
--- a/Objects/bytesobject.c +++ b/Objects/bytesobject.c @@ -474,8 +474,9 @@ PyObject *PyBytes_DecodeEscape(const cha break; } if (!errors || strcmp(errors, "strict") == 0) {
PyErr_SetString(PyExc_ValueError,[](#l3.7)
"invalid \\x escape");[](#l3.8)
PyErr_Format(PyExc_ValueError,[](#l3.9)
"invalid \\x escape at position %d",[](#l3.10)
s - 2 - (end - len));[](#l3.11) goto failed;[](#l3.12) }[](#l3.13) if (strcmp(errors, "replace") == 0) {[](#l3.14)
--- a/Python/ast.c +++ b/Python/ast.c @@ -1843,20 +1843,24 @@ ast_for_atom(struct compiling *c, const case STRING: { PyObject *str = parsestrplus(c, n, &bytesmode); if (!str) {
if (PyErr_ExceptionMatches(PyExc_UnicodeError)) {[](#l4.7)
const char *errtype = NULL;[](#l4.8)
if (PyErr_ExceptionMatches(PyExc_UnicodeError))[](#l4.9)
errtype = "unicode error";[](#l4.10)
else if (PyErr_ExceptionMatches(PyExc_ValueError))[](#l4.11)
errtype = "value error";[](#l4.12)
if (errtype) {[](#l4.13)
char buf[128];[](#l4.14) PyObject *type, *value, *tback, *errstr;[](#l4.15) PyErr_Fetch(&type, &value, &tback);[](#l4.16) errstr = PyObject_Str(value);[](#l4.17) if (errstr) {[](#l4.18)
char *s = "";[](#l4.19)
char buf[128];[](#l4.20)
s = _PyUnicode_AsString(errstr);[](#l4.21)
PyOS_snprintf(buf, sizeof(buf), "(unicode error) %s", s);[](#l4.22)
ast_error(c, n, buf);[](#l4.23)
char *s = _PyUnicode_AsString(errstr);[](#l4.24)
PyOS_snprintf(buf, sizeof(buf), "(%s) %s", errtype, s);[](#l4.25) Py_DECREF(errstr);[](#l4.26) } else {[](#l4.27)
ast_error(c, n, "(unicode error) unknown error");[](#l4.28)
PyOS_snprintf(buf, sizeof(buf), "(%s) unknown error", errtype);[](#l4.29) }[](#l4.30)
ast_error(c, n, buf);[](#l4.31) Py_DECREF(type);[](#l4.32) Py_DECREF(value);[](#l4.33) Py_XDECREF(tback);[](#l4.34)