Author: Carl Friedrich Bolz-Tereick <[email protected]>
Branch:
Changeset: r93713:2cb74fa177c2
Date: 2018-01-29 15:12 +0100
http://bitbucket.org/pypy/pypy/changeset/2cb74fa177c2/
Log: fix pypy2 version of the bug fixed in 095d5a88a186 (which is on
py3.5)
diff --git a/pypy/interpreter/astcompiler/astbuilder.py
b/pypy/interpreter/astcompiler/astbuilder.py
--- a/pypy/interpreter/astcompiler/astbuilder.py
+++ b/pypy/interpreter/astcompiler/astbuilder.py
@@ -1096,17 +1096,21 @@
encoding = self.compile_info.encoding
flags = self.compile_info.flags
unicode_literals = flags & consts.CO_FUTURE_UNICODE_LITERALS
- try:
- sub_strings_w = [parsestring.parsestr(space, encoding,
atom_node.get_child(i).get_value(),
- unicode_literals)
- for i in range(atom_node.num_children())]
- except error.OperationError as e:
- if not e.match(space, space.w_UnicodeError):
- raise
- # UnicodeError in literal: turn into SyntaxError
- e.normalize_exception(space)
- errmsg = space.text_w(space.str(e.get_w_value(space)))
- raise self.error('(unicode error) %s' % errmsg, atom_node)
+ sub_strings_w = []
+ for index in range(atom_node.num_children()):
+ child = atom_node.get_child(index)
+ try:
+ sub_strings_w.append(parsestring.parsestr(space, encoding,
child.get_value(),
+
unicode_literals))
+ except error.OperationError as e:
+ if not e.match(space, space.w_UnicodeError):
+ raise
+ # UnicodeError in literal: turn into SyntaxError
+ e.normalize_exception(space)
+ errmsg = space.text_w(space.str(e.get_w_value(space)))
+ if child is None:
+ child = atom_node
+ raise self.error('(unicode error) %s' % errmsg, child)
# This implements implicit string concatenation.
if len(sub_strings_w) > 1:
w_sub_strings = space.newlist(sub_strings_w)
diff --git a/pypy/interpreter/astcompiler/test/test_astbuilder.py
b/pypy/interpreter/astcompiler/test/test_astbuilder.py
--- a/pypy/interpreter/astcompiler/test/test_astbuilder.py
+++ b/pypy/interpreter/astcompiler/test/test_astbuilder.py
@@ -1250,3 +1250,11 @@
exc = py.test.raises(SyntaxError, self.get_ast, input).value
assert exc.msg == ("(unicode error) 'unicodeescape' codec can't decode"
" bytes in position 0-2: truncated \\xXX escape")
+
+ def test_decode_error_in_string_literal_correct_line(self):
+ input = "u'a' u'b'\\\n u'c' u'\\x'"
+ exc = py.test.raises(SyntaxError, self.get_ast, input).value
+ assert exc.msg == ("(unicode error) 'unicodeescape' codec can't decode"
+ " bytes in position 0-1: truncated \\xXX escape")
+ assert exc.lineno == 2
+ assert exc.offset == 6
diff --git a/pypy/interpreter/pyparser/parsestring.py
b/pypy/interpreter/pyparser/parsestring.py
--- a/pypy/interpreter/pyparser/parsestring.py
+++ b/pypy/interpreter/pyparser/parsestring.py
@@ -57,7 +57,11 @@
assert 0 <= ps <= q
substr = s[ps:q]
else:
- substr = decode_unicode_utf8(space, s, ps, q)
+ try:
+ substr = decode_unicode_utf8(space, s, ps, q)
+ except:
+ import pdb; pdb.set_trace()
+ raise
if rawmode:
v = unicodehelper.decode_raw_unicode_escape(space, substr)
else:
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit