diff --git a/test/bytecode_2.6/07_generator_return.pyc b/test/bytecode_2.6/07_generator_return.pyc index 0cb71a09..afa11910 100644 Binary files a/test/bytecode_2.6/07_generator_return.pyc and b/test/bytecode_2.6/07_generator_return.pyc differ diff --git a/test/bytecode_2.7/07_generator_return.pyc b/test/bytecode_2.7/07_generator_return.pyc index d4f660fa..f8e1a2d3 100644 Binary files a/test/bytecode_2.7/07_generator_return.pyc and b/test/bytecode_2.7/07_generator_return.pyc differ 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()