summaryrefslogtreecommitdiff
path: root/Zend/zend_builtin_functions.c
diff options
context:
space:
mode:
authorXinchen Hui <laruence@gmail.com>2012-03-24 15:13:10 +0800
committerXinchen Hui <laruence@gmail.com>2012-03-24 15:13:10 +0800
commitfcae164ea63979d7814d7aa114fe8351033e7400 (patch)
tree8f19f67f8b8ade2bb8c0c8d0d14136a25c44496a /Zend/zend_builtin_functions.c
parent9a87fe1c529eabc7aeec4559d916dda5fda3cdd2 (diff)
downloadphp-git-fcae164ea63979d7814d7aa114fe8351033e7400.tar.gz
Implemented FR #60738 (Allow 'set_error_handler' to handle NULL)
Diffstat (limited to 'Zend/zend_builtin_functions.c')
-rw-r--r--Zend/zend_builtin_functions.c56
1 files changed, 29 insertions, 27 deletions
diff --git a/Zend/zend_builtin_functions.c b/Zend/zend_builtin_functions.c
index 57a9e3a7bc..c4a10fde37 100644
--- a/Zend/zend_builtin_functions.c
+++ b/Zend/zend_builtin_functions.c
@@ -1413,7 +1413,6 @@ ZEND_FUNCTION(trigger_error)
ZEND_FUNCTION(set_error_handler)
{
zval *error_handler;
- zend_bool had_orig_error_handler=0;
char *error_handler_name = NULL;
long error_type = E_ALL | E_STRICT;
@@ -1421,37 +1420,40 @@ ZEND_FUNCTION(set_error_handler)
return;
}
- if (!zend_is_callable(error_handler, 0, &error_handler_name TSRMLS_CC)) {
- zend_error(E_WARNING, "%s() expects the argument (%s) to be a valid callback",
- get_active_function_name(TSRMLS_C), error_handler_name?error_handler_name:"unknown");
+ if (IS_NULL != Z_TYPE_P(error_handler)) {
+ zend_bool had_orig_error_handler = 0;
+ if (!zend_is_callable(error_handler, 0, &error_handler_name TSRMLS_CC)) {
+ zend_error(E_WARNING, "%s() expects the argument (%s) to be a valid callback",
+ get_active_function_name(TSRMLS_C), error_handler_name?error_handler_name:"unknown");
+ efree(error_handler_name);
+ return;
+ }
efree(error_handler_name);
- return;
- }
- efree(error_handler_name);
- if (EG(user_error_handler)) {
- had_orig_error_handler = 1;
- *return_value = *EG(user_error_handler);
- zval_copy_ctor(return_value);
- INIT_PZVAL(return_value);
- zend_stack_push(&EG(user_error_handlers_error_reporting), &EG(user_error_handler_error_reporting), sizeof(EG(user_error_handler_error_reporting)));
- zend_ptr_stack_push(&EG(user_error_handlers), EG(user_error_handler));
- }
- ALLOC_ZVAL(EG(user_error_handler));
+ if (EG(user_error_handler)) {
+ had_orig_error_handler = 1;
+ *return_value = *EG(user_error_handler);
+ zval_copy_ctor(return_value);
+ INIT_PZVAL(return_value);
+ zend_stack_push(&EG(user_error_handlers_error_reporting), &EG(user_error_handler_error_reporting), sizeof(EG(user_error_handler_error_reporting)));
+ zend_ptr_stack_push(&EG(user_error_handlers), EG(user_error_handler));
+ }
- if (!zend_is_true(error_handler)) { /* unset user-defined handler */
- FREE_ZVAL(EG(user_error_handler));
- EG(user_error_handler) = NULL;
- RETURN_TRUE;
- }
+ ALLOC_ZVAL(EG(user_error_handler));
+ EG(user_error_handler_error_reporting) = (int)error_type;
+ MAKE_COPY_ZVAL(&error_handler, EG(user_error_handler));
- EG(user_error_handler_error_reporting) = (int)error_type;
- *EG(user_error_handler) = *error_handler;
- zval_copy_ctor(EG(user_error_handler));
- INIT_PZVAL(EG(user_error_handler));
+ if (!had_orig_error_handler) {
+ RETURN_NULL();
+ }
+ } else { /* unset user-defined handler */
+ if (EG(user_error_handler)) {
+ zend_stack_push(&EG(user_error_handlers_error_reporting), &EG(user_error_handler_error_reporting), sizeof(EG(user_error_handler_error_reporting)));
+ zend_ptr_stack_push(&EG(user_error_handlers), EG(user_error_handler));
+ }
- if (!had_orig_error_handler) {
- RETURN_NULL();
+ EG(user_error_handler) = NULL;
+ RETURN_TRUE;
}
}
/* }}} */