[pypy-commit] pypy py3.5-fstring-pep498: test and fix

arigo pypy.commits at gmail.com
Tue Jan 24 09:21:12 EST 2017


Author: Armin Rigo <arigo at tunes.org>
Branch: py3.5-fstring-pep498
Changeset: r89735:9069e5841365
Date: 2017-01-24 15:20 +0100
http://bitbucket.org/pypy/pypy/changeset/9069e5841365/

Log:	test and fix

diff --git a/pypy/interpreter/astcompiler/fstring.py b/pypy/interpreter/astcompiler/fstring.py
--- a/pypy/interpreter/astcompiler/fstring.py
+++ b/pypy/interpreter/astcompiler/fstring.py
@@ -260,8 +260,12 @@
     fstr.current_index = i
     literal = builder.build()
     if not fstr.raw_mode and u'\\' in literal:
+        # xxx messy
+        space = astbuilder.space
         literal = literal.encode('utf-8')
-        literal = unicodehelper.decode_unicode_escape(astbuilder.space, literal)
+        literal = parsestring.decode_unicode_utf8(space, literal, 0,
+                                                  len(literal))
+        literal = unicodehelper.decode_unicode_escape(space, literal)
     return literal
 
 
@@ -328,22 +332,26 @@
     space = astbuilder.space
     encoding = astbuilder.compile_info.encoding
     joined_pieces = []
-    for i in range(atom_node.num_children()):
-        try:
+    try:
+        for i in range(atom_node.num_children()):
             w_next = parsestring.parsestr(
                     space, encoding, atom_node.get_child(i).get_value())
-        except error.OperationError as e:
-            if not (e.match(space, space.w_UnicodeError) or
-                    e.match(space, space.w_ValueError)):
-                raise
-            # Unicode/ValueError in literal: turn into SyntaxError
-            raise astbuilder.error(e.errorstr(space), atom_node)
-        if not isinstance(w_next, parsestring.W_FString):
-            add_constant_string(astbuilder, joined_pieces, w_next, atom_node)
-        else:
-            parse_f_string(astbuilder, joined_pieces, w_next, atom_node)
+            if not isinstance(w_next, parsestring.W_FString):
+                add_constant_string(astbuilder, joined_pieces, w_next,
+                                    atom_node)
+            else:
+                parse_f_string(astbuilder, joined_pieces, w_next, atom_node)
+
+    except error.OperationError as e:
+        if not (e.match(space, space.w_UnicodeError) or
+                e.match(space, space.w_ValueError)):
+            raise
+        # Unicode/ValueError in literal: turn into SyntaxError
+        raise astbuilder.error(e.errorstr(space), atom_node)
+
     if len(joined_pieces) == 1:   # <= the common path
         return joined_pieces[0]   # ast.Str, Bytes or FormattedValue
+
     # with more than one piece, it is a combination of Str and
     # FormattedValue pieces---if there is a Bytes, then we got
     # an invalid mixture of bytes and unicode literals
diff --git a/pypy/interpreter/astcompiler/test/test_compiler.py b/pypy/interpreter/astcompiler/test/test_compiler.py
--- a/pypy/interpreter/astcompiler/test/test_compiler.py
+++ b/pypy/interpreter/astcompiler/test/test_compiler.py
@@ -1192,6 +1192,7 @@
         raises(SyntaxError, self.run, "f'{5#}'")
         raises(SyntaxError, self.run, "f'{5)#}'")
         raises(SyntaxError, self.run, "f'''{5)\n#}'''")
+        raises(SyntaxError, self.run, "f'\\x'")
 
 
 class AppTestCompiler:


More information about the pypy-commit mailing list