From: Serhiy Storchaka Date: Sun, 10 Feb 2013 15:42:01 +0000 (+0200) Subject: Issue #12983: Bytes literals with invalid \x escape now raise a SyntaxError X-Git-Tag: v3.3.1rc1~190 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=801d955f04d46994ac5bc7270fea86a7703c5192;p=thirdparty%2FPython%2Fcpython.git Issue #12983: Bytes literals with invalid \x escape now raise a SyntaxError and a full traceback including line number. --- 801d955f04d46994ac5bc7270fea86a7703c5192 diff --cc Lib/test/test_strlit.py index 07bc48880a98,a4ae19803c9d..d01322faa682 --- a/Lib/test/test_strlit.py +++ b/Lib/test/test_strlit.py @@@ -103,19 -133,15 +133,23 @@@ class TestLiterals(unittest.TestCase) def test_eval_bytes_raw(self): self.assertEqual(eval(""" br'x' """), b'x') + self.assertEqual(eval(""" rb'x' """), b'x') self.assertEqual(eval(r""" br'\x01' """), b'\\' + b'x01') + self.assertEqual(eval(r""" rb'\x01' """), b'\\' + b'x01') self.assertEqual(eval(""" br'\x01' """), byte(1)) + self.assertEqual(eval(""" rb'\x01' """), byte(1)) self.assertEqual(eval(r""" br'\x81' """), b"\\" + b"x81") + self.assertEqual(eval(r""" rb'\x81' """), b"\\" + b"x81") self.assertRaises(SyntaxError, eval, """ br'\x81' """) + self.assertRaises(SyntaxError, eval, """ rb'\x81' """) self.assertEqual(eval(r""" br'\u1881' """), b"\\" + b"u1881") + 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") ++ self.assertEqual(eval(r""" rb'\U0001d120' """), b"\\" + b"U0001d120") + self.assertRaises(SyntaxError, eval, """ br'\U0001d120' """) - self.assertRaises(SyntaxError, eval, """ rb'' """) ++ self.assertRaises(SyntaxError, eval, """ rb'\U0001d120' """) self.assertRaises(SyntaxError, eval, """ bb'' """) self.assertRaises(SyntaxError, eval, """ rr'' """) self.assertRaises(SyntaxError, eval, """ brr'' """) diff --cc Objects/bytesobject.c index 5e17107a8af8,cb5679bc38b6..47898fe975cf --- a/Objects/bytesobject.c +++ b/Objects/bytesobject.c @@@ -465,8 -469,9 +465,9 @@@ PyObject *PyBytes_DecodeEscape(const ch break; } if (!errors || strcmp(errors, "strict") == 0) { - PyErr_SetString(PyExc_ValueError, - "invalid \\x escape"); + PyErr_Format(PyExc_ValueError, + "invalid \\x escape at position %d", - s - 2 - (end - len)); ++ s - 2 - (end - len)); goto failed; } if (strcmp(errors, "replace") == 0) { diff --cc Python/ast.c index 730c576e4ee9,edcd18b9b8ff..1b5fa6ccc28c --- a/Python/ast.c +++ b/Python/ast.c @@@ -1834,15 -1379,13 +1840,13 @@@ ast_for_atom(struct compiling *c, cons PyErr_Fetch(&type, &value, &tback); errstr = PyObject_Str(value); if (errstr) { - char *s = ""; - char buf[128]; - s = _PyUnicode_AsString(errstr); - PyOS_snprintf(buf, sizeof(buf), "(unicode error) %s", s); - ast_error(c, n, buf); + char *s = _PyUnicode_AsString(errstr); + PyOS_snprintf(buf, sizeof(buf), "(%s) %s", errtype, s); Py_DECREF(errstr); } else { - ast_error(c, n, "(unicode error) unknown error"); + PyOS_snprintf(buf, sizeof(buf), "(%s) unknown error", errtype); } - ast_error(n, buf); ++ ast_error(c, n, buf); Py_DECREF(type); Py_DECREF(value); Py_XDECREF(tback);