Skip to content

Commit b79401c

Browse files
committed
[GR-65462] Implement faulthandler.dump_traceback_later
PullRequest: graalpython/3821
2 parents 98d10e9 + 0ea37b5 commit b79401c

File tree

8 files changed

+254
-65
lines changed

8 files changed

+254
-65
lines changed

graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_faulthandler.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,3 @@ test.test_faulthandler.FaultHandlerTests.test_is_enabled @ darwin-arm64,darwin-x
44
# Disabled since signaling isn't stable during parallel tests
55
!test.test_faulthandler.FaultHandlerTests.test_sigbus
66
!test.test_faulthandler.FaultHandlerTests.test_sigill
7-
test.test_faulthandler.FaultHandlerTests.test_sys_xoptions @ darwin-arm64,darwin-x86_64,linux-aarch64,linux-x86_64,win32-AMD64
Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
11
test.test_faulthandler.FaultHandlerTests.test_cancel_later_without_dump_traceback_later @ linux-x86_64
22
test.test_faulthandler.FaultHandlerTests.test_disable @ linux-x86_64
33
test.test_faulthandler.FaultHandlerTests.test_is_enabled @ linux-x86_64
4-
test.test_faulthandler.FaultHandlerTests.test_sys_xoptions @ linux-x86_64

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

