Skip to content

Commit 85c47d5

Browse files
committed
Pass generator slot indexes in an object
1 parent 5c1378b commit 85c47d5

22 files changed

+295
-257
lines changed

graalpython/com.oracle.graal.python.test/src/com/oracle/graal/python/test/parser/ParserTreePrinter.java

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@
4141

4242
package com.oracle.graal.python.test.parser;
4343

44+
import java.util.Set;
45+
4446
import com.oracle.graal.python.builtins.objects.function.Signature;
4547
import com.oracle.graal.python.nodes.ModuleRootNode;
4648
import com.oracle.graal.python.nodes.PClosureFunctionRootNode;
@@ -74,14 +76,14 @@
7476
import com.oracle.graal.python.nodes.statement.ImportFromNode;
7577
import com.oracle.graal.python.nodes.statement.ImportNode;
7678
import com.oracle.graal.python.parser.ExecutionCellSlots;
79+
import com.oracle.graal.python.parser.GeneratorInfo;
7780
import com.oracle.graal.python.runtime.ExecutionContext;
7881
import com.oracle.truffle.api.frame.FrameDescriptor;
7982
import com.oracle.truffle.api.frame.FrameSlot;
8083
import com.oracle.truffle.api.nodes.Node;
8184
import com.oracle.truffle.api.nodes.NodeVisitor;
8285
import com.oracle.truffle.api.nodes.RootNode;
8386
import com.oracle.truffle.api.source.SourceSection;
84-
import java.util.Set;
8587

