70
70
import com .oracle .graal .python .nodes .control .BlockNode ;
71
71
import com .oracle .graal .python .nodes .control .ForNode ;
72
72
import com .oracle .graal .python .nodes .control .GetIteratorNode ;
73
+ import com .oracle .graal .python .nodes .control .LoopNode ;
73
74
import com .oracle .graal .python .nodes .control .ReturnTargetNode ;
74
75
import com .oracle .graal .python .nodes .expression .AndNode ;
75
76
import com .oracle .graal .python .nodes .expression .CastToBooleanNode ;
@@ -440,13 +441,12 @@ private PNode createComprehensionExpression(ParserRuleContext ctx, Function<Pars
440
441
PNode block = getBlock .apply (ctx );
441
442
PNode yield = factory .createYield (block , environment .getReturnSlot ());
442
443
yield .assignSourceSection (block .getSourceSection ());
443
- ForNode genFor = createGeneratorExpression (ctx .getChild (Python3Parser .Comp_forContext .class , 0 ), yield );
444
- SourceSection srcSection = genFor .getSourceSection ();
445
- PNode getIterator = genFor .getIterator ();
446
- PNode body = new ReturnTargetNode (genFor , factory .createReadLocal (environment .getReturnSlot ()));
444
+ PNode body = createGeneratorExpression (ctx .getChild (Python3Parser .Comp_forContext .class , 0 ), yield );
445
+ SourceSection srcSection = body .getSourceSection ();
446
+ body = new ReturnTargetNode (body , factory .createReadLocal (environment .getReturnSlot ()));
447
447
body .assignSourceSection (srcSection );
448
448
int lineNum = ctx .getStart ().getLine ();
449
- GeneratorExpressionNode genExprDef = createGeneratorExpressionDefinition (body , getIterator , lineNum );
449
+ GeneratorExpressionNode genExprDef = createGeneratorExpressionDefinition (body , lineNum );
450
450
genExprDef .setEnclosingFrameDescriptor (environment .getEnclosingFrame ());
451
451
genExprDef .assignSourceSection (srcSection );
452
452
return genExprDef ;
@@ -455,13 +455,14 @@ private PNode createComprehensionExpression(ParserRuleContext ctx, Function<Pars
455
455
}
456
456
}
457
457
458
- private GeneratorExpressionNode createGeneratorExpressionDefinition (PNode body , PNode getIterator , int lineNum ) {
458
+ private GeneratorExpressionNode createGeneratorExpressionDefinition (PNode body , int lineNum ) {
459
459
FrameDescriptor fd = environment .getCurrentFrame ();
460
460
String generatorName = "generator_exp:" + lineNum ;
461
461
FunctionRootNode funcRoot = factory .createFunctionRoot (body .getSourceSection (), generatorName , true , fd , body , environment .getExecutionCellSlots ());
462
- GeneratorTranslator gtran = new GeneratorTranslator (funcRoot );
462
+ GeneratorTranslator gtran = new GeneratorTranslator (funcRoot , true );
463
463
RootCallTarget callTarget = gtran .translate ();
464
- return new GeneratorExpressionNode (generatorName , callTarget , getIterator , fd , environment .getDefinitionCellSlots (), environment .getExecutionCellSlots (),
464
+ PNode loopIterator = gtran .getGetOuterMostLoopIterator ();
465
+ return new GeneratorExpressionNode (generatorName , callTarget , loopIterator , fd , environment .getDefinitionCellSlots (), environment .getExecutionCellSlots (),
465
466
gtran .getNumOfActiveFlags (),
466
467
gtran .getNumOfGeneratorBlockNode (),
467
468
gtran .getNumOfGeneratorForNode ());
@@ -1201,7 +1202,7 @@ private PNode createForNode(PNode target, PNode iter, PNode body, PNode orelse,
1201
1202
}
1202
1203
}
1203
1204
1204
- private ForNode createForInScope (PNode target , PNode iterator , PNode body ) {
1205
+ private LoopNode createForInScope (PNode target , PNode iterator , PNode body ) {
1205
1206
GetIteratorNode getIterator = factory .createGetIterator (iterator );
1206
1207
getIterator .assignSourceSection (iterator .getSourceSection ());
1207
1208
return new ForNode (body , target , getIterator );
@@ -1415,8 +1416,9 @@ public Object visitFuncdef(Python3Parser.FuncdefContext ctx) {
1415
1416
*/
1416
1417
PNode funcDef ;
1417
1418
if (environment .isInGeneratorScope ()) {
1418
- GeneratorTranslator gtran = new GeneratorTranslator (funcRoot );
1419
- funcDef = GeneratorFunctionDefinitionNode .create (funcName , enclosingClassName , core , arity , defaults , gtran .translate (), fd ,
1419
+ GeneratorTranslator gtran = new GeneratorTranslator (funcRoot , false );
1420
+ RootCallTarget callTarget = gtran .translate ();
1421
+ funcDef = GeneratorFunctionDefinitionNode .create (funcName , enclosingClassName , core , arity , defaults , callTarget , fd ,
1420
1422
environment .getDefinitionCellSlots (), environment .getExecutionCellSlots (),
1421
1423
gtran .getNumOfActiveFlags (), gtran .getNumOfGeneratorBlockNode (), gtran .getNumOfGeneratorForNode ());
1422
1424
} else {
@@ -1568,8 +1570,9 @@ public Object visitLambdef(Python3Parser.LambdefContext ctx) {
1568
1570
*/
1569
1571
PNode funcDef ;
1570
1572
if (environment .isInGeneratorScope ()) {
1571
- GeneratorTranslator gtran = new GeneratorTranslator (funcRoot );
1572
- funcDef = GeneratorFunctionDefinitionNode .create (funcname , null , core , arity , defaults , gtran .translate (), fd ,
1573
+ GeneratorTranslator gtran = new GeneratorTranslator (funcRoot , false );
1574
+ RootCallTarget callTarget = gtran .translate ();
1575
+ funcDef = GeneratorFunctionDefinitionNode .create (funcname , null , core , arity , defaults , callTarget , fd ,
1573
1576
environment .getDefinitionCellSlots (), environment .getExecutionCellSlots (),
1574
1577
gtran .getNumOfActiveFlags (), gtran .getNumOfGeneratorBlockNode (), gtran .getNumOfGeneratorForNode ());
1575
1578
} else {
@@ -1740,11 +1743,19 @@ public Object visitTestlist_comp(Python3Parser.Testlist_compContext ctx) {
1740
1743
}
1741
1744
}
1742
1745
1743
- private ForNode createGeneratorExpression (Python3Parser .Comp_forContext comp_for , PNode yield ) {
1746
+ private PNode createGeneratorExpression (Python3Parser .Comp_forContext comp_for , PNode yield ) {
1747
+ return createGeneratorExpression (comp_for , yield , true );
1748
+ }
1749
+
1750
+ private PNode createGeneratorExpression (Python3Parser .Comp_forContext comp_for , PNode yield , boolean iteratorInParentScope ) {
1744
1751
// TODO: async
1745
- environment .pushCurentScope ();
1752
+ if (iteratorInParentScope ) {
1753
+ environment .pushCurentScope ();
1754
+ }
1746
1755
PNode iterator = asBlockOrPNode (comp_for .or_test ().accept (this ));
1747
- environment .popCurrentScope ();
1756
+ if (iteratorInParentScope ) {
1757
+ environment .popCurrentScope ();
1758
+ }
1748
1759
1749
1760
PNode targets = assigns .translate (comp_for .exprlist ());
1750
1761
PNode myBody = yield ;
@@ -1760,12 +1771,12 @@ private ForNode createGeneratorExpression(Python3Parser.Comp_forContext comp_for
1760
1771
comp_iter = comp_iter .comp_if ().comp_iter ();
1761
1772
}
1762
1773
if (comp_iter != null && comp_iter .comp_for () != null ) {
1763
- myBody = createGeneratorExpression (comp_iter .comp_for (), yield );
1774
+ myBody = createGeneratorExpression (comp_iter .comp_for (), yield , false );
1764
1775
}
1765
1776
if (condition != null ) {
1766
1777
myBody = factory .createIf (factory .createYesNode (condition ), myBody , EmptyNode .create ());
1767
1778
}
1768
- ForNode loop = createForInScope (targets , iterator , myBody );
1779
+ LoopNode loop = createForInScope (targets , iterator , myBody );
1769
1780
deriveSourceSection (comp_for , loop );
1770
1781
return loop ;
1771
1782
}
0 commit comments