Improvements to for loops

This commit is contained in:
Darryl Pogue
2011-01-04 14:39:19 -08:00
parent 43b1ffae3c
commit af967980bc

View File

@@ -276,6 +276,20 @@ PycRef<ASTNode> BuildFromCode(PycRef<PycCode> code, PycModule* mod)
}
}
break;
case Pyc::FOR_ITER_A:
{
PycRef<ASTNode> iter = stack.top(); // Iterable
/* Pop it? Don't pop it? */
PycRef<ASTBlock> top = blocks.top();
blocks.pop();
PycRef<ASTIterBlock> forblk = new ASTIterBlock(ASTBlock::BLK_FOR, pos+operand, iter);
blocks.push(forblk.cast<ASTBlock>());
curblock = blocks.top();
stack.push(Node_NULL);
}
break;
case Pyc::FOR_LOOP_A:
{
PycRef<ASTNode> curidx = stack.top(); // Current index
@@ -297,6 +311,9 @@ PycRef<ASTNode> BuildFromCode(PycRef<PycCode> code, PycModule* mod)
stack.push(Node_NULL); // We can totally hack this >_>
}
break;
case Pyc::GET_ITER:
/* We just entirely ignore this */
break;
case Pyc::IMPORT_NAME_A:
if (mod->majorVer() == 1) {
stack.push(new ASTImport(new ASTName(code->getName(operand)), Node_NULL));
@@ -435,6 +452,13 @@ PycRef<ASTNode> BuildFromCode(PycRef<PycCode> code, PycModule* mod)
break;
case Pyc::JUMP_ABSOLUTE_A:
{
if (curblock->blktype() != ASTBlock::BLK_IF
&& curblock->blktype() != ASTBlock::BLK_ELIF
&& curblock->blktype() != ASTBlock::BLK_WHILE)
{
break;
}
stack = stack_hist.top();
stack_hist.pop();