Skip to content

Commit 609c221

Browse files
committed
Improve gi_frame.f_lineno
1 parent 66c21e5 commit 609c221

File tree

2 files changed

+18
-4
lines changed

2 files changed

+18
-4
lines changed

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -528,8 +528,10 @@ static Object getFrame(PGenerator self,
528528
MaterializedFrame generatorFrame = PArguments.getGeneratorFrame(self.getArguments());
529529
PDict locals = PArguments.getGeneratorFrameLocals(generatorFrame);
530530
Object[] arguments = PArguments.create();
531-
// TODO msimacek - this way, the generator will always have lineno == 1
532-
Node location = self.getCurrentCallTarget().getRootNode();
531+
Node location = self.getCurrentYieldNode();
532+
if (location == null) {
533+
location = self.getCurrentCallTarget().getRootNode();
534+
}
533535
PFrame frame = factory.createPFrame(PFrame.Reference.EMPTY, location, locals, false);
534536
PArguments.setGlobals(arguments, PArguments.getGlobals(self.getArguments()));
535537
PArguments.setClosure(arguments, PArguments.getClosure(self.getArguments()));

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

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import com.oracle.graal.python.builtins.objects.function.PArguments;
3333
import com.oracle.graal.python.builtins.objects.iterator.PRangeIterator;
3434
import com.oracle.graal.python.builtins.objects.object.PythonBuiltinObject;
35+
import com.oracle.graal.python.nodes.generator.AbstractYieldNode;
3536
import com.oracle.graal.python.parser.ExecutionCellSlots;
3637
import com.oracle.graal.python.parser.GeneratorInfo;
3738
import com.oracle.graal.python.runtime.object.PythonObjectFactory;
@@ -66,6 +67,7 @@ public final class PGenerator extends PythonBuiltinObject {
6667
private int currentCallTarget;
6768
private final Object iterator;
6869
private final boolean isPRangeIterator;
70+
private final GeneratorInfo generatorInfo;
6971
// running means it is currently on the stack, not just started
7072
private boolean running;
7173

@@ -97,7 +99,7 @@ public static PGenerator create(String name, String qualname, RootCallTarget[] c
9799
}
98100
assignCells(generatorFrame, cellVarSlots, cellVarAssumptions);
99101
PArguments.setGeneratorFrameLocals(generatorFrameArguments, factory.createDictLocals(generatorFrame));
100-
return new PGenerator(name, qualname, callTargets, frameDescriptor, arguments, closure, iterator);
102+
return new PGenerator(name, qualname, callTargets, generatorInfo, frameDescriptor, arguments, closure, iterator);
101103
}
102104

103105
@ExplodeLoop
@@ -116,11 +118,12 @@ private static void assignClosure(PCell[] closure, MaterializedFrame generatorFr
116118
}
117119
}
118120

119-
private PGenerator(String name, String qualname, RootCallTarget[] callTargets, FrameDescriptor frameDescriptor, Object[] arguments, PCell[] closure, Object iterator) {
121+
private PGenerator(String name, String qualname, RootCallTarget[] callTargets, GeneratorInfo generatorInfo, FrameDescriptor frameDescriptor, Object[] arguments, PCell[] closure, Object iterator) {
120122
super(PythonBuiltinClassType.PGenerator, PythonBuiltinClassType.PGenerator.newInstance());
121123
this.name = name;
122124
this.qualname = qualname;
123125
this.callTargets = callTargets;
126+
this.generatorInfo = generatorInfo;
124127
this.currentCallTarget = 0;
125128
this.frameDescriptor = frameDescriptor;
126129
this.arguments = arguments;
@@ -147,6 +150,15 @@ public RootCallTarget getCurrentCallTarget() {
147150
return callTargets[currentCallTarget];
148151
}
149152

153+
public AbstractYieldNode getCurrentYieldNode() {
154+
if (currentCallTarget == 0 || running || finished) {
155+
// Not stopped on a yield
156+
return null;
157+
}
158+
// Call target indices are yield indices + 1, see AbstractYieldNode
159+
return generatorInfo.getYieldNodes()[currentCallTarget - 1];
160+
}
161+
150162
public boolean isStarted() {
151163
return currentCallTarget != 0 && !running;
152164
}

0 commit comments

Comments
 (0)