Author: Alex Gaynor <alex.gay...@gmail.com> Branch: stdlib-2.7.9 Changeset: r75006:abfb4eb09565 Date: 2014-12-17 15:53 -0800 http://bitbucket.org/pypy/pypy/changeset/abfb4eb09565/
Log: merged upstream 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 @@ -277,10 +277,17 @@ globs = None locs = None to_execute = self.handle_expr(exec_node.children[1]) - if child_count >= 4: + if child_count < 4: + if isinstance(to_execute, ast.Tuple) and \ + (len(to_execute.elts) == 2 or len(to_execute.elts) == 3): + globs = to_execute.elts[1] + if len(to_execute.elts) == 3: + locs = to_execute.elts[2] + to_execute = to_execute.elts[0] + elif child_count >= 4: globs = self.handle_expr(exec_node.children[3]) - if child_count == 6: - locs = self.handle_expr(exec_node.children[5]) + if child_count == 6: + locs = self.handle_expr(exec_node.children[5]) return ast.Exec(to_execute, globs, locs, exec_node.lineno, exec_node.column) diff --git a/pypy/interpreter/pyopcode.py b/pypy/interpreter/pyopcode.py --- a/pypy/interpreter/pyopcode.py +++ b/pypy/interpreter/pyopcode.py @@ -1619,13 +1619,6 @@ def prepare_exec(f, prog, globals, locals, compile_flags, builtin, codetype): """Manipulate parameters to exec statement to (codeobject, dict, dict). """ - if (globals is None and locals is None and - isinstance(prog, tuple) and - (len(prog) == 2 or len(prog) == 3)): - globals = prog[1] - if len(prog) == 3: - locals = prog[2] - prog = prog[0] if globals is None: globals = f.f_globals if locals is None: diff --git a/pypy/interpreter/test/test_exec.py b/pypy/interpreter/test/test_exec.py --- a/pypy/interpreter/test/test_exec.py +++ b/pypy/interpreter/test/test_exec.py @@ -18,8 +18,7 @@ ''') -class AppTestExecStmt: - +class AppTestExecStmt: def test_string(self): g = {} l = {} @@ -30,7 +29,7 @@ g = {} exec "a = 3" in g assert g['a'] == 3 - + def test_builtinsupply(self): g = {} exec "pass" in g @@ -63,7 +62,7 @@ l = {} exec ("a = 3", g, l) assert l['a'] == 3 - + def test_tupleglobals(self): g = {} exec ("a = 3", g) @@ -207,9 +206,8 @@ def test_exec_and_name_lookups(self): ns = {} exec """def f(): - exec 'x=1' in locals() - return x -""" in ns + exec 'x=1' in locals() + return x""" in ns f = ns['f'] @@ -246,3 +244,18 @@ exec c assert len(x) == 6 assert ord(x[0]) == 0x0439 + + def test_nested_qualified_exec(self): + code = [""" +def g(): + def f(): + if True: + exec "" in {}, {} + """, """ +def g(): + def f(): + if True: + exec("", {}, {}) + """] + for c in code: + compile(c, "<code>", "exec") _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit