Skip to content

Commit 1415350

Browse files
committed
SysModuleBuiltins.ExceptHookNode: fix setting the tracebacklimit
1 parent 95cf5aa commit 1415350

File tree

3 files changed

+22
-8
lines changed

3 files changed

+22
-8
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/SysModuleBuiltins.java

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
import static com.oracle.graal.python.nodes.BuiltinNames.STDERR;
5050
import static com.oracle.graal.python.nodes.BuiltinNames.STDIN;
5151
import static com.oracle.graal.python.nodes.BuiltinNames.STDOUT;
52+
import static com.oracle.graal.python.nodes.BuiltinNames.TRACEBACKLIMIT;
5253
import static com.oracle.graal.python.nodes.BuiltinNames.__EXCEPTHOOK__;
5354
import static com.oracle.graal.python.nodes.BuiltinNames.__STDERR__;
5455
import static com.oracle.graal.python.nodes.BuiltinNames.__STDIN__;
@@ -106,6 +107,7 @@
106107
import com.oracle.graal.python.builtins.objects.traceback.LazyTraceback;
107108
import com.oracle.graal.python.builtins.objects.traceback.PTraceback;
108109
import com.oracle.graal.python.builtins.objects.traceback.TracebackBuiltins;
110+
import com.oracle.graal.python.builtins.objects.traceback.TracebackBuiltinsFactory;
109111
import com.oracle.graal.python.builtins.objects.tuple.PTuple;
110112
import com.oracle.graal.python.builtins.objects.tuple.StructSequence;
111113
import com.oracle.graal.python.builtins.objects.type.TypeNodes;
@@ -829,7 +831,6 @@ abstract static class ExceptHookNode extends PythonBuiltinNode {
829831
static final String CONTEXT_MESSAGE = "\nDuring handling of the above exception, another exception occurred:\n\n";
830832
static final int TRACEBACK_LIMIT = 1000;
831833
static final int TB_RECURSIVE_CUTOFF = 3;
832-
static final String ATTR_TB_LIMIT = "tracebacklimit";
833834
static final String ATTR_PRINT_FILE_AND_LINE = "print_file_and_line";
834835
static final String ATTR_MSG = "msg";
835836
static final String ATTR_FILENAME = "filename";
@@ -852,6 +853,7 @@ abstract static class ExceptHookNode extends PythonBuiltinNode {
852853
@Child private PyObjectStrAsObjectNode strAsObjNode;
853854
@Child private TracebackBuiltins.GetTracebackFrameNode getTracebackFrameNode;
854855
@Child private PyObjectCallMethodObjArgs callMethod;
856+
@Child private TracebackBuiltins.MaterializeTruffleStacktraceNode truffleStacktraceNode;
855857

856858
@CompilerDirectives.ValueType
857859
static final class SyntaxErrData {
@@ -870,6 +872,15 @@ static final class SyntaxErrData {
870872
}
871873
}
872874

875+
private PTraceback getNextTb(PTraceback traceback) {
876+
if (truffleStacktraceNode == null) {
877+
CompilerDirectives.transferToInterpreterAndInvalidate();
878+
truffleStacktraceNode = insert(TracebackBuiltinsFactory.MaterializeTruffleStacktraceNodeGen.create());
879+
}
880+
truffleStacktraceNode.execute(traceback);
881+
return traceback.getNext();
882+
}
883+
873884
private PyObjectCallMethodObjArgs ensureCallMethodNode() {
874885
if (callMethod == null) {
875886
CompilerDirectives.transferToInterpreterAndInvalidate();
@@ -990,9 +1001,11 @@ private long asLongAndOverflow(VirtualFrame frame, Object object, long overflowV
9901001
pyLongAsLongAndOverflowNode = insert(PyLongAsLongAndOverflowNodeGen.create());
9911002
}
9921003
try {
993-
final long val = pyLongAsLongAndOverflowNode.execute(frame, object);
994-
return Math.min(val, overflowValue);
1004+
return pyLongAsLongAndOverflowNode.execute(frame, object);
9951005
} catch (OverflowException e) {
1006+
if (object instanceof PInt) {
1007+
return ((PInt) object).isZeroOrNegative() ? 0 : overflowValue;
1008+
}
9961009
return overflowValue;
9971010
}
9981011
}
@@ -1007,7 +1020,7 @@ private Object readAttr(Object object, String attribute) {
10071020

10081021
void printTraceBack(VirtualFrame frame, PythonModule sys, Object out, PTraceback tb) {
10091022
long limit = TRACEBACK_LIMIT;
1010-
final Object limitv = readAttr(sys, ATTR_TB_LIMIT);
1023+
final Object limitv = readAttr(sys, TRACEBACKLIMIT);
10111024
if (checkLong(limitv)) {
10121025
limit = asLongAndOverflow(frame, limitv, MAXSIZE);
10131026
if (limit <= 0) {
@@ -1093,11 +1106,11 @@ void printInternal(VirtualFrame frame, Object out, PTraceback traceback, long li
10931106
PTraceback tb = traceback;
10941107
while (tb1 != null) {
10951108
depth++;
1096-
tb1 = tb1.getNext();
1109+
tb1 = getNextTb(tb1);
10971110
}
10981111
while (tb != null && depth > limit) {
10991112
depth--;
1100-
tb = tb.getNext();
1113+
tb = getNextTb(tb);
11011114
}
11021115
while (tb != null) {
11031116
final PCode code = getCode(frame, tb);
@@ -1117,7 +1130,7 @@ void printInternal(VirtualFrame frame, Object out, PTraceback traceback, long li
11171130
if (cnt <= TB_RECURSIVE_CUTOFF) {
11181131
displayLine(frame, out, code.getFilename(), tb.getLineno(), code.getName());
11191132
}
1120-
tb = tb.getNext();
1133+
tb = getNextTb(tb);
11211134
}
11221135
if (cnt > TB_RECURSIVE_CUTOFF) {
11231136
printLineRepeated(frame, out, cnt);

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ public Object dir(@SuppressWarnings("unused") PTraceback self) {
8484
*
8585
* @see GetTracebackNode
8686
*/
87-
abstract static class MaterializeTruffleStacktraceNode extends Node {
87+
public abstract static class MaterializeTruffleStacktraceNode extends Node {
8888
public abstract void execute(PTraceback tb);
8989

9090
@Specialization(guards = "tb.isMaterialized()")

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ public abstract class BuiltinNames {
5656
public static final String __DEBUG__ = "__debug__";
5757

5858
// sys
59+
public static final String TRACEBACKLIMIT = "tracebacklimit";
5960
public static final String DISPLAYHOOK = "displayhook";
6061
public static final String BREAKPOINTHOOK = "breakpointhook";
6162
public static final String EXCEPTHOOK = "excepthook";

0 commit comments

Comments
 (0)