Skip to content

Commit fc69d9b

Browse files
committed
Implement signal.valid_signals()
1 parent 9684728 commit fc69d9b

File tree

1 file changed

+29
-5
lines changed

1 file changed

+29
-5
lines changed

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

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -118,8 +118,8 @@ public void initialize(Python3Core core) {
118118
addBuiltinConstant("ITIMER_REAL", ITIMER_REAL);
119119
addBuiltinConstant("ITIMER_VIRTUAL", ITIMER_VIRTUAL);
120120
addBuiltinConstant("ITIMER_PROF", ITIMER_PROF);
121-
for (int i = 0; i < Signals.signalNames.length; i++) {
122-
String name = Signals.signalNames[i];
121+
for (int i = 0; i < Signals.SIGNAL_NAMES.length; i++) {
122+
String name = Signals.SIGNAL_NAMES[i];
123123
if (name != null) {
124124
addBuiltinConstant("SIG" + name, i);
125125
}
@@ -174,6 +174,30 @@ public int frameIndex() {
174174
}
175175
}
176176

177+
@Builtin(name = "valid_signals")
178+
@GenerateNodeFactory
179+
abstract static class ValidSignalsNode extends PythonBuiltinNode {
180+
@Specialization
181+
static Object validSignals(
182+
@Cached PythonObjectFactory factory) {
183+
int signalCount = 0;
184+
for (int i = 0; i < Signals.SIGNAL_NAMES.length; i++) {
185+
if (Signals.SIGNAL_NAMES[i] != null) {
186+
signalCount++;
187+
}
188+
}
189+
int[] validSignals = new int[signalCount];
190+
int j = 0;
191+
for (int i = 0; i < Signals.SIGNAL_NAMES.length; i++) {
192+
if (Signals.SIGNAL_NAMES[i] != null) {
193+
validSignals[j++] = i;
194+
}
195+
}
196+
197+
return factory.createTuple(validSignals);
198+
}
199+
}
200+
177201
@Builtin(name = "alarm", minNumOfPositionalArgs = 2, numOfPositionalOnlyArgs = 2, declaresExplicitSelf = true, parameterNames = {"$mod", "seconds"})
178202
@ArgumentClinic(name = "seconds", conversion = ArgumentClinic.ClinicConversion.Int)
179203
@GenerateNodeFactory
@@ -477,7 +501,7 @@ final class Signals {
477501
static final int SIG_DFL = 0;
478502
static final int SIG_IGN = 1;
479503
private static final int SIGMAX = 31;
480-
static final String[] signalNames = new String[SIGMAX + 1];
504+
static final String[] SIGNAL_NAMES = new String[SIGMAX + 1];
481505

482506
static {
483507
for (String signal : new String[]{"ABRT", "ALRM", "BUS", "FPE", "HUP", "ILL", "INFO", "INT", "KILL", "LOST",
@@ -488,7 +512,7 @@ final class Signals {
488512
if (number > SIGMAX) {
489513
continue;
490514
}
491-
signalNames[number] = signal;
515+
SIGNAL_NAMES[number] = signal;
492516
} catch (IllegalArgumentException e) {
493517
}
494518
}
@@ -548,7 +572,7 @@ public void handle(sun.misc.Signal arg0) {
548572
}
549573

550574
static String signalNumberToName(int signum) {
551-
return signum > SIGMAX ? "INVALID SIGNAL" : signalNames[signum];
575+
return signum > SIGMAX ? "INVALID SIGNAL" : SIGNAL_NAMES[signum];
552576
}
553577

554578
@TruffleBoundary

0 commit comments

Comments
 (0)