diff --git a/test/bytecode_3.6/09_long_whilestmt.pyc b/test/bytecode_3.6/09_long_whilestmt.pyc new file mode 100644 index 00000000..7612eb31 Binary files /dev/null and b/test/bytecode_3.6/09_long_whilestmt.pyc differ diff --git a/test/simple_source/bug36/09_long_whilestmt.py b/test/simple_source/bug36/09_long_whilestmt.py new file mode 100644 index 00000000..1cf98b6b --- /dev/null +++ b/test/simple_source/bug36/09_long_whilestmt.py @@ -0,0 +1,74 @@ +# From https://github.com/rocky/python-uncompyle6/issues/420 +# Related to EXTENDED_ARG in whilestmt +ERRPR_CODE_DEFINE = {} # Remove this and things works + +try: + print() +except Exception: + var1 = 0 + var2 = 1 + if var1 or var2: + times = 1 + while times != False and self.scanner.is_open(): + try: + try: + print() + except Exception: + print() + + out = 0 + count = 1 + if out == 1: + break + elif out == 2: + count += 1 + if times == 3: + self.func.emit({}) + break + else: + continue + if out == 3 or out == b"": + if self.times == 3: + break + count += 1 + if count == 3: + count = 0 + if out == 4: + self.func.emit(ERRPR_CODE_DEFINE.ReceiedError()) + else: + print() + break + continue + else: + count = 0 + except Exception: + print("upper exception") + else: + try: + print("jump forward") + while True: + out = self.func.read(count) + if out == b"": + self.func.emit(ERRPR_CODE_DEFINE.ReceiedError()) + break + continue + imagedata = out[0] + if imagedata == b"\x05": + self.func.emit(INFORMATION.UnsupportedImage()) + break + continue + if imagedata == b"\x15": + self.func.emit(INFORMATION.NoneImage()) + break + continue + if out[1] == False: + start_index = imagedata.find(b"BM6") + self.func.emit(imagedata[start_index:], False) + continue + (imagedata, all_code) = imagedata + self.func.emit({}) + self.func.emit({}) + self.func.emit({}) # remove {} and this works + break + except Exception: + pass diff --git a/uncompyle6/parsers/parse36.py b/uncompyle6/parsers/parse36.py index a76a3749..09980695 100644 --- a/uncompyle6/parsers/parse36.py +++ b/uncompyle6/parsers/parse36.py @@ -53,6 +53,8 @@ class Python36Parser(Python35Parser): for_block ::= l_stmts_opt come_from_loops JUMP_BACK come_from_loops ::= COME_FROM_LOOP* + whilestmt ::= SETUP_LOOP testexpr l_stmts_opt + JUMP_BACK come_froms POP_BLOCK whilestmt ::= SETUP_LOOP testexpr l_stmts_opt JUMP_BACK come_froms POP_BLOCK COME_FROM_LOOP whilestmt ::= SETUP_LOOP testexpr l_stmts_opt