diff --git a/test/bytecode_2.7/11_multi_genexpr.pyc b/test/bytecode_2.7/11_multi_genexpr.pyc new file mode 100644 index 00000000..0c797800 Binary files /dev/null and b/test/bytecode_2.7/11_multi_genexpr.pyc differ diff --git a/test/bytecode_3.5/11_multi_genexpr.pyc b/test/bytecode_3.5/11_multi_genexpr.pyc new file mode 100644 index 00000000..010e7820 Binary files /dev/null and b/test/bytecode_3.5/11_multi_genexpr.pyc differ diff --git a/test/simple_source/expression/11_multi_genexpr.py b/test/simple_source/expression/11_multi_genexpr.py new file mode 100644 index 00000000..99d5c296 --- /dev/null +++ b/test/simple_source/expression/11_multi_genexpr.py @@ -0,0 +1,24 @@ +# Had bug in Python 3.x + +# Should see (Python 2.x and 3.x: +# get_iter ::= expr GET_ITER +# expr ::= get_iter +# _for ::= GET_ITER FOR_ITER +# designator ::= STORE_FAST +# expr ::= LOAD_FAST +# yield ::= expr YIELD_VALUE +# expr ::= yield +# gen_comp_body ::= expr YIELD_VALUE POP_TOP +# comp_body ::= gen_comp_body +# comp_iter ::= comp_body +# comp_for ::= expr _for designator comp_iter JUMP_BACK +# comp_iter ::= comp_for +# genexpr_func ::= LOAD_FAST FOR_ITER designator comp_iter JUMP_BACK + +def multi_genexpr(blog_posts): + + return ( + entry + for blog_post in blog_posts + for entry in blog_post.entry_set + ) diff --git a/uncompyle6/parser.py b/uncompyle6/parser.py index c31fb6e6..d559ff43 100644 --- a/uncompyle6/parser.py +++ b/uncompyle6/parser.py @@ -288,6 +288,8 @@ class PythonParser(GenericASTBuilder): comp_if ::= expr jmp_false comp_iter comp_ifnot ::= expr jmp_true comp_iter + + comp_for ::= expr _for designator comp_iter JUMP_BACK """ def p_expr(self, args): diff --git a/uncompyle6/parsers/parse2.py b/uncompyle6/parsers/parse2.py index 97741e2d..13ebba37 100644 --- a/uncompyle6/parsers/parse2.py +++ b/uncompyle6/parsers/parse2.py @@ -36,12 +36,6 @@ class Python2Parser(PythonParser): list_for ::= expr _for designator list_iter JUMP_BACK """ - def p_setcomp2(self, args): - ''' - # This is different in python3 - should it be? - comp_for ::= expr _for designator comp_iter JUMP_BACK - ''' - def p_print(self, args): ''' stmt ::= print_items_stmt diff --git a/uncompyle6/parsers/parse3.py b/uncompyle6/parsers/parse3.py index 3e45b6ab..50efa10d 100644 --- a/uncompyle6/parsers/parse3.py +++ b/uncompyle6/parsers/parse3.py @@ -58,10 +58,9 @@ class Python3Parser(PythonParser): def p_setcomp3(self, args): """ - # This is different in Python 2 - should it be? - comp_for ::= expr _for designator comp_iter JUMP_ABSOLUTE - - # See also common Python p_setcomp + # Does this also happen in Python 2? + # If so, adjust p_setcomp in parser.py + comp_for ::= expr _for designator comp_iter JUMP_BACK """ def p_grammar(self, args):