diff --git a/uncompyle6/parsers/parse3.py b/uncompyle6/parsers/parse3.py index ffd1935c..40767197 100644 --- a/uncompyle6/parsers/parse3.py +++ b/uncompyle6/parsers/parse3.py @@ -603,11 +603,16 @@ class Python35onParser(Python3Parser): WITH_CLEANUP_START WITH_CLEANUP_FINISH END_FINALLY - # Python 3.5+_ does jump optimization that scanner3.py's detect - # structure can't fully work out. So for now let's allow - # RETURN_END_IF the same as RETURN_VAL + # Python 3.5+ does jump optimization + # In <.3.5 the below is a JUMP_FORWARD to a JUMP_ABSOLUTE. + # in return_stmt, we will need the semantic actions in pysource.py + # to work out whether to dedent or not based on the presence of + # RETURN_END_IF vs RETURN_VALUE + + ifelsestmtc ::= testexpr c_stmts_opt JUMP_FORWARD else_suitec return_stmt ::= ret_expr RETURN_END_IF + # Python 3.3+ also has yield from. 3.5 does it # differently than 3.3, 3.4 diff --git a/uncompyle6/semantics/pysource.py b/uncompyle6/semantics/pysource.py index 0bcfbcdd..450e02cc 100644 --- a/uncompyle6/semantics/pysource.py +++ b/uncompyle6/semantics/pysource.py @@ -710,6 +710,11 @@ class SourceWalker(GenericASTTraversal, object): if self.return_none or node != AST('return_stmt', [AST('ret_expr', [NONE]), Token('RETURN_VALUE')]): self.write(' ') self.preorder(node[0]) + # 3.5 does jump optimization. The RETURN_END_IF in the return + # statement means to dedent. Earlier versions will just have + # RETURN_VALUE + if self.version >= 3.5 and node[-1] == 'RETURN_END_IF': + self.indentLess() self.println() self.prune() # stop recursing