summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortwosee <twose@qq.com>2020-08-28 00:54:46 +0800
committertwosee <twose@qq.com>2020-08-30 16:24:42 +0800
commite948188832185171182a274567146757c13b9fac (patch)
tree16e8a87ccbffd6e7cc262781a2765a7d881f501b
parent62dce97973436f1830b18304e7939a03b18d44ba (diff)
downloadphp-git-e948188832185171182a274567146757c13b9fac.tar.gz
Improve error_handing replacement functions
We explicitly skip calls to user_error_handler in EH_THROW mode Closes GH-6050.
-rw-r--r--Zend/zend_API.c45
1 files changed, 4 insertions, 41 deletions
diff --git a/Zend/zend_API.c b/Zend/zend_API.c
index bc67c6a1b6..4b659fe32a 100644
--- a/Zend/zend_API.c
+++ b/Zend/zend_API.c
@@ -4230,7 +4230,7 @@ ZEND_API void zend_save_error_handling(zend_error_handling *current) /* {{{ */
{
current->handling = EG(error_handling);
current->exception = EG(exception_class);
- ZVAL_COPY(&current->user_handler, &EG(user_error_handler));
+ ZVAL_UNDEF(&current->user_handler);
}
/* }}} */
@@ -4238,54 +4238,17 @@ ZEND_API void zend_replace_error_handling(zend_error_handling_t error_handling,
{
if (current) {
zend_save_error_handling(current);
- if (error_handling != EH_NORMAL && Z_TYPE(EG(user_error_handler)) != IS_UNDEF) {
- zval_ptr_dtor(&EG(user_error_handler));
- ZVAL_UNDEF(&EG(user_error_handler));
- }
}
+ ZEND_ASSERT(error_handling == EH_THROW || exception_class == NULL);
EG(error_handling) = error_handling;
- EG(exception_class) = error_handling == EH_THROW ? exception_class : NULL;
-}
-/* }}} */
-
-static int same_zval(zval *zv1, zval *zv2) /* {{{ */
-{
- if (Z_TYPE_P(zv1) != Z_TYPE_P(zv2)) {
- return 0;
- }
- switch (Z_TYPE_P(zv1)) {
- case IS_UNDEF:
- case IS_NULL:
- case IS_FALSE:
- case IS_TRUE:
- return 1;
- case IS_LONG:
- return Z_LVAL_P(zv1) == Z_LVAL_P(zv2);
- case IS_DOUBLE:
- return Z_LVAL_P(zv1) == Z_LVAL_P(zv2);
- case IS_STRING:
- case IS_ARRAY:
- case IS_OBJECT:
- case IS_RESOURCE:
- return Z_COUNTED_P(zv1) == Z_COUNTED_P(zv2);
- default:
- return 0;
- }
+ EG(exception_class) = exception_class;
}
/* }}} */
ZEND_API void zend_restore_error_handling(zend_error_handling *saved) /* {{{ */
{
EG(error_handling) = saved->handling;
- EG(exception_class) = saved->handling == EH_THROW ? saved->exception : NULL;
- if (Z_TYPE(saved->user_handler) != IS_UNDEF
- && !same_zval(&saved->user_handler, &EG(user_error_handler))) {
- zval_ptr_dtor(&EG(user_error_handler));
- ZVAL_COPY_VALUE(&EG(user_error_handler), &saved->user_handler);
- } else if (Z_TYPE(saved->user_handler)) {
- zval_ptr_dtor(&saved->user_handler);
- }
- ZVAL_UNDEF(&saved->user_handler);
+ EG(exception_class) = saved->exception;
}
/* }}} */