@@ -2301,10 +2301,6 @@ ZEND_VM_HELPER(zend_do_fcall_common_helper, ANY, ANY)
2301
2301
EX (function_state ).arguments = zend_vm_stack_push_args (opline -> extended_value TSRMLS_CC );
2302
2302
2303
2303
if (EX (function_state ).function -> type == ZEND_INTERNAL_FUNCTION ) {
2304
- ALLOC_INIT_ZVAL (EX_T (opline -> result .u .var ).var .ptr );
2305
- EX_T (opline -> result .u .var ).var .ptr_ptr = & EX_T (opline -> result .u .var ).var .ptr ;
2306
- EX_T (opline -> result .u .var ).var .fcall_returned_reference = EX (function_state ).function -> common .return_reference ;
2307
-
2308
2304
if (EX (function_state ).function -> common .arg_info ) {
2309
2305
zend_uint i = 0 ;
2310
2306
zval * * p = (zval * * )EX (function_state ).arguments ;
@@ -2315,15 +2311,22 @@ ZEND_VM_HELPER(zend_do_fcall_common_helper, ANY, ANY)
2315
2311
arg_count -- ;
2316
2312
}
2317
2313
}
2318
- if (!zend_execute_internal ) {
2319
- /* saves one function call if zend_execute_internal is not used */
2320
- ((zend_internal_function * ) EX (function_state ).function )-> handler (opline -> extended_value , EX_T (opline -> result .u .var ).var .ptr , EX (function_state ).function -> common .return_reference ?& EX_T (opline -> result .u .var ).var .ptr :NULL , EX (object ), RETURN_VALUE_USED (opline ) TSRMLS_CC );
2321
- } else {
2322
- zend_execute_internal (EXECUTE_DATA , RETURN_VALUE_USED (opline ) TSRMLS_CC );
2323
- }
2324
2314
2325
- if (!RETURN_VALUE_USED (opline )) {
2326
- zval_ptr_dtor (& EX_T (opline -> result .u .var ).var .ptr );
2315
+ if (EXPECTED (EG (exception ) == NULL )) {
2316
+ ALLOC_INIT_ZVAL (EX_T (opline -> result .u .var ).var .ptr );
2317
+ EX_T (opline -> result .u .var ).var .ptr_ptr = & EX_T (opline -> result .u .var ).var .ptr ;
2318
+ EX_T (opline -> result .u .var ).var .fcall_returned_reference = EX (function_state ).function -> common .return_reference ;
2319
+
2320
+ if (!zend_execute_internal ) {
2321
+ /* saves one function call if zend_execute_internal is not used */
2322
+ ((zend_internal_function * ) EX (function_state ).function )-> handler (opline -> extended_value , EX_T (opline -> result .u .var ).var .ptr , EX (function_state ).function -> common .return_reference ?& EX_T (opline -> result .u .var ).var .ptr :NULL , EX (object ), RETURN_VALUE_USED (opline ) TSRMLS_CC );
2323
+ } else {
2324
+ zend_execute_internal (EXECUTE_DATA , RETURN_VALUE_USED (opline ) TSRMLS_CC );
2325
+ }
2326
+
2327
+ if (!RETURN_VALUE_USED (opline )) {
2328
+ zval_ptr_dtor (& EX_T (opline -> result .u .var ).var .ptr );
2329
+ }
2327
2330
}
2328
2331
} else if (EX (function_state ).function -> type == ZEND_USER_FUNCTION ) {
2329
2332
EX (original_return_value ) = EG (return_value_ptr_ptr );
0 commit comments