From 8194595ec959fe792caca919dcbe32cc8eeedbe3 Mon Sep 17 00:00:00 2001 From: rocky Date: Fri, 19 Jan 2018 16:56:21 -0500 Subject: [PATCH] Handle 3.6+ EXTENDED_ARGs for POP_JUMP_IF... instructions --- test/bytecode_3.6/10_long_pop_jump.pyc | Bin 0 -> 1135 bytes test/simple_source/bug36/10_long_pop_jump.py | 50 +++++++++++++++++++ uncompyle6/scanners/scanner3.py | 6 ++- 3 files changed, 54 insertions(+), 2 deletions(-) create mode 100644 test/bytecode_3.6/10_long_pop_jump.pyc create mode 100644 test/simple_source/bug36/10_long_pop_jump.py diff --git a/test/bytecode_3.6/10_long_pop_jump.pyc b/test/bytecode_3.6/10_long_pop_jump.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d32e717a3ed1c6150b5932677b158698dfc2dfe4 GIT binary patch literal 1135 zcmZ8gPjAyO6!&w}HcdO|M#qEzsUTqL0md{5B!ng;B#sD)15!YQEH+!##0j>e{ZYD0 z;et3!d<(tS|4DIg0^;;AM^pJB97N6~XIBTVTlI&mhLo3+M7CMD`99o9znF{333nx}Bs zM`mM8PCwf8$yGNIxlvOHvg?Ejjq-0RmL}nb=mpSxrjG7*VtwK%3rCl<+{@vpWn`jy`6U_F9^GcueJ7c2Dc44 z!`C5a_Tgsm@(dSZfX!fg2I~ew(+;&xVx^6n#A2+Ea&8>!nKn;&%7s3@RR~q&c_uYy z!}XWz!)Py*!&nS&sv+Z163S4=nK-^)2!5FJ=zrQG=h_12ru>s>fij}f3YJ#z*)JUO zJbK%XjV)QzwdR~P_V-z#qn_WE;QfNAPl$NpBO=2CSp^o-UgA3-b z26ZWxMfNHKRqQCPO_NKR$x+8RiYIRk#0K^a2;a3;t2>9tIF)`#jbkN!A@VZzH(OV6 znxhVt6*A%*JH_tSy^YPgL6V8xAkXq(zew{t`H@+kSN{7V_{S#d85#n8aKMEDc+dln z_R+Wd7Mw%tBI-hqdT2fT9Q^FMg1B9+=Ru$Ls59rwtC;iY2&%P`xnQm!X55Eq#)^b* IR~oE@-yl~g": + data = rawdata[i+2:j] + if decltype == "d": + self.handle_decl(data) + else: + self.unknown_decl(data) + return j + 1 + if c in "'": + m = _declstringlit_match(rawdata, j) + if not m: + return -1 + j = m.end() + elif c in "a": + name, j = self._scan_name(j, i) + elif c: + j += 1 + elif c == "[": + if decltype == "d": + j = self._parse_doctype_subset(j + 1, i) + elif decltype in {"attlist", "linktype", "link", "element"}: + self.error("unsupported '[' char in %s declaration" % decltype) + else: + self.error("unexpected '[' char in declaration") + else: + self.error( + "unexpected %r char in declaration" % rawdata[j]) + if j < 0: + return j + return -1 diff --git a/uncompyle6/scanners/scanner3.py b/uncompyle6/scanners/scanner3.py index a15950fb..b822e70d 100644 --- a/uncompyle6/scanners/scanner3.py +++ b/uncompyle6/scanners/scanner3.py @@ -716,6 +716,8 @@ class Scanner3(Scanner): else: if self.get_target(jump_back, 0) >= next_line_byte: jump_back = self.last_instr(start, end, self.opc.JUMP_ABSOLUTE, start, False) + + # This is wrong for 3.6+ if end > jump_back+4 and self.is_jump_forward(end): if self.is_jump_forward(jump_back+4): if self.get_target(jump_back+4) == self.get_target(end): @@ -753,8 +755,8 @@ class Scanner3(Scanner): 'start': after_jump_offset, 'end': end}) elif op in self.pop_jump_tf: - start = offset + instruction_size(op, self.opc) - target = self.get_target(offset) + start = offset + instruction_size(op, self.opc) + target = self.insts[inst_index].argval rtarget = self.restrict_to_parent(target, parent) prev_op = self.prev_op