From 09f6286bec9ef9a220d709fa30ffbbb197be6e5d Mon Sep 17 00:00:00 2001 From: rocky Date: Sat, 21 May 2016 05:05:03 -0400 Subject: [PATCH] Fix 3.x generator bug... found by Daniel Brandburn. See https://github.com/moagstar/python-uncompyle6/commit/af61622960ba49eef5ea1b5bdf9a738c7b10427c --- test/bytecode_2.7/11_multi_genexpr.pyc | Bin 0 -> 508 bytes test/bytecode_3.5/11_multi_genexpr.pyc | Bin 0 -> 430 bytes .../expression/11_multi_genexpr.py | 24 ++++++++++++++++++ uncompyle6/parser.py | 2 ++ uncompyle6/parsers/parse2.py | 6 ----- uncompyle6/parsers/parse3.py | 7 +++-- 6 files changed, 29 insertions(+), 10 deletions(-) create mode 100644 test/bytecode_2.7/11_multi_genexpr.pyc create mode 100644 test/bytecode_3.5/11_multi_genexpr.pyc create mode 100644 test/simple_source/expression/11_multi_genexpr.py 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 0000000000000000000000000000000000000000..0c797800aa394e0ec09b754342da2879f3bd3e5f GIT binary patch literal 508 zcmbtQO-lnY6nxoesg;Tdp1dmTL0Wq+rJ&~?T2QEzfZI@3b~oF7S+KA@=|A=lI4^A# zuNs)i`3tSoctivD0=@;dXWS=mC$y>i21Hr(f< zOF4Z6YALODQ{`U11N!#mf7p5X;$L^TKp|L?ZmHb|OyyxeCVzXFZ)3k5!2@vDKftk-!hG|;liM>ZN zrzi*_f@}lu@WBY4b~HzT%#hunAhfuIErW)^D;6wHVCz8Rz$04^Va@63na`#^i(OGv zdXpGY`Mh<4yV!k^YL%4ARPC|7`vOhPcef_XODPhgYMqLacq_FqCR4>|JWldjR#~zV z1*L;>vvb40AUdb1j!=4xv-hh*GL$NPmL>{1+&+eb4Z1muP5lb>X}yCUXaD_yyG-{m Y!hc!6S4Th4wzwbWYFSGW**Z+a4^TH+fdBvi literal 0 HcmV?d00001 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):