Lines changed: 221 additions & 43 deletions
Large diffs are not rendered by default.

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2559,8 +2559,9 @@ static TruffleString getStrError(int code,
25592559
public abstract static class ExitNode extends PythonUnaryClinicBuiltinNode {
25602560
@TruffleBoundary
25612561
@Specialization
2562-
Object exit(int status) {
2563-
PythonContext context = getContext();
2562+
public static Object exit(int status,
2563+
@Bind Node node) {
2564+
PythonContext context = PythonContext.get(node);
25642565
if (context.getOption(PythonOptions.RunViaLauncher)) {
25652566
Runtime.getRuntime().halt(status);
25662567
}
@@ -2574,12 +2575,12 @@ protected void perform(Access access) {
25742575
}
25752576
});
25762577
if (Thread.currentThread() == context.getMainThread()) {
2577-
throw new PythonExitException(this, status);
2578+
throw new PythonExitException(node, status);
25782579
} else {
25792580
context.getEnv().submitThreadLocal(new Thread[]{context.getMainThread()}, new ThreadLocalAction(true, false) {
25802581
@Override
25812582
protected void perform(Access access) {
2582-
throw new PythonExitException(ExitNode.this, status);
2583+
throw new PythonExitException(node, status);
25832584
}
25842585
});
25852586
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/socket/SocketNodes.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,6 @@
9999
import com.oracle.graal.python.runtime.PythonContext;
100100
import com.oracle.graal.python.runtime.exception.PException;
101101
import com.oracle.graal.python.runtime.object.PFactory;
102-
import com.oracle.graal.python.util.TimeUtils;
103102
import com.oracle.truffle.api.dsl.Bind;
104103
import com.oracle.truffle.api.dsl.Cached;
105104
import com.oracle.truffle.api.dsl.Cached.Exclusive;
@@ -555,7 +554,7 @@ static long parse(@SuppressWarnings("unused") PNone none) {
555554
static long parse(VirtualFrame frame, Node inliningTarget, Object seconds,
556555
@Cached PyTimeFromObjectNode timeFromObjectNode,
557556
@Cached PRaiseNode raiseNode) {
558-
long timeout = timeFromObjectNode.execute(frame, inliningTarget, seconds, RoundType.TIMEOUT, TimeUtils.SEC_TO_NS);
557+
long timeout = timeFromObjectNode.fromSeconds(frame, inliningTarget, seconds, RoundType.TIMEOUT);
559558
if (timeout < 0) {
560559
throw raiseNode.raise(inliningTarget, ValueError, ErrorMessages.TIMEOUT_VALUE_OUT_OF_RANGE);
561560
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/lib/PyTimeFromObjectNode.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
import com.oracle.graal.python.runtime.exception.PException;
5454
import com.oracle.graal.python.util.OverflowException;
5555
import com.oracle.graal.python.util.PythonUtils;
56+
import com.oracle.graal.python.util.TimeUtils;
5657
import com.oracle.truffle.api.dsl.Cached;
5758
import com.oracle.truffle.api.dsl.Cached.Exclusive;
5859
import com.oracle.truffle.api.dsl.Cached.Shared;
@@ -80,10 +81,14 @@ public enum RoundType {
8081

8182
public abstract long execute(VirtualFrame frame, Node inliningTarget, Object obj, RoundType round, long unitToNs);
8283

84+
// Like _PyTime_FromSecondsObject
85+
public final long fromSeconds(VirtualFrame frame, Node inliningTarget, Object obj, RoundType round) {
86+
return execute(frame, inliningTarget, obj, round, TimeUtils.SEC_TO_NS);
87+
}
88+
8389
@Specialization
8490
static long doDouble(Node inliningTarget, double d, RoundType round, long unitToNs,
8591
@Shared @Cached PRaiseNode raiseNode) {
86-
// Implements _PyTime_FromDouble, rounding mode (HALF_UP) is hard-coded for now
8792
if (Double.isNaN(d)) {
8893
throw raiseNode.raise(inliningTarget, ValueError, INVALID_VALUE_NAN);
8994
}

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -711,6 +711,9 @@ public abstract class ErrorMessages {
711711
public static final TruffleString SIZE_SHOULD_NOT_BE_NEGATIVE = tsLiteral("size should not be negative");
712712
public static final TruffleString STRING_INDEX_OUT_OF_RANGE = tsLiteral("IndexError: string index out of range");
713713
public static final TruffleString STRING_INDICES_MUST_BE_INTEGERS_NOT_P = tsLiteral("string indices must be integers, not '%p'");
714+
public static final TruffleString SYS_STDERR_IS_NONE = tsLiteral("sys.stderr is None");
715+
public static final TruffleString FILE_IS_NOT_A_VALID_FILE_DESCRIPTOR = tsLiteral("file is not a valid file descriptor");
716+
public static final TruffleString FILE_FILENO_IS_NOT_A_VALID_FILE_DESCRIPTOR = tsLiteral("file.fileno() is not a valid file descriptor");
714717
public static final TruffleString SUBSTRING_NOT_FOUND = tsLiteral("substring not found");
715718
public static final TruffleString SUBSECTION_NOT_FOUND = tsLiteral("subsection not found");
716719
public static final TruffleString SUB_VIEWS_NOT_IMPLEMENTED = tsLiteral("sub-views are not implemented");

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/exception/ExceptionUtils.java

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -68,17 +68,17 @@
6868
import com.oracle.graal.python.nodes.function.BuiltinFunctionRootNode;
6969
import com.oracle.graal.python.nodes.object.GetClassNode;
7070
import com.oracle.graal.python.runtime.PythonContext;
71-
import com.oracle.graal.python.runtime.object.PFactory;
7271
import com.oracle.graal.python.runtime.PythonOptions;
72+
import com.oracle.graal.python.runtime.object.PFactory;
7373
import com.oracle.truffle.api.CompilerAsserts;
7474
import com.oracle.truffle.api.CompilerDirectives;
7575
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
7676
import com.oracle.truffle.api.RootCallTarget;
7777
import com.oracle.truffle.api.Truffle;
7878
import com.oracle.truffle.api.TruffleStackTrace;
7979
import com.oracle.truffle.api.TruffleStackTraceElement;
80-
import com.oracle.truffle.api.exception.AbstractTruffleException;
8180
import com.oracle.truffle.api.bytecode.BytecodeNode;
81+
import com.oracle.truffle.api.exception.AbstractTruffleException;
8282
import com.oracle.truffle.api.frame.Frame;
8383
import com.oracle.truffle.api.frame.FrameInstance;
8484
import com.oracle.truffle.api.frame.FrameInstanceVisitor;
@@ -171,17 +171,7 @@ public static void printPythonLikeStackTrace(PythonContext context, Throwable e)
171171

172172
@TruffleBoundary
173173
public static void printPythonLikeStackTrace(PrintWriter p, Throwable e) {
174-
List<TruffleStackTraceElement> stackTrace = TruffleStackTrace.getStackTrace(e);
175-
if (stackTrace != null) {
176-
ArrayList<String> stack = new ArrayList<>();
177-
for (TruffleStackTraceElement frame : stackTrace) {
178-
Node location = frame.getLocation();
179-
RootNode rootNode = frame.getTarget().getRootNode();
180-
int lineno = getLineno(frame.getFrame(), location, null);
181-
appendStackLine(stack, location, rootNode, false, lineno);
182-
}
183-
printStack(p, stack);
184-
}
174+
printPythonLikeStackTraceNoMessage(p, e);
185175
InteropLibrary lib = InteropLibrary.getUncached();
186176
if (lib.isException(e) && lib.hasExceptionMessage(lib)) {
187177
try {
@@ -195,6 +185,21 @@ public static void printPythonLikeStackTrace(PrintWriter p, Throwable e) {
195185
}
196186
}
197187

188+
@TruffleBoundary
189+
public static void printPythonLikeStackTraceNoMessage(PrintWriter p, Throwable e) {
190+
List<TruffleStackTraceElement> stackTrace = TruffleStackTrace.getStackTrace(e);
191+
if (stackTrace != null) {
192+
ArrayList<String> stack = new ArrayList<>();
193+
for (TruffleStackTraceElement frame : stackTrace) {
194+
Node location = frame.getLocation();
195+
RootNode rootNode = frame.getTarget().getRootNode();
196+
int lineno = getLineno(frame.getFrame(), location, null);
197+
appendStackLine(stack, location, rootNode, false, lineno);
198+
}
199+
printStack(p, stack);
200+
}
201+
}
202+
198203
private static void appendStackLine(ArrayList<String> stack, Node location, RootNode rootNode, boolean evenWithoutSource, int lineno) {
199204
if (rootNode instanceof TopLevelExceptionHandler) {
200205
return;

0 commit comments

Comments
 (0)