Skip to content

Commit 5b4a09c

Browse files
committed
extend support for signals minimally
1 parent caf4c9e commit 5b4a09c

File tree

2 files changed

+37
-22
lines changed

2 files changed

+37
-22
lines changed

graalpython/com.oracle.graal.python.test/src/tests/test_signal.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,8 @@ def test_alarm():
8080
handler = lambda s,f: posix.close(s)
8181

8282
oldhandler = _signal.signal(_signal.SIGALRM, handler)
83-
assert oldhandler == _signal.SIG_DFL
84-
assert _signal.getsignal(_signal.SIGALRM) is handler
83+
assert oldhandler == _signal.SIG_DFL, "oldhandler != SIG_DFL"
84+
assert _signal.getsignal(_signal.SIGALRM) is handler, "getsignal handler != handler"
8585

8686
# schedule the alarm signal, that will trigger the handler, which
8787
# will in turn close our file

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

Lines changed: 35 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,13 @@
4747
import com.oracle.graal.python.builtins.CoreFunctions;
4848
import com.oracle.graal.python.builtins.PythonBuiltins;
4949
import com.oracle.graal.python.builtins.objects.PNone;
50-
import com.oracle.graal.python.builtins.objects.function.PArguments;
5150
import com.oracle.graal.python.builtins.objects.function.PBuiltinFunction;
51+
import com.oracle.graal.python.builtins.objects.function.PFunction;
52+
import com.oracle.graal.python.builtins.objects.function.PythonCallable;
5253
import com.oracle.graal.python.builtins.objects.ints.PInt;
5354
import com.oracle.graal.python.builtins.objects.method.PBuiltinMethod;
55+
import com.oracle.graal.python.builtins.objects.method.PMethod;
56+
import com.oracle.graal.python.nodes.argument.CreateArgumentsNode;
5457
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
5558
import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
5659
import com.oracle.graal.python.nodes.function.builtins.PythonUnaryBuiltinNode;
@@ -135,6 +138,8 @@ Object getsignal(int signum) {
135138
@Builtin(name = "signal", fixedNumOfArguments = 2)
136139
@GenerateNodeFactory
137140
abstract static class SignalNode extends PythonBinaryBuiltinNode {
141+
@Child CreateArgumentsNode createArgs = CreateArgumentsNode.create();
142+
138143
@Specialization
139144
@TruffleBoundary
140145
Object signal(int signum, int id) {
@@ -155,25 +160,7 @@ Object signal(int signum, int id) {
155160
return retval;
156161
}
157162

158-
@Specialization
159-
@TruffleBoundary
160-
Object signal(int signum, PBuiltinMethod handler) {
161-
// TODO: (tfel) definitely wrong
162-
return signal(signum, handler.getFunction());
163-
}
164-
165-
// TODO: This needs to be fixed, any object with a "__call__" should work
166-
@Specialization
167-
@TruffleBoundary
168-
Object signal(int signum, PBuiltinFunction handler) {
169-
RootCallTarget callTarget = handler.getCallTarget();
170-
Object[] arguments = PArguments.create(2);
171-
PArguments.setArgument(arguments, 0, signum);
172-
// TODO: the second argument should be the interrupted, currently executing frame
173-
// we'll get that when we switch to executing these handlers (just like finalizers)
174-
// on the main thread
175-
PArguments.setArgument(arguments, 1, PNone.NONE);
176-
163+
private Object installSignalHandler(int signum, PythonCallable handler, RootCallTarget callTarget, Object[] arguments) {
177164
Object retval;
178165
try {
179166
retval = Signals.setSignalHandler(signum, () -> {
@@ -192,6 +179,34 @@ Object signal(int signum, PBuiltinFunction handler) {
192179
signalHandlers.put(signum, handler);
193180
return retval;
194181
}
182+
// TODO: This needs to be fixed, any object with a "__call__" should work
183+
184+
// TODO: the second argument should be the interrupted, currently executing frame
185+
// we'll get that when we switch to executing these handlers (just like finalizers)
186+
// on the main thread
187+
@Specialization
188+
@TruffleBoundary
189+
Object signal(int signum, PBuiltinMethod handler) {
190+
return installSignalHandler(signum, handler, handler.getCallTarget(), createArgs.executeWithSelf(handler.getSelf(), new Object[]{signum, PNone.NONE}));
191+
}
192+
193+
@Specialization
194+
@TruffleBoundary
195+
Object signal(int signum, PBuiltinFunction handler) {
196+
return installSignalHandler(signum, handler, handler.getCallTarget(), createArgs.execute(new Object[]{signum, PNone.NONE}));
197+
}
198+
199+
@Specialization
200+
@TruffleBoundary
201+
Object signal(int signum, PMethod handler) {
202+
return installSignalHandler(signum, handler, handler.getCallTarget(), createArgs.executeWithSelf(handler.getSelf(), new Object[]{signum, PNone.NONE}));
203+
}
204+
205+
@Specialization
206+
@TruffleBoundary
207+
Object signal(int signum, PFunction handler) {
208+
return installSignalHandler(signum, handler, handler.getCallTarget(), createArgs.execute(new Object[]{signum, PNone.NONE}));
209+
}
195210
}
196211
}
197212

0 commit comments

Comments
 (0)