summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Include/pythonrun.h14
-rw-r--r--Python/pythonrun.c29
2 files changed, 42 insertions, 1 deletions
diff --git a/Include/pythonrun.h b/Include/pythonrun.h
index c217570..0528702 100644
--- a/Include/pythonrun.h
+++ b/Include/pythonrun.h
@@ -87,8 +87,20 @@ DL_IMPORT(void) PyOS_FiniInterrupts(void);
DL_IMPORT(char *) PyOS_Readline(char *);
extern DL_IMPORT(int) (*PyOS_InputHook)(void);
extern DL_IMPORT(char) *(*PyOS_ReadlineFunctionPointer)(char *);
+
+/* Stack size, in "pointers" (so we get extra safety margins
+ on 64-bit platforms). On a 32-bit platform, this translates
+ to a 8k margin. */
+#define PYOS_STACK_MARGIN 2048
+
+#if defined(WIN32) && defined(_MSC_VER)
+/* Enable stack checking under Microsoft C */
+#define USE_STACKCHECK
+#endif
+
#ifdef USE_STACKCHECK
-int PyOS_CheckStack(void); /* Check that we aren't overflowing our stack */
+/* Check that we aren't overflowing our stack */
+DL_IMPORT(int) PyOS_CheckStack(void);
#endif
#ifdef __cplusplus
diff --git a/Python/pythonrun.c b/Python/pythonrun.c
index 8d571c3..e951ccd 100644
--- a/Python/pythonrun.c
+++ b/Python/pythonrun.c
@@ -1165,3 +1165,32 @@ Py_FdIsInteractive(FILE *fp, char *filename)
(strcmp(filename, "<stdin>") == 0) ||
(strcmp(filename, "???") == 0);
}
+
+
+#if defined(USE_STACKCHECK)
+#if defined(WIN32) && defined(_MSC_VER)
+
+/* Stack checking for Microsoft C */
+
+#include <malloc.h>
+#include <excpt.h>
+
+int
+PyOS_CheckStack()
+{
+ __try {
+ /* _alloca throws a stack overflow exception if there's
+ not enough space left on the stack */
+ _alloca(PYOS_STACK_MARGIN * sizeof(void*));
+ return 0;
+ } __except (EXCEPTION_EXECUTE_HANDLER) {
+ /* just ignore all errors */
+ }
+ return 1;
+}
+
+#endif /* WIN32 && _MSC_VER */
+
+/* Alternate implementations can be added here... */
+
+#endif /* USE_STACKCHECK */