mirror of
https://github.com/php/php-src.git
synced 2024-11-24 18:34:21 +08:00
Improve set_exception_handler
Remove useless alloc/free and return_value copy while doing reset exception handler
This commit is contained in:
parent
114d662d12
commit
4130f5a43c
1
NEWS
1
NEWS
@ -38,6 +38,7 @@ PHP NEWS
|
||||
. Fixed bug #60569 (Nullbyte truncates Exception $message). (Ilia)
|
||||
. Fixed bug #52719 (array_walk_recursive crashes if third param of the
|
||||
function is by reference). (Nikita Popov)
|
||||
. Improve performance of set_exception handler while doing reset (Laruence)
|
||||
|
||||
- FPM
|
||||
. Fixed bug #61430 (Transposed memset() params in sapi/fpm/fpm/fpm_shm.c).
|
||||
|
@ -1585,41 +1585,42 @@ ZEND_FUNCTION(set_exception_handler)
|
||||
{
|
||||
zval *exception_handler;
|
||||
char *exception_handler_name = NULL;
|
||||
zend_bool had_orig_exception_handler=0;
|
||||
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &exception_handler) == FAILURE) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (Z_TYPE_P(exception_handler) != IS_NULL) { /* NULL == unset */
|
||||
zend_bool had_orig_exception_handler = 0;
|
||||
|
||||
if (!zend_is_callable(exception_handler, 0, &exception_handler_name TSRMLS_CC)) {
|
||||
zend_error(E_WARNING, "%s() expects the argument (%s) to be a valid callback",
|
||||
get_active_function_name(TSRMLS_C), exception_handler_name?exception_handler_name:"unknown");
|
||||
get_active_function_name(TSRMLS_C), exception_handler_name?exception_handler_name:"unknown");
|
||||
efree(exception_handler_name);
|
||||
return;
|
||||
}
|
||||
efree(exception_handler_name);
|
||||
}
|
||||
|
||||
if (EG(user_exception_handler)) {
|
||||
had_orig_exception_handler = 1;
|
||||
*return_value = *EG(user_exception_handler);
|
||||
zval_copy_ctor(return_value);
|
||||
zend_ptr_stack_push(&EG(user_exception_handlers), EG(user_exception_handler));
|
||||
}
|
||||
ALLOC_ZVAL(EG(user_exception_handler));
|
||||
if (EG(user_exception_handler)) {
|
||||
had_orig_exception_handler = 1;
|
||||
*return_value = *EG(user_exception_handler);
|
||||
zval_copy_ctor(return_value);
|
||||
zend_ptr_stack_push(&EG(user_exception_handlers), EG(user_exception_handler));
|
||||
}
|
||||
|
||||
if (Z_TYPE_P(exception_handler) == IS_NULL) { /* unset user-defined handler */
|
||||
FREE_ZVAL(EG(user_exception_handler));
|
||||
ALLOC_ZVAL(EG(user_exception_handler));
|
||||
MAKE_COPY_ZVAL(&exception_handler, EG(user_exception_handler));
|
||||
|
||||
if (!had_orig_exception_handler) {
|
||||
RETURN_NULL();
|
||||
}
|
||||
} else {
|
||||
if (EG(user_exception_handler)) {
|
||||
zend_ptr_stack_push(&EG(user_exception_handlers), EG(user_exception_handler));
|
||||
}
|
||||
EG(user_exception_handler) = NULL;
|
||||
RETURN_TRUE;
|
||||
}
|
||||
|
||||
MAKE_COPY_ZVAL(&exception_handler, EG(user_exception_handler));
|
||||
|
||||
if (!had_orig_exception_handler) {
|
||||
RETURN_NULL();
|
||||
}
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user