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

arigo pypy.commits at gmail.com
Tue Jan 24 06:24:13 EST 2017


Author: Armin Rigo <arigo at tunes.org>
Branch: py3.5-fstring-pep498
Changeset: r89726:086cef12dead
Date: 2017-01-24 12:19 +0100
http://bitbucket.org/pypy/pypy/changeset/086cef12dead/

Log:	test and fix + tweaks

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
@@ -50,8 +50,10 @@
                                consts.PyCF_SOURCE_IS_UTF8 |
                                consts.PyCF_IGNORE_COOKIE,
                                optimize=astbuilder.compile_info.optimize)
-    parse_tree = astbuilder.recursive_parser.parse_source(source, info)
-    return ast_from_node(astbuilder.space, parse_tree, info)
+    parser = astbuilder.recursive_parser
+    parse_tree = parser.parse_source(source, info)
+    return ast_from_node(astbuilder.space, parse_tree, info,
+                         recursive_parser=parser)
 
 
 def unexpected_end_of_string(astbuilder, atom_node):
@@ -257,7 +259,8 @@
 
     fstr.current_index = i
     literal = builder.build()
-    if not fstr.raw_mode:
+    if not fstr.raw_mode and u'\\' in literal:
+        literal = literal.encode('utf-8')
         literal = unicodehelper.decode_unicode_escape(astbuilder.space, literal)
     return literal
 
@@ -281,7 +284,10 @@
 
 
 def parse_f_string(astbuilder, joined_pieces, fstr, atom_node, rec=0):
-    space = astbuilder.space
+    # In our case, parse_f_string() and fstring_find_literal_and_expr()
+    # could be merged into a single function with a clearer logic.  It's
+    # done this way to follow CPython's source code more closely.
+
     while True:
         literal, expr = fstring_find_literal_and_expr(astbuilder, fstr,
                                                       atom_node, rec)
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
@@ -1184,6 +1184,8 @@
 
         yield self.st, """z=f'{"}"}'""", 'z', '}'
 
+        yield self.st, """z=f'{f"{0}"*3}'""", 'z', '000'
+
     def test_fstring_error(self):
         raises(SyntaxError, self.run, "f'{}'")
         raises(SyntaxError, self.run, "f'{   \t   }'")


More information about the pypy-commit mailing list