summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Zend/Zend.m42
-rw-r--r--Zend/zend.c2
-rw-r--r--Zend/zend.h16
-rw-r--r--Zend/zend_globals.h2
-rw-r--r--win32/build/config.w32.h.in1
5 files changed, 17 insertions, 6 deletions
diff --git a/Zend/Zend.m4 b/Zend/Zend.m4
index 61150fab00..bbb3411a4a 100644
--- a/Zend/Zend.m4
+++ b/Zend/Zend.m4
@@ -109,7 +109,7 @@ dnl Checks for library functions.
AC_FUNC_VPRINTF
AC_FUNC_MEMCMP
AC_FUNC_ALLOCA
-AC_CHECK_FUNCS(memcpy strdup getpid kill strtod strtol finite fpclass)
+AC_CHECK_FUNCS(memcpy strdup getpid kill strtod strtol finite fpclass sigsetjmp)
AC_ZEND_BROKEN_SPRINTF
AC_CHECK_FUNCS(finite isfinite isinf isnan)
diff --git a/Zend/zend.c b/Zend/zend.c
index a7bd8a773d..71b39fcb74 100644
--- a/Zend/zend.c
+++ b/Zend/zend.c
@@ -794,7 +794,7 @@ ZEND_API void _zend_bailout(char *filename, uint lineno) /* {{{ */
CG(unclean_shutdown) = 1;
CG(in_compilation) = EG(in_execution) = 0;
EG(current_execute_data) = NULL;
- siglongjmp(*EG(bailout), FAILURE);
+ LONGJMP(*EG(bailout), FAILURE);
}
/* }}} */
END_EXTERN_C()
diff --git a/Zend/zend.h b/Zend/zend.h
index 2d7a21e1dc..5249f8c078 100644
--- a/Zend/zend.h
+++ b/Zend/zend.h
@@ -520,13 +520,23 @@ END_EXTERN_C()
#define zend_bailout() _zend_bailout(__FILE__, __LINE__)
+#ifdef HAVE_SIGSETJMP
+# define SETJMP(a) sigsetjmp(a, 0)
+# define LONGJMP(a,b) siglongjmp(a, b)
+# define JMP_BUF sigjmp_buf
+#else
+# define SETJMP(a) setjmp(a)
+# define LONGJMP(a,b) longjmp(a, b)
+# define JMP_BUF jmp_buf
+#endif
+
#define zend_try \
{ \
- sigjmp_buf *__orig_bailout = EG(bailout); \
- sigjmp_buf __bailout; \
+ JMP_BUF *__orig_bailout = EG(bailout); \
+ JMP_BUF __bailout; \
\
EG(bailout) = &__bailout; \
- if (sigsetjmp(__bailout, 0)==0) {
+ if (SETJMP(__bailout)==0) {
#define zend_catch \
} else { \
EG(bailout) = __orig_bailout;
diff --git a/Zend/zend_globals.h b/Zend/zend_globals.h
index 3e3e34a1d6..66997b3ae0 100644
--- a/Zend/zend_globals.h
+++ b/Zend/zend_globals.h
@@ -161,7 +161,7 @@ struct _zend_executor_globals {
HashTable included_files; /* files already included */
- sigjmp_buf *bailout;
+ JMP_BUF *bailout;
int error_reporting;
int orig_error_reporting;
diff --git a/win32/build/config.w32.h.in b/win32/build/config.w32.h.in
index 442850a3e5..5a3311856b 100644
--- a/win32/build/config.w32.h.in
+++ b/win32/build/config.w32.h.in
@@ -54,6 +54,7 @@
#define NEED_ISBLANK 1
#define DISCARD_PATH 0
#undef HAVE_SETITIMER
+#undef HAVE_SIGSETJMP
#undef HAVE_IODBC
#define HAVE_LIBDL 1
#define HAVE_GETTIMEOFDAY 1