Skip to content

Commit 92b66d8

Browse files
committed
Correctly create traceback from Truffle stack trace at the top level.
1 parent 0c42b4f commit 92b66d8

File tree

3 files changed

+14
-10
lines changed

3 files changed

+14
-10
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/exception/PBaseException.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,7 @@ public void reifyException(PFrame pyFrame, PythonObjectFactory factory) {
202202
* </p>
203203
*/
204204
public void reifyException(PFrame.Reference curFrameInfo) {
205+
assert curFrameInfo != PFrame.Reference.EMPTY;
205206
traceback = null;
206207
curFrameInfo.markAsEscaped();
207208
this.frameInfo = curFrameInfo;

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

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
4444
import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
4545
import com.oracle.graal.python.runtime.exception.PException;
46+
import com.oracle.graal.python.runtime.object.PythonObjectFactory;
4647
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
4748
import com.oracle.truffle.api.TruffleStackTrace;
4849
import com.oracle.truffle.api.TruffleStackTraceElement;
@@ -88,18 +89,17 @@ Object get(PTraceback self,
8889
@Cached("createBinaryProfile()") ConditionProfile profile) {
8990
PTraceback tb = self.getNext();
9091
if (profile.profile(tb == null)) {
91-
tb = createTracebackChain(self, materializeNode);
92+
self.setNext(createTracebackChain(self.getException(), materializeNode, factory()));
93+
tb = self.getNext();
9294
}
9395
assert tb != null;
9496
// do never expose 'NO_TRACEBACK'; it's just a marker to avoid re-evaluation
9597
return tb == PTraceback.NO_TRACEBACK ? PNone.NONE : tb;
9698
}
9799

98100
@TruffleBoundary
99-
private PTraceback createTracebackChain(PTraceback self, MaterializeFrameNode materializeNode) {
100-
PTraceback tb;
101+
public static PTraceback createTracebackChain(PException exception, MaterializeFrameNode materializeNode, PythonObjectFactory factory) {
101102
// recover the traceback from Truffle stack trace
102-
PException exception = self.getException();
103103
PTraceback prev = PTraceback.NO_TRACEBACK;
104104
PTraceback cur = null;
105105
for (TruffleStackTraceElement element : TruffleStackTrace.getStackTrace(exception)) {
@@ -112,15 +112,13 @@ private PTraceback createTracebackChain(PTraceback self, MaterializeFrameNode ma
112112
if (location != null && !location.getRootNode().isInternal()) {
113113
// create the PFrame and refresh frame values
114114
PFrame escapedFrame = materializeNode.execute(null, location, false, true, frame);
115-
cur = factory().createTraceback(escapedFrame, exception);
115+
cur = factory.createTraceback(escapedFrame, exception);
116116
cur.setNext(prev);
117117
prev = cur;
118118
}
119119
}
120120
}
121-
self.setNext(cur == null ? PTraceback.NO_TRACEBACK : cur);
122-
tb = self.getNext();
123-
return tb;
121+
return cur == null ? PTraceback.NO_TRACEBACK : cur;
124122
}
125123
}
126124

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/nodes/control/TopLevelExceptionHandler.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
import com.oracle.graal.python.builtins.objects.ints.PInt;
5858
import com.oracle.graal.python.builtins.objects.module.PythonModule;
5959
import com.oracle.graal.python.builtins.objects.traceback.PTraceback;
60+
import com.oracle.graal.python.builtins.objects.traceback.TracebackBuiltins.GetTracebackNextNode;
6061
import com.oracle.graal.python.builtins.objects.type.PythonAbstractClass;
6162
import com.oracle.graal.python.nodes.BuiltinNames;
6263
import com.oracle.graal.python.nodes.argument.CreateArgumentsNode;
@@ -91,8 +92,8 @@ public class TopLevelExceptionHandler extends RootNode {
9192
@Child private CreateArgumentsNode createArgs = CreateArgumentsNode.create();
9293
@Child private LookupAndCallUnaryNode callStrNode = LookupAndCallUnaryNode.create(__STR__);
9394
@Child private CallNode callNode = CallNode.create();
94-
@Child private PythonObjectFactory factory;
9595
@Child private MaterializeFrameNode materializeFrameNode = MaterializeFrameNodeGen.create();
96+
@Child private PythonObjectFactory factory;
9697
@Child private GetTracebackNode getTracebackNode;
9798

9899
public TopLevelExceptionHandler(PythonLanguage language, RootNode child) {
@@ -121,7 +122,11 @@ public Object execute(VirtualFrame frame) {
121122
try {
122123
return run(frame);
123124
} catch (PException e) {
124-
e.getExceptionObject().reifyException(materializeFrameNode.execute(frame, true), factory());
125+
assert !PArguments.isPythonFrame(frame);
126+
// we cannot reify at this point because we have no Python frame; so create the full
127+
// traceback chain
128+
PTraceback tbHead = GetTracebackNextNode.createTracebackChain(e, materializeFrameNode, factory());
129+
e.getExceptionObject().setTraceback(tbHead);
125130
printExc(frame, e);
126131
if (PythonOptions.getOption(context.get(), PythonOptions.WithJavaStacktrace)) {
127132
printStackTrace(e);

0 commit comments

Comments
 (0)