From 647248dfc8cd5e638360cb26d24ca08567cccbdd Mon Sep 17 00:00:00 2001 From: rocky Date: Sun, 4 Sep 2016 04:10:08 -0400 Subject: [PATCH] A couple more 2.6 (and below) bugs fixed * Detect "return None" inside if statement * another case of triple ==, ==, == scanner2.py: detect_structure: descriminate more on parent type --- test/bytecode_2.6/07_generator_return.pyc | Bin 410 -> 674 bytes test/bytecode_2.7/07_generator_return.pyc | Bin 404 -> 666 bytes .../simple_source/bug26/07_generator_return.py | 17 +++++++++++++++++ uncompyle6/scanners/scanner2.py | 8 +++++++- uncompyle6/semantics/pysource.py | 4 ++-- 5 files changed, 26 insertions(+), 3 deletions(-) diff --git a/test/bytecode_2.6/07_generator_return.pyc b/test/bytecode_2.6/07_generator_return.pyc index 0cb71a0972dc2fbdf4cba4117d5f02c23f6f4aab..afa11910a714e5a83b2dcaa584531832bbc03cf1 100644 GIT binary patch delta 281 zcmbQmyolB8;wN6N#%rg;lNq3Z5lA}#aj_VXNMT@TVPJ>?G8n-OMurq7hF}fmjkHl$p-))awwhv delta 72 zcmZ3)I*VEN;wN4%mXK57$qZ1y2&5f=xR@76q%bhFFfc>`8H^0U8cZ9__!v3-G(bv% NSSNcj1+xHI3;^D)3l0DP diff --git a/test/bytecode_2.7/07_generator_return.pyc b/test/bytecode_2.7/07_generator_return.pyc index d4f660fa279dc099a04ba7f43d60a6b0da23f598..f8e1a2d3997eb3c10249dbd879612cad6cb71698 100644 GIT binary patch delta 281 zcmXXs)Pc0?#d delta 72 zcmbQmI)z!6`7 Ntdkv?f?0qp1^}dL3MBvl diff --git a/test/simple_source/bug26/07_generator_return.py b/test/simple_source/bug26/07_generator_return.py index 56dc80d1..94a7c468 100644 --- a/test/simple_source/bug26/07_generator_return.py +++ b/test/simple_source/bug26/07_generator_return.py @@ -10,3 +10,20 @@ def __iter__(self): i += 1 except IndexError: return + + +# From 2.6 bsddb/__init.py +# Bug is return None in a generator inside +# an if. +def iteritems(self): + if not self.db: + return + try: + try: + yield self.kv + except: + # the database was modified during iteration. abort. + pass + except: + self._in_iter -= 1 + raise diff --git a/uncompyle6/scanners/scanner2.py b/uncompyle6/scanners/scanner2.py index 3c2a8521..9e1c9883 100644 --- a/uncompyle6/scanners/scanner2.py +++ b/uncompyle6/scanners/scanner2.py @@ -713,9 +713,15 @@ class Scanner2(scan.Scanner): self.fixed_jumps[pos] = fix or match[-1] return else: - if self.version < 2.7 and parent['type'] == 'root': + if (self.version < 2.7 + and parent['type'] in ('root', 'for-loop', 'if-then', + 'if-else', 'try')): self.fixed_jumps[pos] = rtarget else: + # note test for < 2.7 might be superflous although informative + # for 2.7 a different branch is taken and the below code is handled + # under: elif op in self.pop_jump_if_or_pop + # below self.fixed_jumps[pos] = match[-1] return else: # op != self.opc.PJIT diff --git a/uncompyle6/semantics/pysource.py b/uncompyle6/semantics/pysource.py index 42589511..c2db6fc7 100644 --- a/uncompyle6/semantics/pysource.py +++ b/uncompyle6/semantics/pysource.py @@ -774,7 +774,7 @@ class SourceWalker(GenericASTTraversal, object): def is_return_none(self, node): # Is there a better way? - ret = (node == 'return_stmt' + ret = (node in ('return_stmt', 'return_if_stmt') and node[0] == 'ret_expr' and node[0][0] == 'expr' and node[0][0][0] == 'LOAD_CONST' @@ -809,7 +809,7 @@ class SourceWalker(GenericASTTraversal, object): self.prune() else: self.write(self.indent, 'return') - if self.return_none or node != AST('return_stmt', [AST('ret_expr', [NONE]), Token('RETURN_END_IF')]): + if self.return_none or not self.is_return_none(node): self.write(' ') self.preorder(node[0]) self.println()