diff --git a/parso/python/normalizer.py b/parso/python/normalizer.py index 00372a0..39172a9 100644 --- a/parso/python/normalizer.py +++ b/parso/python/normalizer.py @@ -541,9 +541,16 @@ class ErrorFinder(Normalizer): is_bytes = True if 'u' in string_prefix: is_bytes = False - func = codecs.escape_decode if is_bytes else codecs.unicode_escape_decode + + payload = leaf._get_payload() + if is_bytes: + payload = payload.encode('utf-8') + func = codecs.escape_decode + else: + func = codecs.unicode_escape_decode + try: - func(leaf._get_payload()) + func(payload) except UnicodeDecodeError as e: self._add_syntax_error('(unicode error) ' + str(e), leaf) except ValueError as e: diff --git a/test/test_python_errors.py b/test/test_python_errors.py index 2d41faf..7c1a10a 100644 --- a/test/test_python_errors.py +++ b/test/test_python_errors.py @@ -306,6 +306,11 @@ def _get_actual_exception(code): except (SyntaxError, IndentationError) as e: wanted = e.__class__.__name__ + ': ' + e.msg line_nr = e.lineno + except ValueError as e: + # The ValueError comes from byte literals in Python 2 like '\x' + # that are oddly enough not SyntaxErrors. + wanted = 'SyntaxError: (value error) ' + str(e) + line_nr = None else: assert False, "The piece of code should raise an exception."