]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Issue #12983: Bytes literals with invalid \x escape now raise a SyntaxError
authorSerhiy Storchaka <storchaka@gmail.com>
Sun, 10 Feb 2013 15:42:01 +0000 (17:42 +0200)
committerSerhiy Storchaka <storchaka@gmail.com>
Sun, 10 Feb 2013 15:42:01 +0000 (17:42 +0200)
and a full traceback including line number.

1  2 
Lib/test/test_strlit.py
Misc/NEWS
Objects/bytesobject.c
Python/ast.c

index 07bc48880a98b979f02ef8befba5c8110bed45ca,a4ae19803c9dbf5e690dcaa466c282dcf4dc283b..d01322faa68263e664372782bb677f8cf33c31e6
@@@ -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'' """)
 +        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'\U0001d120' """)
          self.assertRaises(SyntaxError, eval, """ bb'' """)
          self.assertRaises(SyntaxError, eval, """ rr'' """)
          self.assertRaises(SyntaxError, eval, """ brr'' """)
diff --cc Misc/NEWS
Simple merge
index 5e17107a8af89a94ff3eddfca41d0922aa81d031,cb5679bc38b6fa47fe3051657d3477bcbaf12cf2..47898fe975cfaab06d5e4214062c57d69ff2eacc
@@@ -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 730c576e4ee9536b895b25b9d61ae83fcd1dd6ac,edcd18b9b8ffd7219f5bc4d21ce6d951e28ad9c8..1b5fa6ccc28c6af41c5433421440ac0af8424f82
@@@ -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);