diff --git a/_py/code/_assertionnew.py b/_py/code/_assertionnew.py index 606dfa75c..21ed1ab23 100644 --- a/_py/code/_assertionnew.py +++ b/_py/code/_assertionnew.py @@ -10,6 +10,29 @@ import py from _py.code.assertion import _format_explanation, BuiltinAssertionError +if sys.platform.startswith("java") and sys.version_info < (2, 5, 2): + # See http://bugs.jython.org/issue1497 + _exprs = ("BoolOp", "BinOp", "UnaryOp", "Lambda", "IfExp", "Dict", + "ListComp", "GeneratorExp", "Yield", "Compare", "Call", + "Repr", "Num", "Str", "Attribute", "Subscript", "Name", + "List", "Tuple") + _stmts = ("FunctionDef", "ClassDef", "Return", "Delete", "Assign", + "AugAssign", "Print", "For", "While", "If", "With", "Raise", + "TryExcept", "TryFinally", "Assert", "Import", "ImportFrom", + "Exec", "Global", "Expr", "Pass", "Break", "Continue") + _expr_nodes = set(getattr(ast, name) for name in _exprs) + _stmt_nodes = set(getattr(ast, name) for name in _stmts) + def _is_ast_expr(node): + return node.__class__ in _expr_nodes + def _is_ast_stmt(node): + return node.__class__ in _stmt_nodes +else: + def _is_ast_expr(node): + return isinstance(node, ast.expr) + def _is_ast_stmt(node): + return isinstance(node, ast.stmt) + + class Failure(Exception): """Error found while interpreting AST.""" @@ -91,7 +114,7 @@ class DebugInterpreter(ast.NodeVisitor): def generic_visit(self, node): # Fallback when we don't have a special implementation. - if isinstance(node, ast.expr): + if _is_ast_expr(node): mod = ast.Expression(node) co = self._compile(mod) try: @@ -100,7 +123,7 @@ class DebugInterpreter(ast.NodeVisitor): raise Failure() explanation = self.frame.repr(result) return explanation, result - elif isinstance(node, ast.stmt): + elif _is_ast_stmt(node): mod = ast.Module([node]) co = self._compile(mod, "exec") try: