Author: Amaury Forgeot d'Arc <amaur...@gmail.com> Branch: py3.3 Changeset: r73872:ec5e03429d1d Date: 2014-10-09 22:03 +0200 http://bitbucket.org/pypy/pypy/changeset/ec5e03429d1d/
Log: Really validate the ast in compile()... diff --git a/pypy/module/__builtin__/compiling.py b/pypy/module/__builtin__/compiling.py --- a/pypy/module/__builtin__/compiling.py +++ b/pypy/module/__builtin__/compiling.py @@ -45,6 +45,7 @@ if space.isinstance_w(w_source, space.gettypeobject(ast.W_AST.typedef)): ast_node = ast.mod.from_object(space, w_source) + ec.compiler.validate_ast(ast_node) code = ec.compiler.compile_ast(ast_node, filename, mode, flags, optimize=optimize) return space.wrap(code) diff --git a/pypy/module/_ast/test/test_ast.py b/pypy/module/_ast/test/test_ast.py --- a/pypy/module/_ast/test/test_ast.py +++ b/pypy/module/_ast/test/test_ast.py @@ -449,3 +449,26 @@ empty_yield_from.body[0].body[0].value.value = None exc = raises(ValueError, compile, empty_yield_from, "<test>", "exec") assert "field value is required" in str(exc.value) + + def test_compare(self): + import ast + + def _mod(mod, msg=None, mode="exec", exc=ValueError): + mod.lineno = mod.col_offset = 0 + ast.fix_missing_locations(mod) + exc = raises(exc, compile, mod, "<test>", mode) + if msg is not None: + assert msg in str(exc.value) + def _expr(node, msg=None, exc=ValueError): + mod = ast.Module([ast.Expr(node)]) + _mod(mod, msg, exc=exc) + left = ast.Name("x", ast.Load()) + comp = ast.Compare(left, [ast.In()], []) + _expr(comp, "no comparators") + comp = ast.Compare(left, [ast.In()], [ast.Num(4), ast.Num(5)]) + _expr(comp, "different number of comparators and operands") + comp = ast.Compare(ast.Num("blah"), [ast.In()], [left]) + _expr(comp, "non-numeric", exc=TypeError) + comp = ast.Compare(left, [ast.In()], [ast.Num("blah")]) + _expr(comp, "non-numeric", exc=TypeError) + _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit