diff --git a/test/bytecode_3.6/03_async_await.pyc b/test/bytecode_3.6/03_async_await.pyc index 97f7ae15..8b2bd943 100644 Binary files a/test/bytecode_3.6/03_async_await.pyc and b/test/bytecode_3.6/03_async_await.pyc differ diff --git a/test/bytecode_3.7/03_async_await.pyc b/test/bytecode_3.7/03_async_await.pyc new file mode 100644 index 00000000..4d8ac946 Binary files /dev/null and b/test/bytecode_3.7/03_async_await.pyc differ diff --git a/uncompyle6/parsers/parse36.py b/uncompyle6/parsers/parse36.py index 1044c41e..90b107d7 100644 --- a/uncompyle6/parsers/parse36.py +++ b/uncompyle6/parsers/parse36.py @@ -56,7 +56,18 @@ class Python36Parser(Python35Parser): jf_cf ::= JUMP_FORWARD COME_FROM conditional ::= expr jmp_false expr jf_cf expr COME_FROM - # FIXME: remove corresponding rule for 3.5 + async_for_stmt ::= SETUP_LOOP expr + GET_AITER + LOAD_CONST YIELD_FROM SETUP_EXCEPT GET_ANEXT LOAD_CONST + YIELD_FROM + store + POP_BLOCK JUMP_FORWARD COME_FROM_EXCEPT DUP_TOP + LOAD_GLOBAL COMPARE_OP POP_JUMP_IF_FALSE + POP_TOP POP_TOP POP_TOP POP_EXCEPT POP_BLOCK + JUMP_ABSOLUTE END_FINALLY COME_FROM + for_block POP_BLOCK + COME_FROM_LOOP + async_forelse_stmt ::= SETUP_LOOP expr GET_AITER LOAD_CONST YIELD_FROM SETUP_EXCEPT GET_ANEXT LOAD_CONST @@ -105,9 +116,32 @@ class Python36Parser(Python35Parser): """ def customize_grammar_rules(self, tokens, customize): + # self.remove_rules(""" + # """) super(Python36Parser, self).customize_grammar_rules(tokens, customize) self.remove_rules(""" - dict_comp ::= load_closure LOAD_DICTCOMP LOAD_CONST MAKE_CLOSURE_0 expr GET_ITER CALL_FUNCTION_1 + async_for_stmt ::= SETUP_LOOP expr + GET_AITER + LOAD_CONST YIELD_FROM SETUP_EXCEPT GET_ANEXT LOAD_CONST + YIELD_FROM + store + POP_BLOCK jump_except COME_FROM_EXCEPT DUP_TOP + LOAD_GLOBAL COMPARE_OP POP_JUMP_IF_FALSE + POP_TOP POP_TOP POP_TOP POP_EXCEPT POP_BLOCK + JUMP_ABSOLUTE END_FINALLY COME_FROM + for_block POP_BLOCK JUMP_ABSOLUTE + COME_FROM_LOOP + async_forelse_stmt ::= SETUP_LOOP expr + GET_AITER + LOAD_CONST YIELD_FROM SETUP_EXCEPT GET_ANEXT LOAD_CONST + YIELD_FROM + store + POP_BLOCK JUMP_FORWARD COME_FROM_EXCEPT DUP_TOP + LOAD_GLOBAL COMPARE_OP POP_JUMP_IF_FALSE + POP_TOP POP_TOP POP_TOP POP_EXCEPT POP_BLOCK + JUMP_ABSOLUTE END_FINALLY COME_FROM + for_block pb_ja + else_suite COME_FROM_LOOP """) self.check_reduce['call_kw'] = 'AST' diff --git a/uncompyle6/parsers/parse37.py b/uncompyle6/parsers/parse37.py index bd6a4d12..4dd15cd8 100644 --- a/uncompyle6/parsers/parse37.py +++ b/uncompyle6/parsers/parse37.py @@ -33,6 +33,32 @@ class Python37Parser(Python36Parser): stmt ::= import37 import37 ::= import POP_TOP + async_for_stmt ::= SETUP_LOOP expr + GET_AITER + SETUP_EXCEPT GET_ANEXT LOAD_CONST + YIELD_FROM + store + POP_BLOCK JUMP_FORWARD COME_FROM_EXCEPT DUP_TOP + LOAD_GLOBAL COMPARE_OP POP_JUMP_IF_TRUE + END_FINALLY COME_FROM + for_block + COME_FROM + POP_TOP POP_TOP POP_TOP POP_EXCEPT POP_TOP POP_BLOCK + COME_FROM_LOOP + + async_forelse_stmt ::= SETUP_LOOP expr + GET_AITER + SETUP_EXCEPT GET_ANEXT LOAD_CONST + YIELD_FROM + store + POP_BLOCK JUMP_FORWARD COME_FROM_EXCEPT DUP_TOP + LOAD_GLOBAL COMPARE_OP POP_JUMP_IF_TRUE + END_FINALLY COME_FROM + for_block + COME_FROM + POP_TOP POP_TOP POP_TOP POP_EXCEPT POP_TOP POP_BLOCK + else_suite COME_FROM_LOOP + # Is there a pattern here? attributes ::= IMPORT_FROM ROT_TWO POP_TOP IMPORT_FROM @@ -46,6 +72,19 @@ class Python37Parser(Python36Parser): """ def customize_grammar_rules(self, tokens, customize): + self.remove_rules(""" + async_forelse_stmt ::= SETUP_LOOP expr + GET_AITER + LOAD_CONST YIELD_FROM SETUP_EXCEPT GET_ANEXT LOAD_CONST + YIELD_FROM + store + POP_BLOCK JUMP_FORWARD COME_FROM_EXCEPT DUP_TOP + LOAD_GLOBAL COMPARE_OP POP_JUMP_IF_FALSE + POP_TOP POP_TOP POP_TOP POP_EXCEPT POP_BLOCK + JUMP_ABSOLUTE END_FINALLY COME_FROM + for_block POP_BLOCK + else_suite COME_FROM_LOOP + """) super(Python37Parser, self).customize_grammar_rules(tokens, customize) class Python37ParserSingle(Python37Parser, PythonParserSingle): diff --git a/uncompyle6/semantics/customize3.py b/uncompyle6/semantics/customize3.py index 104067d1..afd1ab99 100644 --- a/uncompyle6/semantics/customize3.py +++ b/uncompyle6/semantics/customize3.py @@ -885,6 +885,12 @@ def customize_for_version3(self, version): PRECEDENCE['attribute37'] = 2 TABLE_DIRECT.update({ 'attribute37': ( '%c.%[1]{pattr}', 0 ), + 'async_forelse_stmt': ( + '%|async for %c in %c:\n%+%c%-%|else:\n%+%c%-\n\n', + 7, 1, 17, (25, 'else_suite') ), + 'async_for_stmt': ( + '%|async for %c in %c:\n%+%c%-%-\n\n', + 7, 1, 17), }) pass pass # version >= 3.6