summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Include/pyport.h26
-rw-r--r--Modules/signalmodule.c4
-rw-r--r--Parser/intrcheck.c4
3 files changed, 27 insertions, 7 deletions
diff --git a/Include/pyport.h b/Include/pyport.h
index fbaaa38..4faba7c 100644
--- a/Include/pyport.h
+++ b/Include/pyport.h
@@ -11,7 +11,7 @@ redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
/**************************************************************************
Symbols and macros to supply platform-independent interfaces to basic
-C-language operations whose spellings vary across platforms.
+C language & library operations whose spellings vary across platforms.
Please try to make documentation here as clear as possible: by definition,
the stuff here is trying to illuminate C's darkest corners.
@@ -22,6 +22,11 @@ SIGNED_RIGHT_SHIFT_ZERO_FILLS
Meaning: To be defined iff i>>j does not extend the sign bit when i is a
signed integral type and i < 0.
Used in: Py_ARITHMETIC_RIGHT_SHIFT
+
+RETSIGTYPE
+Meaning: Expands to void or int, depending on what the platform wants
+ signal handlers to return. Note that only void is ANSI!
+Used in: Py_RETURN_FROM_SIGNAL_HANDLER
**************************************************************************/
@@ -50,6 +55,25 @@ extern "C" {
#define Py_ARITHMETIC_RIGHT_SHIFT(TYPE, I, J) ((I) >> (J))
#endif
+/* Py_FORCE_EXPANSION
+ * "Simply" returns its argument. However, macro expansions within the
+ * argument are evaluated. This unfortunate trickery is needed to get
+ * token-pasting to work as desired in some cases.
+ */
+#define Py_FORCE_EXPANSION(X) X
+
+/* Py_RETURN_FROM_SIGNAL_HANDLER
+ * The return from a signal handler varies depending on whether RETSIGTYPE
+ * is int or void. The macro Py_RETURN_FROM_SIGNAL_HANDLER(VALUE) expands
+ * to
+ * return VALUE
+ * if RETSIGTYPE is int, else to nothing if RETSIGTYPE is void.
+ */
+#define int_PySIGRETURN(VALUE) return VALUE
+#define void_PySIGRETURN(VALUE)
+#define Py_RETURN_FROM_SIGNAL_HANDLER(VALUE) \
+ Py_FORCE_EXPANSION(RETSIGTYPE) ## _PySIGRETURN(VALUE)
+
#ifdef __cplusplus
}
#endif
diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c
index 3a2a6df..6fe516a 100644
--- a/Modules/signalmodule.c
+++ b/Modules/signalmodule.c
@@ -143,9 +143,7 @@ signal_handler(int sig_num)
siginterrupt(sig_num, 1);
#endif
signal(sig_num, signal_handler);
-#if RETSIGTYPE != void
- return 0;
-#endif
+ Py_RETURN_FROM_SIGNAL_HANDLER(0);
}
diff --git a/Parser/intrcheck.c b/Parser/intrcheck.c
index e9927e9..2f151ee 100644
--- a/Parser/intrcheck.c
+++ b/Parser/intrcheck.c
@@ -168,9 +168,7 @@ intcatcher(int sig)
}
signal(SIGINT, intcatcher);
Py_AddPendingCall(checksignals_witharg, NULL);
-#if RETSIGTYPE != void
- return 0;
-#endif
+ Py_RETURN_FROM_SIGNAL_HANDLER(0);
}
static RETSIGTYPE (*old_siginthandler)(int) = SIG_DFL;