diff --git a/test/bytecode_2.6_run/02_ifelse_comprehension.pyc b/test/bytecode_2.6_run/02_ifelse_comprehension.pyc new file mode 100644 index 00000000..1b2c002a Binary files /dev/null and b/test/bytecode_2.6_run/02_ifelse_comprehension.pyc differ diff --git a/test/bytecode_3.1/02_ifelse_comprehension.pyc b/test/bytecode_3.1/02_ifelse_comprehension.pyc deleted file mode 100644 index f82a46b0..00000000 Binary files a/test/bytecode_3.1/02_ifelse_comprehension.pyc and /dev/null differ diff --git a/test/bytecode_3.1_run/02_ifelse_comprehension.pyc b/test/bytecode_3.1_run/02_ifelse_comprehension.pyc new file mode 100644 index 00000000..febcc118 Binary files /dev/null and b/test/bytecode_3.1_run/02_ifelse_comprehension.pyc differ diff --git a/test/bytecode_3.3/02_ifelse_comprehension.pyc b/test/bytecode_3.3/02_ifelse_comprehension.pyc deleted file mode 100644 index a0c342af..00000000 Binary files a/test/bytecode_3.3/02_ifelse_comprehension.pyc and /dev/null differ diff --git a/test/bytecode_3.3_run/02_ifelse_comprehension.pyc b/test/bytecode_3.3_run/02_ifelse_comprehension.pyc new file mode 100644 index 00000000..183f8eae Binary files /dev/null and b/test/bytecode_3.3_run/02_ifelse_comprehension.pyc differ diff --git a/test/bytecode_3.6_run/02_ifelse_comprehension.pyc b/test/bytecode_3.6_run/02_ifelse_comprehension.pyc new file mode 100644 index 00000000..021db2f8 Binary files /dev/null and b/test/bytecode_3.6_run/02_ifelse_comprehension.pyc differ diff --git a/test/simple_source/bug31/02_ifelse_comprehension.py b/test/simple_source/bug31/02_ifelse_comprehension.py index e3d7e92c..769b09bd 100644 --- a/test/simple_source/bug31/02_ifelse_comprehension.py +++ b/test/simple_source/bug31/02_ifelse_comprehension.py @@ -1,12 +1,18 @@ -# Python 2.7 sqlalchemy-1.013/sql/crud.py -def _extend_values_for_multiparams(compiler, stmt, c): - c( - [ - ( - (compiler() if compiler() - else compiler()) - if c in stmt else compiler(), - ) - ] - for i in enumerate(stmt) +# Adapted from Python 2.7 sqlalchemy-1.013/sql/crud.py +# Bug was in handling generator comprehension +# In 2.6, 2.7 JUMP_ABSOLUTEs rather than JUMP_BACKs are generated + +# RUNNABLE! +def extend(stmt, a, c, c1, c2, c3): + return c( + ([ (5 if c1 else c2) + if a else c3 + ] for i in enumerate(stmt)) ) + +def foo(gen): + return list(gen) + +assert extend([0], 0, foo, True, 'c2', 'c3') == [['c3']] +assert extend([0, 1], 1, foo, False, 'c2', 'c3') == [['c2'], ['c2']] +assert extend([0, 1], False, foo, False, 'c2', 'c3') == [['c3'], ['c3']] diff --git a/uncompyle6/parsers/parse26.py b/uncompyle6/parsers/parse26.py index 23091189..172f4ea3 100644 --- a/uncompyle6/parsers/parse26.py +++ b/uncompyle6/parsers/parse26.py @@ -267,6 +267,8 @@ class Python26Parser(Python2Parser): # Note: preserve positions 0 2 and 4 for semantic actions conditional_not ::= expr jmp_true expr jf_cf_pop expr COME_FROM conditional ::= expr jmp_false expr jf_cf_pop expr come_from_opt + conditional ::= expr jmp_false expr ja_cf_pop expr + expr ::= conditional_not and ::= expr JUMP_IF_FALSE POP_TOP expr JUMP_IF_FALSE POP_TOP diff --git a/uncompyle6/parsers/parse27.py b/uncompyle6/parsers/parse27.py index 004a0dff..c960eb21 100644 --- a/uncompyle6/parsers/parse27.py +++ b/uncompyle6/parsers/parse27.py @@ -123,6 +123,7 @@ class Python27Parser(Python2Parser): conditional_true ::= expr JUMP_FORWARD expr COME_FROM conditional ::= expr jmp_false expr JUMP_FORWARD expr COME_FROM + conditional ::= expr jmp_false expr JUMP_ABSOLUTE expr """ def p_stmt27(self, args):