diff --git a/uncompyle6/parsers/parse37.py b/uncompyle6/parsers/parse37.py index 1d2baa7ee..73b92acec 100644 --- a/uncompyle6/parsers/parse37.py +++ b/uncompyle6/parsers/parse37.py @@ -88,6 +88,8 @@ def p_37misc(self, args): compare_chained37 ::= expr compare_chained1a_37 compare_chained37 ::= expr compare_chained1b_37 + compare_chained37 ::= expr compare_chained1c_37 + compare_chained37_false ::= expr compare_chained1_false_37 compare_chained37_false ::= expr compare_chained2_false_37 @@ -96,21 +98,27 @@ def p_37misc(self, args): compare_chained2a_37 ELSE POP_TOP COME_FROM compare_chained1b_37 ::= expr DUP_TOP ROT_THREE COMPARE_OP POP_JUMP_IF_FALSE compare_chained2b_37 POP_TOP JUMP_FORWARD COME_FROM + compare_chained1c_37 ::= expr DUP_TOP ROT_THREE COMPARE_OP POP_JUMP_IF_FALSE + compare_chained2a_37 POP_TOP compare_chained1_false_37 ::= expr DUP_TOP ROT_THREE COMPARE_OP POP_JUMP_IF_FALSE compare_chained2c_37 POP_TOP JUMP_FORWARD COME_FROM - compare_chained2_false_37 ::= expr DUP_TOP ROT_THREE COMPARE_OP POP_JUMP_IF_FALSE + compare_chained2_false_37 ::= expr DUP_TOP ROT_THREE COMPARE_OP POP_JUMP_IF_FALSE compare_chained2a_false_37 ELSE POP_TOP JUMP_BACK COME_FROM compare_chained2a_37 ::= expr COMPARE_OP POP_JUMP_IF_TRUE JUMP_FORWARD - compare_chained2a_false_37 ::= expr COMPARE_OP POP_JUMP_IF_FALSE JUMP_FORWARD + compare_chained2a_37 ::= expr COMPARE_OP POP_JUMP_IF_TRUE JUMP_BACK + compare_chained2a_false_37 ::= expr COMPARE_OP POP_JUMP_IF_FALSE jf_cfs compare_chained2b_37 ::= expr COMPARE_OP come_from_opt POP_JUMP_IF_FALSE JUMP_FORWARD ELSE + compare_chained2b_37 ::= expr COMPARE_OP come_from_opt POP_JUMP_IF_FALSE JUMP_FORWARD compare_chained2c_37 ::= expr DUP_TOP ROT_THREE COMPARE_OP come_from_opt POP_JUMP_IF_FALSE compare_chained2a_false_37 ELSE + compare_chained2c_37 ::= expr DUP_TOP ROT_THREE COMPARE_OP come_from_opt POP_JUMP_IF_FALSE + compare_chained2a_false_37 - jf_cfs ::= JUMP_FORWARD come_froms + jf_cfs ::= JUMP_FORWARD _come_froms ifelsestmt ::= testexpr c_stmts_opt jf_cfs else_suite opt_come_from_except jmp_false37 ::= POP_JUMP_IF_FALSE COME_FROM diff --git a/uncompyle6/scanners/scanner3.py b/uncompyle6/scanners/scanner3.py index eec5f43cf..9eeabc7c8 100644 --- a/uncompyle6/scanners/scanner3.py +++ b/uncompyle6/scanners/scanner3.py @@ -811,7 +811,14 @@ def detect_control_flow(self, offset, targets, inst_index): self.fixed_jumps[offset] = fix or match[-1] return else: - self.fixed_jumps[offset] = match[-1] + if self.version < 3.6: + # FIXME: this is putting in COME_FROMs in the wrong place. + # Fix up grammar so we don't need to do this. + # See cf_for_iter use in parser36.py + self.fixed_jumps[offset] = match[-1] + elif target > offset: + # Right now we only add COME_FROMs in forward (not loop) jumps + self.fixed_jumps[offset] = target return # op == POP_JUMP_IF_TRUE else: diff --git a/uncompyle6/semantics/customize37.py b/uncompyle6/semantics/customize37.py index 71d84dc44..7d97d4a13 100644 --- a/uncompyle6/semantics/customize37.py +++ b/uncompyle6/semantics/customize37.py @@ -51,6 +51,9 @@ def customize_for_version37(self, version): 'compare_chained1b_37': ( ' %[3]{pattr.replace("-", " ")} %p %p', (0, 19), (-4, 19)), + 'compare_chained1c_37': ( + ' %[3]{pattr.replace("-", " ")} %p %p', + (0, 19), (-2, 19)), 'compare_chained2a_37': ( '%[1]{pattr.replace("-", " ")} %p', (0, 19) ), diff --git a/uncompyle6/semantics/pysource.py b/uncompyle6/semantics/pysource.py index f11f1fdaf..5be529880 100644 --- a/uncompyle6/semantics/pysource.py +++ b/uncompyle6/semantics/pysource.py @@ -1433,7 +1433,7 @@ def print_super_classes3(self, node): assert node[n].kind.startswith('CALL_FUNCTION') if node[n].kind.startswith('CALL_FUNCTION_KW'): - # 3.6+ starts does this + # 3.6+ starts doing this kwargs = node[n-1].attr assert isinstance(kwargs, tuple) i = n - (len(kwargs)+1)