diff --git a/uncompyle6/semantics/consts.py b/uncompyle6/semantics/consts.py index 23db96b5..c9b9cdd2 100644 --- a/uncompyle6/semantics/consts.py +++ b/uncompyle6/semantics/consts.py @@ -353,12 +353,16 @@ TABLE_DIRECT = { 'ifelsestmt': ( '%|if %c:\n%+%c%-%|else:\n%+%c%-', 0, 1, 3 ), 'ifelsestmtc': ( '%|if %c:\n%+%c%-%|else:\n%+%c%-', 0, 1, 3 ), 'ifelsestmtl': ( '%|if %c:\n%+%c%-%|else:\n%+%c%-', 0, 1, 3 ), + 'ifelsestmtr': ( '%|if %c:\n%+%c%-%|else:\n%+%c%-', 0, 1, 2 ), + 'ifelsestmtr2': ( '%|if %c:\n%+%c%-%|else:\n%+%c%-\n\n', 0, 1, 3 ), # has COME_FROM + + + # "elif" forms are not generated by the parser but are created through tree + # transformations. See "n_ifelsestmt". 'ifelifstmt': ( '%|if %c:\n%+%c%-%c', 0, 1, 3 ), 'elifelifstmt': ( '%|elif %c:\n%+%c%-%c', 0, 1, 3 ), 'elifstmt': ( '%|elif %c:\n%+%c%-', 0, 1 ), 'elifelsestmt': ( '%|elif %c:\n%+%c%-%|else:\n%+%c%-', 0, 1, 3 ), - 'ifelsestmtr': ( '%|if %c:\n%+%c%-%|else:\n%+%c%-', 0, 1, 2 ), - 'ifelsestmtr2': ( '%|if %c:\n%+%c%-%|else:\n%+%c%-\n\n', 0, 1, 3 ), # has COME_FROM 'elifelsestmtr': ( '%|elif %c:\n%+%c%-%|else:\n%+%c%-\n\n', 0, 1, 2 ), 'elifelsestmtr2': ( '%|elif %c:\n%+%c%-%|else:\n%+%c%-\n\n', 0, 1, 3 ), # has COME_FROM diff --git a/uncompyle6/semantics/pysource.py b/uncompyle6/semantics/pysource.py index 53ca523f..d8066947 100644 --- a/uncompyle6/semantics/pysource.py +++ b/uncompyle6/semantics/pysource.py @@ -646,15 +646,31 @@ class SourceWalker(GenericASTTraversal, object): self.println() self.prune() # stop recursing + # preprocess is used for handling chains of + # if elif elif def n_ifelsestmt(self, node, preprocess=False): + """ + Here we turn: + + if ... + else + if .. + + into: + + if .. + elif ... + + where appropriate + """ else_suite = node[3] n = else_suite[0] - if len(n) == 1 == len(n[0]) and n[0] == '_stmts': - n = n[0][0][0] - elif n[0].kind in ('lastc_stmt', 'lastl_stmt'): + if len(n) == 1 == len(n[0]) and n[0] == 'stmt': n = n[0][0] + elif n[0].kind in ('lastc_stmt', 'lastl_stmt'): + n = n[0] else: if not preprocess: self.default(node)