Add support for async for
. Issue #124
Ignore 'boilerplate' opcodes that set up the async iteration logic internally (https://www.python.org/dev/peps/pep-0492/#asynchronous-iterators-and-async-for) - We don’t need any of this as GET_AITER is enough to tell us that we are in an `async for`.
This commit is contained in:
41
ASTNode.cpp
41
ASTNode.cpp
@@ -1,4 +1,5 @@
|
||||
#include "ASTNode.h"
|
||||
#include <bytecode.h>
|
||||
|
||||
/* ASTNodeList */
|
||||
void ASTNodeList::removeLast()
|
||||
@@ -75,7 +76,45 @@ const char* ASTBlock::type_str() const
|
||||
{
|
||||
static const char* s_type_strings[] = {
|
||||
"", "if", "else", "elif", "try", "CONTAINER", "except",
|
||||
"finally", "while", "for", "with",
|
||||
"finally", "while", "for", "with", "async for"
|
||||
};
|
||||
return s_type_strings[blktype()];
|
||||
}
|
||||
|
||||
|
||||
/* ASTIterBlock */
|
||||
const int ASTIterBlock::ASYNCFOR_BOILER_READLOOPINDEX = 4;
|
||||
const int ASTIterBlock::ASYNCFOR_BOILER_READLOOPCONTENTS = 11;
|
||||
const int ASTIterBlock::ASYNCFOR_BOILER_OFFSETFROMEND = 12;
|
||||
const int ASTIterBlock::ASYNCFOR_BOILER_FIRSTJUMP = 5;
|
||||
const Pyc::Opcode ASTIterBlock::ASYNCFOR_BOILER_ALTJUMPOP = Pyc::JUMP_ABSOLUTE_A;
|
||||
|
||||
const std::vector<Pyc::Opcode> ASTIterBlock::ASYNCFOR_BOILERPLATE = {
|
||||
// Ignore all these after GET_AITER.
|
||||
Pyc::SETUP_EXCEPT_A,
|
||||
Pyc::GET_ANEXT,
|
||||
Pyc::LOAD_CONST_A, // None
|
||||
Pyc::YIELD_FROM,
|
||||
|
||||
// Process ops from here to load index variable.
|
||||
|
||||
// Continue ignoring all these
|
||||
Pyc::POP_BLOCK,
|
||||
Pyc::JUMP_FORWARD_A, // or JUMP_ABSOLUTE if pass
|
||||
Pyc::DUP_TOP,
|
||||
Pyc::LOAD_GLOBAL_A, // StopAsyncIteration
|
||||
Pyc::COMPARE_OP_A, // (<EXCEPTION MATCH>)
|
||||
Pyc::POP_JUMP_IF_TRUE_A,
|
||||
Pyc::END_FINALLY,
|
||||
|
||||
// Actual code inside the loop begins here. 'Preamble' before this, 'Trailer' after.
|
||||
|
||||
// After reading a JUMP at the address we are expecting, ignore the following:
|
||||
Pyc::POP_TOP,
|
||||
Pyc::POP_TOP,
|
||||
Pyc::POP_TOP,
|
||||
Pyc::POP_EXCEPT,
|
||||
Pyc::POP_TOP
|
||||
|
||||
// Then a POP_BLOCK as per normal loop
|
||||
};
|
||||
|
Reference in New Issue
Block a user