Skip to content

Commit df29c2d

Browse files
committed
Fix generator code introspection
1 parent caeb0d6 commit df29c2d

File tree

5 files changed

+30
-14
lines changed

5 files changed

+30
-14
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/code/PCode.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,12 +54,13 @@
5454
import com.oracle.graal.python.builtins.objects.str.StringUtils;
5555
import com.oracle.graal.python.builtins.objects.tuple.PTuple;
5656
import com.oracle.graal.python.nodes.ModuleRootNode;
57-
import com.oracle.graal.python.nodes.bytecode.PBytecodeRootNode;
5857
import com.oracle.graal.python.nodes.PClosureFunctionRootNode;
5958
import com.oracle.graal.python.nodes.PClosureRootNode;
6059
import com.oracle.graal.python.nodes.PRootNode;
6160
import com.oracle.graal.python.nodes.argument.ReadVarArgsNode;
6261
import com.oracle.graal.python.nodes.argument.ReadVarKeywordsNode;
62+
import com.oracle.graal.python.nodes.bytecode.PBytecodeGeneratorFunctionRootNode;
63+
import com.oracle.graal.python.nodes.bytecode.PBytecodeRootNode;
6364
import com.oracle.graal.python.nodes.expression.ExpressionNode;
6465
import com.oracle.graal.python.nodes.frame.GlobalNode;
6566
import com.oracle.graal.python.nodes.frame.PythonFrame;
@@ -359,7 +360,13 @@ public boolean visit(Node node) {
359360
}
360361

361362
private static RootNode rootNodeForExtraction(RootNode rootNode) {
362-
return (rootNode instanceof GeneratorFunctionRootNode) ? ((GeneratorFunctionRootNode) rootNode).getFunctionRootNode() : rootNode;
363+
if (rootNode instanceof GeneratorFunctionRootNode) {
364+
return ((GeneratorFunctionRootNode) rootNode).getFunctionRootNode();
365+
}
366+
if (rootNode instanceof PBytecodeGeneratorFunctionRootNode) {
367+
return ((PBytecodeGeneratorFunctionRootNode) rootNode).getBytecodeRootNode();
368+
}
369+
return rootNode;
363370
}
364371

365372
@TruffleBoundary

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

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@
4646
import com.oracle.graal.python.builtins.PythonBuiltins;
4747
import com.oracle.graal.python.builtins.modules.BuiltinFunctions;
4848
import com.oracle.graal.python.builtins.objects.PNone;
49-
import com.oracle.graal.python.builtins.objects.code.PCode;
5049
import com.oracle.graal.python.builtins.objects.common.SequenceNodes.GetObjectArrayNode;
5150
import com.oracle.graal.python.builtins.objects.dict.PDict;
5251
import com.oracle.graal.python.builtins.objects.exception.PBaseException;
@@ -572,12 +571,7 @@ public abstract static class GetCodeNode extends PythonUnaryBuiltinNode {
572571
@Specialization
573572
Object getCode(PGenerator self,
574573
@Cached ConditionProfile hasCodeProfile) {
575-
PCode code = self.getCode();
576-
if (hasCodeProfile.profile(code == null)) {
577-
code = factory().createCode(self.getCurrentCallTarget());
578-
self.setCode(code);
579-
}
580-
return code;
574+
return self.getOrCreateCode(hasCodeProfile, factory());
581575
}
582576
}
583577

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

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
import com.oracle.truffle.api.frame.MaterializedFrame;
5454
import com.oracle.truffle.api.library.ExportMessage;
5555
import com.oracle.truffle.api.nodes.ExplodeLoop;
56+
import com.oracle.truffle.api.profiles.ConditionProfile;
5657

5758
public final class PGenerator extends PythonBuiltinObject {
5859

@@ -276,14 +277,19 @@ public String toString() {
276277
return "<generator object " + name + " at " + hashCode() + ">";
277278
}
278279

279-
public PCode getCode() {
280+
public PCode getOrCreateCode(ConditionProfile hasCodeProfile, PythonObjectFactory factory) {
281+
if (hasCodeProfile.profile(code == null)) {
282+
RootCallTarget callTarget;
283+
if (usesBytecode()) {
284+
callTarget = bytecodeRootNode.getCallTarget();
285+
} else {
286+
callTarget = callTargets[0];
287+
}
288+
code = factory.createCode(callTarget);
289+
}
280290
return code;
281291
}
282292

283-
public void setCode(PCode code) {
284-
this.code = code;
285-
}
286-
287293
public boolean isRunning() {
288294
return running;
289295
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/bytecode/PBytecodeGeneratorFunctionRootNode.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,4 +107,8 @@ public boolean isPythonInternal() {
107107
public SourceSection getSourceSection() {
108108
return rootNode.getSourceSection();
109109
}
110+
111+
public PBytecodeRootNode getBytecodeRootNode() {
112+
return rootNode;
113+
}
110114
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/object/IsNode.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
import com.oracle.graal.python.builtins.objects.str.PString;
5555
import com.oracle.graal.python.builtins.objects.str.StringNodes;
5656
import com.oracle.graal.python.builtins.objects.type.PythonBuiltinClass;
57+
import com.oracle.graal.python.nodes.bytecode.PBytecodeGeneratorFunctionRootNode;
5758
import com.oracle.graal.python.nodes.expression.BinaryOp;
5859
import com.oracle.graal.python.nodes.generator.GeneratorFunctionRootNode;
5960
import com.oracle.graal.python.runtime.PythonContext;
@@ -218,9 +219,13 @@ static boolean doCode(PCode left, PCode right,
218219
RootNode rightRootNode = rightCt.getRootNode();
219220
if (leftRootNode instanceof GeneratorFunctionRootNode) {
220221
leftRootNode = ((GeneratorFunctionRootNode) leftRootNode).getFunctionRootNode();
222+
} else if (leftRootNode instanceof PBytecodeGeneratorFunctionRootNode) {
223+
leftRootNode = ((PBytecodeGeneratorFunctionRootNode) leftRootNode).getBytecodeRootNode();
221224
}
222225
if (rightRootNode instanceof GeneratorFunctionRootNode) {
223226
rightRootNode = ((GeneratorFunctionRootNode) rightRootNode).getFunctionRootNode();
227+
} else if (rightRootNode instanceof PBytecodeGeneratorFunctionRootNode) {
228+
rightRootNode = ((PBytecodeGeneratorFunctionRootNode) rightRootNode).getBytecodeRootNode();
224229
}
225230
return leftRootNode == rightRootNode;
226231
} else {

0 commit comments

Comments
 (0)