|
69 | 69 | import com.oracle.graal.python.lib.PyTimeFromObjectNode; |
70 | 70 | import com.oracle.graal.python.lib.PyTimeFromObjectNode.RoundType; |
71 | 71 | import com.oracle.graal.python.nodes.ErrorMessages; |
| 72 | +import com.oracle.graal.python.nodes.PConstructAndRaiseNode; |
72 | 73 | import com.oracle.graal.python.nodes.PRaiseNode; |
73 | 74 | import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode; |
74 | 75 | import com.oracle.graal.python.nodes.function.PythonBuiltinNode; |
75 | 76 | import com.oracle.graal.python.nodes.function.builtins.PythonClinicBuiltinNode; |
76 | 77 | import com.oracle.graal.python.nodes.function.builtins.PythonTernaryBuiltinNode; |
| 78 | +import com.oracle.graal.python.nodes.function.builtins.PythonUnaryClinicBuiltinNode; |
77 | 79 | import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode; |
78 | 80 | import com.oracle.graal.python.nodes.function.builtins.clinic.ArgumentClinicProvider; |
79 | 81 | import com.oracle.graal.python.runtime.ExecutionContext.BoundaryCallContext; |
| 82 | +import com.oracle.graal.python.runtime.GilNode; |
80 | 83 | import com.oracle.graal.python.runtime.IndirectCallData.BoundaryCallData; |
81 | 84 | import com.oracle.graal.python.runtime.PosixSupportLibrary; |
| 85 | +import com.oracle.graal.python.runtime.PosixSupportLibrary.PosixException; |
| 86 | +import com.oracle.graal.python.runtime.PosixSupportLibrary.UnsupportedPosixFeatureException; |
82 | 87 | import com.oracle.graal.python.runtime.PythonContext; |
83 | 88 | import com.oracle.graal.python.runtime.PythonOptions; |
84 | 89 | import com.oracle.graal.python.runtime.exception.ExceptionUtils; |
|
95 | 100 | import com.oracle.truffle.api.dsl.Specialization; |
96 | 101 | import com.oracle.truffle.api.exception.AbstractTruffleException; |
97 | 102 | import com.oracle.truffle.api.frame.VirtualFrame; |
| 103 | +import com.oracle.truffle.api.library.CachedLibrary; |
98 | 104 | import com.oracle.truffle.api.nodes.Node; |
99 | 105 | import com.oracle.truffle.api.strings.TruffleString; |
100 | 106 |
|
@@ -235,6 +241,62 @@ static int fileno(VirtualFrame frame, Node inliningTarget, Object file, |
235 | 241 | } |
236 | 242 | } |
237 | 243 |
|
| 244 | + @Builtin(name = "_sigsegv", minNumOfPositionalArgs = 0, parameterNames = {"release_gil"}) |
| 245 | + @ArgumentClinic(name = "release_gil", conversion = ArgumentClinic.ClinicConversion.Boolean, defaultValue = "false") |
| 246 | + @GenerateNodeFactory |
| 247 | + abstract static class SigSegvNode extends PythonUnaryClinicBuiltinNode { |
| 248 | + @Specialization |
| 249 | + static PNone doIt(VirtualFrame frame, boolean releaseGil, |
| 250 | + @Bind PythonContext context, |
| 251 | + @Bind Node inliningTarget, |
| 252 | + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, |
| 253 | + @Cached GilNode gil, |
| 254 | + @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { |
| 255 | + return raiseFatalSignal(frame, context, inliningTarget, posixLib, gil, constructAndRaiseNode, "SEGV", releaseGil); |
| 256 | + } |
| 257 | + |
| 258 | + @Override |
| 259 | + protected ArgumentClinicProvider getArgumentClinic() { |
| 260 | + return FaulthandlerModuleBuiltinsClinicProviders.SigSegvNodeClinicProviderGen.INSTANCE; |
| 261 | + } |
| 262 | + } |
| 263 | + |
| 264 | + @Builtin(name = "_sigabrt", minNumOfPositionalArgs = 0) |
| 265 | + @GenerateNodeFactory |
| 266 | + abstract static class SigAbrtNode extends PythonBuiltinNode { |
| 267 | + @Specialization |
| 268 | + static PNone doIt(VirtualFrame frame, |
| 269 | + @Bind PythonContext context, |
| 270 | + @Bind Node inliningTarget, |
| 271 | + @CachedLibrary("context.getPosixSupport()") PosixSupportLibrary posixLib, |
| 272 | + @Cached GilNode gil, |
| 273 | + @Cached PConstructAndRaiseNode.Lazy constructAndRaiseNode) { |
| 274 | + return raiseFatalSignal(frame, context, inliningTarget, posixLib, gil, constructAndRaiseNode, "ABRT", false); |
| 275 | + } |
| 276 | + } |
| 277 | + |
| 278 | + private static PNone raiseFatalSignal(VirtualFrame frame, PythonContext context, Node inliningTarget, PosixSupportLibrary posixLib, GilNode gil, |
| 279 | + PConstructAndRaiseNode.Lazy constructAndRaiseNode, String signalName, boolean releaseGil) { |
| 280 | + try { |
| 281 | + int signum = SignalModuleBuiltins.signalFromName(context, signalName); |
| 282 | + if (releaseGil) { |
| 283 | + gil.release(true); |
| 284 | + } |
| 285 | + try { |
| 286 | + posixLib.signalSelf(context.getPosixSupport(), signum); |
| 287 | + } finally { |
| 288 | + if (releaseGil) { |
| 289 | + gil.acquire(); |
| 290 | + } |
| 291 | + } |
| 292 | + } catch (PosixException e) { |
| 293 | + throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorFromPosixException(frame, e); |
| 294 | + } catch (UnsupportedPosixFeatureException e) { |
| 295 | + throw constructAndRaiseNode.get(inliningTarget).raiseOSErrorUnsupported(frame, e); |
| 296 | + } |
| 297 | + return PNone.NONE; |
| 298 | + } |
| 299 | + |
238 | 300 | @Builtin(name = "dump_traceback_later", minNumOfPositionalArgs = 2, declaresExplicitSelf = true, parameterNames = {"$mod", "timeout", "repeat", "file", "exit"}) |
239 | 301 | @ArgumentClinic(name = "repeat", conversion = ArgumentClinic.ClinicConversion.IntToBoolean, defaultValue = "false") |
240 | 302 | @ArgumentClinic(name = "exit", conversion = ArgumentClinic.ClinicConversion.IntToBoolean, defaultValue = "false") |
|
0 commit comments