8688
public class ParserTreePrinter implements NodeVisitor {
8789
private final int MAX_TEXT_LENGTH = 20;
@@ -195,13 +197,14 @@ public boolean visit(GeneratorFunctionDefinitionNode node) {
195197
level++;
196198
addFrameDescriptor(node.getFrameDescriptor());
197199
indent(level);
198-
sb.append("Active Flags: ").append(node.getNumOfActiveFlags());
200+
GeneratorInfo generatorInfo = node.getGeneratorInfo();
201+
sb.append("Active Flags: ").append(generatorInfo.getNumOfActiveFlags());
199202
newLine();
200203
indent(level);
201-
sb.append("For Nodes: ").append(node.getNumOfGeneratorForNode());
204+
sb.append("For Nodes: ").append(generatorInfo.getNumOfIteratorSlots());
202205
newLine();
203206
indent(level);
204-
sb.append("Block Nodes: ").append(node.getNumOfGeneratorBlockNode());
207+
sb.append("Block Nodes: ").append(generatorInfo.getNumOfBlockNodes());
205208
newLine();
206209
addFunctionDefinitionNode(node);
207210
level--;
@@ -350,13 +353,14 @@ public boolean visit(GeneratorExpressionNode node) {
350353
addFrameDescriptor(node.getEnclosingFrameDescriptor());
351354
level--;
352355
indent(level);
353-
sb.append("Active Flags: ").append(node.getNumOfActiveFlags());
356+
GeneratorInfo generatorInfo = node.getGeneratorInfo();
357+
sb.append("Active Flags: ").append(generatorInfo.getNumOfActiveFlags());
354358
newLine();
355359
indent(level);
356-
sb.append("For Nodes: ").append(node.getNumOfGeneratorForNode());
360+
sb.append("For Nodes: ").append(generatorInfo.getNumOfIteratorSlots());
357361
newLine();
358362
indent(level);
359-
sb.append("Block Nodes: ").append(node.getNumOfGeneratorBlockNode());
363+
sb.append("Block Nodes: ").append(generatorInfo.getNumOfBlockNodes());
360364
newLine();
361365
indent(level);
362366
sb.append("Is Enclosing Frame Generator: ").append(node.isEnclosingFrameGenerator());

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/generator/GeneratorControlData.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
*/
2626
package com.oracle.graal.python.builtins.objects.generator;
2727

28+
import com.oracle.graal.python.parser.GeneratorInfo;
2829
import com.oracle.graal.python.runtime.exception.PException;
2930

3031
public final class GeneratorControlData {
@@ -38,11 +39,11 @@ public final class GeneratorControlData {
3839
private final PException[] activeExceptions;
3940
private int lastYieldIndex;
4041

41-
public GeneratorControlData(int numOfActiveFlags, int numOfGeneratorBlockNode, int numOfGeneratorForNode, int numOfTryNode) {
42-
this.activeFlags = new boolean[numOfActiveFlags];
43-
this.blockNodeIndices = new int[numOfGeneratorBlockNode];
44-
this.forNodeIterators = new Object[numOfGeneratorForNode];
45-
this.activeExceptions = new PException[numOfTryNode];
42+
public GeneratorControlData(GeneratorInfo generatorInfo) {
43+
this.activeFlags = new boolean[generatorInfo.getNumOfActiveFlags()];
44+
this.blockNodeIndices = new int[generatorInfo.getNumOfBlockNodes()];
45+
this.forNodeIterators = new Object[generatorInfo.getNumOfIteratorSlots()];
46+
this.activeExceptions = new PException[generatorInfo.getNumOfExceptionSlots()];
4647
}
4748

4849
public int getLastYieldIndex() {

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/generator/PGenerator.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import com.oracle.graal.python.builtins.objects.iterator.PRangeIterator;
3434
import com.oracle.graal.python.builtins.objects.object.PythonBuiltinObject;
3535
import com.oracle.graal.python.parser.ExecutionCellSlots;
36+
import com.oracle.graal.python.parser.GeneratorInfo;
3637
import com.oracle.graal.python.runtime.object.PythonObjectFactory;
3738
import com.oracle.truffle.api.Assumption;
3839
import com.oracle.truffle.api.CompilerAsserts;
@@ -69,12 +70,12 @@ public final class PGenerator extends PythonBuiltinObject {
6970
private boolean running;
7071

7172
public static PGenerator create(String name, String qualname, RootCallTarget[] callTargets, FrameDescriptor frameDescriptor, Object[] arguments, PCell[] closure,
72-
ExecutionCellSlots cellSlots, int numOfActiveFlags, int numOfGeneratorBlockNode, int numOfGeneratorForNode, int numOfGeneratorTryNode, PythonObjectFactory factory,
73+
ExecutionCellSlots cellSlots, GeneratorInfo generatorInfo, PythonObjectFactory factory,
7374
Object iterator) {
7475
/*
7576
* Setting up the persistent frame in {@link #arguments}.
7677
*/
77-
GeneratorControlData generatorArgs = new GeneratorControlData(numOfActiveFlags, numOfGeneratorBlockNode, numOfGeneratorForNode, numOfGeneratorTryNode);
78+
GeneratorControlData generatorArgs = new GeneratorControlData(generatorInfo);
7879
Object[] generatorFrameArguments = PArguments.create();
7980
MaterializedFrame generatorFrame = Truffle.getRuntime().createMaterializedFrame(generatorFrameArguments, frameDescriptor);
8081
PArguments.setGeneratorFrame(arguments, generatorFrame);

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/NodeFactory.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@
104104
import com.oracle.graal.python.nodes.subscript.GetItemNode;
105105
import com.oracle.graal.python.nodes.subscript.SliceLiteralNode;
106106
import com.oracle.graal.python.parser.ExecutionCellSlots;
107+
import com.oracle.graal.python.parser.GeneratorInfo;
107108
import com.oracle.truffle.api.frame.FrameDescriptor;
108109
import com.oracle.truffle.api.frame.FrameSlot;
109110
import com.oracle.truffle.api.nodes.Node;
@@ -209,12 +210,12 @@ public StatementNode createBreakTarget(StatementNode forNode, StatementNode orel
209210
return new BreakTargetNode(forNode, orelse);
210211
}
211212

212-
public YieldNode createYield(ExpressionNode right) {
213-
return new YieldNode(right);
213+
public YieldNode createYield(ExpressionNode right, GeneratorInfo.Mutable generatorInfo) {
214+
return new YieldNode(right, generatorInfo);
214215
}
215216

216-
public YieldFromNode createYieldFrom(ExpressionNode right) {
217-
return new YieldFromNode(right);
217+
public YieldFromNode createYieldFrom(ExpressionNode right, GeneratorInfo.Mutable generatorInfo) {
218+
return new YieldFromNode(right, generatorInfo);
218219
}
219220

220221
public ExpressionNode createIntegerLiteral(int value) {

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/function/GeneratorExpressionNode.java

Lines changed: 7 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -31,45 +31,37 @@
3131
import com.oracle.graal.python.nodes.generator.GeneratorFunctionRootNode;
3232
import com.oracle.graal.python.parser.DefinitionCellSlots;
3333
import com.oracle.graal.python.parser.ExecutionCellSlots;
34+
import com.oracle.graal.python.parser.GeneratorInfo;
3435
import com.oracle.graal.python.runtime.exception.PException;
3536
import com.oracle.graal.python.runtime.object.PythonObjectFactory;
3637
import com.oracle.truffle.api.CompilerAsserts;
3738
import com.oracle.truffle.api.CompilerDirectives.CompilationFinal;
3839
import com.oracle.truffle.api.RootCallTarget;
3940
import com.oracle.truffle.api.frame.FrameDescriptor;
4041
import com.oracle.truffle.api.frame.VirtualFrame;
41-
import com.oracle.truffle.api.nodes.RootNode;
4242

4343
public final class GeneratorExpressionNode extends ExpressionDefinitionNode {
4444
private final String name;
4545
private final String qualname;
4646
private final RootCallTarget callTarget;
4747
@CompilationFinal(dimensions = 1) private RootCallTarget[] callTargets;
4848
private final FrameDescriptor frameDescriptor;
49-
private final int numOfActiveFlags;
50-
private final int numOfGeneratorBlockNode;
51-
private final int numOfGeneratorForNode;
52-
private final int numOfGeneratorTryNode;
49+
private final GeneratorInfo generatorInfo;
5350

5451
@CompilationFinal private FrameDescriptor enclosingFrameDescriptor;
5552
@CompilationFinal private boolean isEnclosingFrameGenerator;
56-
@CompilationFinal private boolean isOptimized;
5753
@Child private ExpressionNode getIterator;
5854
@Child private PythonObjectFactory factory = PythonObjectFactory.create();
5955

6056
public GeneratorExpressionNode(String name, String qualname, RootCallTarget callTarget, ExpressionNode getIterator, FrameDescriptor descriptor, DefinitionCellSlots definitionCellSlots,
61-
ExecutionCellSlots executionCellSlots,
62-
int numOfActiveFlags, int numOfGeneratorBlockNode, int numOfGeneratorForNode, int numOfGeneratorTryNode) {
57+
ExecutionCellSlots executionCellSlots, GeneratorInfo generatorInfo) {
6358
super(definitionCellSlots, executionCellSlots);
6459
this.name = name;
6560
this.qualname = qualname;
6661
this.callTarget = callTarget;
6762
this.getIterator = getIterator;
6863
this.frameDescriptor = descriptor;
69-
this.numOfActiveFlags = numOfActiveFlags;
70-
this.numOfGeneratorBlockNode = numOfGeneratorBlockNode;
71-
this.numOfGeneratorForNode = numOfGeneratorForNode;
72-
this.numOfGeneratorTryNode = numOfGeneratorTryNode;
64+
this.generatorInfo = generatorInfo;
7365
}
7466

7567
public String getName() {
@@ -101,32 +93,8 @@ public void setEnclosingFrameGenerator(boolean value) {
10193
isEnclosingFrameGenerator = value;
10294
}
10395

104-
public boolean isOptimized() {
105-
return isOptimized;
106-
}
107-
108-
public void setAsOptimized() {
109-
isOptimized = true;
110-
}
111-
112-
public int getNumOfActiveFlags() {
113-
return numOfActiveFlags;
114-
}
115-
116-
public int getNumOfGeneratorBlockNode() {
117-
return numOfGeneratorBlockNode;
118-
}
119-
120-
public int getNumOfGeneratorForNode() {
121-
return numOfGeneratorForNode;
122-
}
123-
124-
public int getNumOfGeneratorTryNode() {
125-
return numOfGeneratorTryNode;
126-
}
127-
128-
public RootNode getFunctionRootNode() {
129-
return callTarget.getRootNode();
96+
public GeneratorInfo getGeneratorInfo() {
97+
return generatorInfo;
13098
}
13199

132100
@Override
@@ -151,7 +119,7 @@ public Object execute(VirtualFrame frame) {
151119

152120
PCell[] closure = getClosureFromGeneratorOrFunctionLocals(frame);
153121
return factory.createGenerator(name, qualname, callTargets, frameDescriptor, arguments, closure, executionCellSlots,
154-
numOfActiveFlags, numOfGeneratorBlockNode, numOfGeneratorForNode, numOfGeneratorTryNode, iterator);
122+
generatorInfo, iterator);
155123
}
156124

157125
@Override

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/function/GeneratorFunctionDefinitionNode.java

Lines changed: 11 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import com.oracle.graal.python.nodes.generator.GeneratorFunctionRootNode;
3939
import com.oracle.graal.python.parser.DefinitionCellSlots;
4040
import com.oracle.graal.python.parser.ExecutionCellSlots;
41+
import com.oracle.graal.python.parser.GeneratorInfo;
4142
import com.oracle.graal.python.runtime.PythonContext;
4243
import com.oracle.truffle.api.CompilerAsserts;
4344
import com.oracle.truffle.api.CompilerDirectives;
@@ -49,32 +50,25 @@
4950
import com.oracle.truffle.api.nodes.ExplodeLoop;
5051

5152
public class GeneratorFunctionDefinitionNode extends FunctionDefinitionNode {
52-
protected final int numOfActiveFlags;
53-
protected final int numOfGeneratorBlockNode;
54-
protected final int numOfGeneratorForNode;
55-
protected final int numOfGeneratorTryNode;
53+
protected final GeneratorInfo generatorInfo;
5654
protected final FrameDescriptor frameDescriptor;
5755

5856
@CompilationFinal private RootCallTarget generatorCallTarget;
5957
@CompilationFinal private PCode generatorCode;
6058

6159
public GeneratorFunctionDefinitionNode(String name, String qualname, String enclosingClassName, ExpressionNode doc, ExpressionNode[] defaults, KwDefaultExpressionNode[] kwDefaults,
62-
RootCallTarget callTarget, FrameDescriptor frameDescriptor, DefinitionCellSlots definitionCellSlots, ExecutionCellSlots executionCellSlots, int numOfActiveFlags,
63-
int numOfGeneratorBlockNode, int numOfGeneratorForNode, int numOfGeneratorTryNode, Map<String, ExpressionNode> annotations) {
60+
RootCallTarget callTarget, FrameDescriptor frameDescriptor, DefinitionCellSlots definitionCellSlots, ExecutionCellSlots executionCellSlots, GeneratorInfo generatorInfo,
61+
Map<String, ExpressionNode> annotations) {
6462
super(name, qualname, enclosingClassName, doc, defaults, kwDefaults, callTarget, definitionCellSlots, executionCellSlots, annotations);
6563
this.frameDescriptor = frameDescriptor;
66-
this.numOfActiveFlags = numOfActiveFlags;
67-
this.numOfGeneratorBlockNode = numOfGeneratorBlockNode;
68-
this.numOfGeneratorForNode = numOfGeneratorForNode;
69-
this.numOfGeneratorTryNode = numOfGeneratorTryNode;
64+
this.generatorInfo = generatorInfo;
7065
}
7166

7267
public static GeneratorFunctionDefinitionNode create(String name, String qualname, String enclosingClassName, ExpressionNode doc, ExpressionNode[] defaults, KwDefaultExpressionNode[] kwDefaults,
73-
RootCallTarget callTarget, FrameDescriptor frameDescriptor, DefinitionCellSlots definitionCellSlots, ExecutionCellSlots executionCellSlots, int numOfActiveFlags,
74-
int numOfGeneratorBlockNode, int numOfGeneratorForNode, int numOfGeneratorTryNode, Map<String, ExpressionNode> annotations) {
68+
RootCallTarget callTarget, FrameDescriptor frameDescriptor, DefinitionCellSlots definitionCellSlots, ExecutionCellSlots executionCellSlots, GeneratorInfo generatorInfo,
69+
Map<String, ExpressionNode> annotations) {
7570
return new GeneratorFunctionDefinitionNode(name, qualname, enclosingClassName, doc, defaults, kwDefaults, callTarget,
76-
frameDescriptor, definitionCellSlots, executionCellSlots,
77-
numOfActiveFlags, numOfGeneratorBlockNode, numOfGeneratorForNode, numOfGeneratorTryNode, annotations);
71+
frameDescriptor, definitionCellSlots, executionCellSlots, generatorInfo, annotations);
7872
}
7973

8074
@Override
@@ -105,7 +99,7 @@ public GeneratorFunctionRootNode getGeneratorFunctionRootNode(PythonContext ctx)
10599
// TODO msimacek: the name/qualname passing is not entirely correct, it can change later
106100
// and the change should be reflected on the created generators
107101
return new GeneratorFunctionRootNode(ctx.getLanguage(), callTarget, functionName, qualname, frameDescriptor,
108-
executionCellSlots, ((PRootNode) callTarget.getRootNode()).getSignature(), numOfActiveFlags, numOfGeneratorBlockNode, numOfGeneratorForNode, numOfGeneratorTryNode);
102+
executionCellSlots, ((PRootNode) callTarget.getRootNode()).getSignature(), generatorInfo);
109103
}
110104
return (GeneratorFunctionRootNode) generatorCallTarget.getRootNode();
111105
}
@@ -128,16 +122,8 @@ protected PCode getGeneratorCode() {
128122
}
129123
}
130124

131-
public int getNumOfActiveFlags() {
132-
return numOfActiveFlags;
133-
}
134-
135-
public int getNumOfGeneratorBlockNode() {
136-
return numOfGeneratorBlockNode;
137-
}
138-
139-
public int getNumOfGeneratorForNode() {
140-
return numOfGeneratorForNode;
125+
public GeneratorInfo getGeneratorInfo() {
126+
return generatorInfo;
141127
}
142128

143129
public FrameDescriptor getFrameDescriptor() {

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/generator/AbstractYieldNode.java

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2018, 2019, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2018, 2020, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* The Universal Permissive License (UPL), Version 1.0
@@ -40,34 +40,31 @@
4040
*/
4141
package com.oracle.graal.python.nodes.generator;
4242

43+
import java.util.List;
44+
4345
import com.oracle.graal.python.nodes.expression.ExpressionNode;
44-
import com.oracle.truffle.api.CompilerDirectives.CompilationFinal;
46+
import com.oracle.graal.python.parser.GeneratorInfo;
4547
import com.oracle.truffle.api.profiles.BranchProfile;
4648

4749
public abstract class AbstractYieldNode extends ExpressionNode {
48-
@CompilationFinal protected int flagSlot;
49-
@CompilationFinal protected int yieldIndex;
50+
protected final int flagSlot;
51+
protected final int yieldIndex;
5052

5153
protected final BranchProfile gotException = BranchProfile.create();
5254
protected final BranchProfile gotValue = BranchProfile.create();
5355
protected final BranchProfile gotNothing = BranchProfile.create();
5456

55-
public void setFlagSlot(int slot) {
56-
this.flagSlot = slot;
57-
}
58-
5957
public int getFlagSlot() {
6058
return flagSlot;
6159
}
6260

63-
public void setIndex(int idx) {
64-
assert yieldIndex == 0;
65-
assert idx != 0;
66-
yieldIndex = idx;
67-
}
68-
69-
public AbstractYieldNode() {
70-
super();
61+
public AbstractYieldNode(GeneratorInfo.Mutable generatorInfo) {
62+
this.flagSlot = generatorInfo.nextActiveFlagIndex();
63+
List<AbstractYieldNode> yieldNodes = generatorInfo.getYieldNodes();
64+
yieldNodes.add(this);
65+
// It is intentionally offset by 1 because the index is used to address call target array
66+
// where the first element is the function start and yields start from 1 on
67+
this.yieldIndex = yieldNodes.size();
7168
}
7269

7370
}

0 commit comments

Comments
 (0)