Skip to content

Commit 5d54794

Browse files
committed
Improve generator inspection
1 parent feca4d6 commit 5d54794

File tree

5 files changed

+28
-8
lines changed

5 files changed

+28
-8
lines changed

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

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -563,9 +563,14 @@ static Object getFrame(PGenerator self,
563563
MaterializedFrame generatorFrame = PArguments.getGeneratorFrame(self.getArguments());
564564
PDict locals = PArguments.getGeneratorFrameLocals(generatorFrame);
565565
Object[] arguments = PArguments.create();
566-
Node location = self.getCurrentYieldNode();
567-
if (location == null) {
568-
location = self.getCurrentCallTarget().getRootNode();
566+
Node location;
567+
if (self.usesBytecode()) {
568+
location = ((PBytecodeRootNode.FrameInfo) generatorFrame.getFrameDescriptor().getInfo()).getRootNode();
569+
} else {
570+
location = self.getCurrentYieldNode();
571+
if (location == null) {
572+
location = self.getCurrentCallTarget().getRootNode();
573+
}
569574
}
570575
PFrame frame = factory.createPFrame(PFrame.Reference.EMPTY, location, locals);
571576
PArguments.setGlobals(arguments, PArguments.getGlobals(self.getArguments()));

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,9 @@ public Object getYieldFrom() {
211211
}
212212
return null;
213213
} else {
214+
if (running) {
215+
return null;
216+
}
214217
return frameInfo.getYieldFrom(PArguments.getGeneratorFrame(arguments));
215218
}
216219
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/traceback/LazyTraceback.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444

4545
import com.oracle.graal.python.builtins.objects.frame.PFrame;
4646
import com.oracle.graal.python.builtins.objects.function.PArguments;
47+
import com.oracle.graal.python.nodes.bytecode.PBytecodeGeneratorRootNode;
4748
import com.oracle.graal.python.nodes.bytecode.PBytecodeRootNode;
4849
import com.oracle.graal.python.runtime.exception.PException;
4950
import com.oracle.truffle.api.CompilerDirectives;
@@ -144,7 +145,8 @@ public static boolean elementWantedForTraceback(TruffleStackTraceElement element
144145
Frame frame = element.getFrame();
145146
// only include frames of non-builtin python functions
146147
RootNode rootNode = element.getTarget().getRootNode();
147-
return PArguments.isPythonFrame(frame) && locationWantedForTraceback(rootNode instanceof PBytecodeRootNode ? rootNode : element.getLocation());
148+
return PArguments.isPythonFrame(frame) &&
149+
locationWantedForTraceback(rootNode instanceof PBytecodeRootNode || rootNode instanceof PBytecodeGeneratorRootNode ? rootNode : element.getLocation());
148150
}
149151

150152
public boolean catchingFrameWantedForTraceback() {

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/traceback/TracebackBuiltins.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
import com.oracle.graal.python.builtins.objects.frame.PFrame;
4444
import com.oracle.graal.python.builtins.objects.frame.PFrame.Reference;
4545
import com.oracle.graal.python.builtins.objects.function.PArguments;
46+
import com.oracle.graal.python.nodes.bytecode.PBytecodeGeneratorRootNode;
4647
import com.oracle.graal.python.nodes.bytecode.PBytecodeRootNode;
4748
import com.oracle.graal.python.nodes.frame.MaterializeFrameNode;
4849
import com.oracle.graal.python.nodes.frame.ReadCallerFrameNode;
@@ -61,6 +62,7 @@
6162
import com.oracle.truffle.api.dsl.Specialization;
6263
import com.oracle.truffle.api.frame.VirtualFrame;
6364
import com.oracle.truffle.api.nodes.Node;
65+
import com.oracle.truffle.api.nodes.RootNode;
6466
import com.oracle.truffle.api.profiles.ConditionProfile;
6567
import com.oracle.truffle.api.profiles.LoopConditionProfile;
6668
import com.oracle.truffle.api.source.SourceSection;
@@ -209,8 +211,9 @@ private static int getLineno(TruffleStackTraceElement element) {
209211

210212
private static PFrame materializeFrame(TruffleStackTraceElement element, MaterializeFrameNode materializeFrameNode) {
211213
Node location = element.getLocation();
212-
if (element.getTarget().getRootNode() instanceof PBytecodeRootNode) {
213-
location = element.getTarget().getRootNode();
214+
RootNode rootNode = element.getTarget().getRootNode();
215+
if (rootNode instanceof PBytecodeRootNode || rootNode instanceof PBytecodeGeneratorRootNode) {
216+
location = rootNode;
214217
}
215218
// create the PFrame and refresh frame values
216219
return materializeFrameNode.execute(null, location, false, true, element.getFrame());

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

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -768,7 +768,8 @@ public void createGeneratorFrame(Object[] arguments) {
768768
PArguments.setCallerFrameInfo(arguments, null);
769769
PArguments.setControlData(arguments, GENERATOR_CONTROL_DATA);
770770
PArguments.setGeneratorFrameLocals(generatorFrameArguments, factory.createDictLocals(generatorFrame));
771-
generatorFrame.setInt(bcioffset, 0);
771+
// This is just for inspection, unstarted generators should have bci == -1
772+
generatorFrame.setInt(bcioffset, -1);
772773
generatorFrame.setInt(generatorStackTopOffset, stackoffset - 1);
773774
copyArgsAndCells(generatorFrame, arguments);
774775
}
@@ -1458,7 +1459,13 @@ Object executeFromBci(VirtualFrame virtualFrame, int initialBci, int initialStac
14581459
ExceptionHandlingStatementNode.chainExceptions(pe.getUnreifiedException(), exceptionState, exceptionChainProfile1, exceptionChainProfile2);
14591460
}
14601461
if (newTarget == -1) {
1461-
localFrame.setInt(bcioffset, beginBci);
1462+
// For tracebacks
1463+
virtualFrame.setInt(bcioffset, beginBci);
1464+
if (isGeneratorOrCoroutine) {
1465+
// For generator inspection
1466+
localFrame.setInt(bcioffset, beginBci);
1467+
localFrame.setInt(generatorStackTopOffset, stackTop);
1468+
}
14621469
if (CompilerDirectives.inInterpreter() && loopCount > 0) {
14631470
LoopNode.reportLoopCount(this, loopCount);
14641471
}

0 commit comments

Comments
 (0)