From 185ec4e3065fd12deab719cd60689de1ac968737 Mon Sep 17 00:00:00 2001 From: rocky Date: Sat, 13 Jan 2018 00:58:16 -0500 Subject: [PATCH] Fix 2.6 IF/THEN misclassification.. with an exception condition --- test/bytecode_2.6/03_tryelse_continue.pyc | Bin 418 -> 664 bytes .../bug26/03_tryelse_continue.py | 11 +++++++++ uncompyle6/scanners/scanner2.py | 22 +++++++++++------- 3 files changed, 25 insertions(+), 8 deletions(-) diff --git a/test/bytecode_2.6/03_tryelse_continue.pyc b/test/bytecode_2.6/03_tryelse_continue.pyc index 2f722f1e547fda3906750d2d089426e868bcd371..b3861e8254c44ea7783da19bf6b311130729908d 100644 GIT binary patch delta 263 zcmZ3)JcHHj;wN4%qxq3h$qZ1y2&5f=xL6EGq%bhFFfc>`8H`{CBSQ)kL$C((MqM$+ zdaxFda#kRA2Wc?_5|tbv#lhiu>I^I;3=COZ4EY=kj6eX=$;eW|h%Cem6p8>^60E@j z)asWBGAWY@L@)yh4G^n@14wwMR=O4y`8H^0U8cZ9_#27jJG(bv% Nm?zsa1+xHI3;_H^3xEIs diff --git a/test/simple_source/bug26/03_tryelse_continue.py b/test/simple_source/bug26/03_tryelse_continue.py index d6cb3e5d..83464529 100644 --- a/test/simple_source/bug26/03_tryelse_continue.py +++ b/test/simple_source/bug26/03_tryelse_continue.py @@ -12,3 +12,14 @@ def test_specific_values(self): self = 2 self = 3 + +# From 2.6 test_decorators. +# Bug was thinking an "except" was some sort of if/then +def call(*args): + try: + return 5 + except KeyError: + return 2 + except TypeError: + # Unhashable argument + return 3 diff --git a/uncompyle6/scanners/scanner2.py b/uncompyle6/scanners/scanner2.py index 68e48ba9..b501d234 100644 --- a/uncompyle6/scanners/scanner2.py +++ b/uncompyle6/scanners/scanner2.py @@ -894,7 +894,6 @@ class Scanner2(Scanner): self.structs.append({'type': 'if-then', 'start': start-3, 'end': pre_rtarget}) - self.thens[start] = end elif jump_op == 'JUMP_ABSOLUTE': if_then_maybe = {'type': 'if-then', @@ -937,13 +936,20 @@ class Scanner2(Scanner): 'end': end}) elif code_pre_rtarget == self.opc.RETURN_VALUE: if self.version == 2.7 or pre_rtarget not in self.ignore_if: - self.structs.append({'type': 'if-then', - 'start': start, - 'end': rtarget}) - self.thens[start] = rtarget - if self.version == 2.7 or code[pre_rtarget+1] != self.opc.JUMP_FORWARD: - self.fixed_jumps[offset] = rtarget - self.return_end_ifs.add(pre_rtarget) + # 10 is exception-match. If there is an exception match in the + # compare, then this is an exception clause not an if-then clause + if (self.code[self.prev[offset]] != self.opc.COMPARE_OP or + self.code[self.prev[offset]+1] != 10): + self.structs.append({'type': 'if-then', + 'start': start, + 'end': rtarget}) + self.thens[start] = rtarget + if self.version == 2.7 or code[pre_rtarget+1] != self.opc.JUMP_FORWARD: + self.fixed_jumps[offset] = rtarget + self.return_end_ifs.add(pre_rtarget) + pass + pass + pass elif op in self.pop_jump_if_or_pop: target = self.get_target(offset, op)