@@ -1967,13 +1967,6 @@ ZEND_VM_HELPER(zend_do_fcall_common_helper, ANY, ANY)
19671967 LOAD_OPLINE ();
19681968
19691969 if (fbc -> type == ZEND_INTERNAL_FUNCTION ) {
1970- temp_variable * ret = & EX_T (opline -> result .var );
1971-
1972- MAKE_STD_ZVAL (ret -> var .ptr );
1973- ZVAL_NULL (ret -> var .ptr );
1974- ret -> var .ptr_ptr = & ret -> var .ptr ;
1975- ret -> var .fcall_returned_reference = (fbc -> common .fn_flags & ZEND_ACC_RETURN_REFERENCE ) != 0 ;
1976-
19771970 if (fbc -> common .arg_info ) {
19781971 zend_uint i = 0 ;
19791972 zval * * p = (zval * * )EX (function_state ).arguments ;
@@ -1985,15 +1978,24 @@ ZEND_VM_HELPER(zend_do_fcall_common_helper, ANY, ANY)
19851978 }
19861979 }
19871980
1988- if (!zend_execute_internal ) {
1989- /* saves one function call if zend_execute_internal is not used */
1990- fbc -> internal_function .handler (opline -> extended_value , ret -> var .ptr , (fbc -> common .fn_flags & ZEND_ACC_RETURN_REFERENCE ) ? & ret -> var .ptr : NULL , EX (object ), RETURN_VALUE_USED (opline ) TSRMLS_CC );
1991- } else {
1992- zend_execute_internal (execute_data , NULL , RETURN_VALUE_USED (opline ) TSRMLS_CC );
1993- }
1981+ if (EXPECTED (EG (exception ) == NULL )) {
1982+ temp_variable * ret = & EX_T (opline -> result .var );
19941983
1995- if (!RETURN_VALUE_USED (opline )) {
1996- zval_ptr_dtor (& ret -> var .ptr );
1984+ MAKE_STD_ZVAL (ret -> var .ptr );
1985+ ZVAL_NULL (ret -> var .ptr );
1986+ ret -> var .ptr_ptr = & ret -> var .ptr ;
1987+ ret -> var .fcall_returned_reference = (fbc -> common .fn_flags & ZEND_ACC_RETURN_REFERENCE ) != 0 ;
1988+
1989+ if (!zend_execute_internal ) {
1990+ /* saves one function call if zend_execute_internal is not used */
1991+ fbc -> internal_function .handler (opline -> extended_value , ret -> var .ptr , (fbc -> common .fn_flags & ZEND_ACC_RETURN_REFERENCE ) ? & ret -> var .ptr : NULL , EX (object ), RETURN_VALUE_USED (opline ) TSRMLS_CC );
1992+ } else {
1993+ zend_execute_internal (execute_data , NULL , RETURN_VALUE_USED (opline ) TSRMLS_CC );
1994+ }
1995+
1996+ if (!RETURN_VALUE_USED (opline )) {
1997+ zval_ptr_dtor (& ret -> var .ptr );
1998+ }
19971999 }
19982000 } else if (fbc -> type == ZEND_USER_FUNCTION ) {
19992001 EX (original_return_value ) = EG (return_value_ptr_ptr );
0 commit comments