@@ -4075,8 +4075,12 @@ ZEND_VM_HOT_HANDLER(131, ZEND_DO_FCALL_BY_NAME, ANY, ANY, SPEC(RETVAL))
4075
4075
if (UNEXPECTED ((fbc -> common .fn_flags & ZEND_ACC_DEPRECATED ) != 0 )) {
4076
4076
zend_deprecated_function (fbc );
4077
4077
if (UNEXPECTED (EG (exception ) != NULL )) {
4078
- UNDEF_RESULT ();
4079
- HANDLE_EXCEPTION ();
4078
+ UNDEF_RESULT ();
4079
+ if (!RETURN_VALUE_USED (opline )) {
4080
+ ret = & retval ;
4081
+ ZVAL_UNDEF (ret );
4082
+ }
4083
+ ZEND_VM_C_GOTO (fcall_end );
4080
4084
}
4081
4085
}
4082
4086
@@ -4085,10 +4089,12 @@ ZEND_VM_HOT_HANDLER(131, ZEND_DO_FCALL_BY_NAME, ANY, ANY, SPEC(RETVAL))
4085
4089
4086
4090
if (UNEXPECTED (fbc -> common .fn_flags & ZEND_ACC_HAS_TYPE_HINTS )
4087
4091
&& UNEXPECTED (!zend_verify_internal_arg_types (fbc , call ))) {
4088
- zend_vm_stack_free_call_frame (call );
4089
- zend_rethrow_exception (execute_data );
4090
- UNDEF_RESULT ();
4091
- HANDLE_EXCEPTION ();
4092
+ UNDEF_RESULT ();
4093
+ if (!RETURN_VALUE_USED (opline )) {
4094
+ ret = & retval ;
4095
+ ZVAL_UNDEF (ret );
4096
+ }
4097
+ ZEND_VM_C_GOTO (fcall_end );
4092
4098
}
4093
4099
4094
4100
ret = RETURN_VALUE_USED (opline ) ? EX_VAR (opline -> result .var ) : & retval ;
@@ -4106,6 +4112,8 @@ ZEND_VM_HOT_HANDLER(131, ZEND_DO_FCALL_BY_NAME, ANY, ANY, SPEC(RETVAL))
4106
4112
#endif
4107
4113
4108
4114
EG (current_execute_data ) = execute_data ;
4115
+
4116
+ ZEND_VM_C_LABEL (fcall_end ):
4109
4117
zend_vm_stack_free_args (call );
4110
4118
zend_vm_stack_free_call_frame (call );
4111
4119
@@ -4128,6 +4136,7 @@ ZEND_VM_HOT_HANDLER(60, ZEND_DO_FCALL, ANY, ANY, SPEC(RETVAL))
4128
4136
zend_execute_data * call = EX (call );
4129
4137
zend_function * fbc = call -> func ;
4130
4138
zval * ret ;
4139
+ zval retval ;
4131
4140
4132
4141
SAVE_OPLINE ();
4133
4142
EX (call ) = call -> prev_execute_data ;
@@ -4136,7 +4145,10 @@ ZEND_VM_HOT_HANDLER(60, ZEND_DO_FCALL, ANY, ANY, SPEC(RETVAL))
4136
4145
zend_abstract_method (fbc );
4137
4146
ZEND_VM_C_LABEL (fcall_except ):
4138
4147
UNDEF_RESULT ();
4139
- zend_vm_stack_free_args (call );
4148
+ if (!RETURN_VALUE_USED (opline )) {
4149
+ ret = & retval ;
4150
+ ZVAL_UNDEF (ret );
4151
+ }
4140
4152
ZEND_VM_C_GOTO (fcall_end );
4141
4153
} else {
4142
4154
zend_deprecated_function (fbc );
@@ -4167,15 +4179,12 @@ ZEND_VM_C_LABEL(fcall_except):
4167
4179
zend_execute_ex (call );
4168
4180
}
4169
4181
} else if (EXPECTED (fbc -> type < ZEND_USER_FUNCTION )) {
4170
- zval retval ;
4171
-
4172
4182
call -> prev_execute_data = execute_data ;
4173
4183
EG (current_execute_data ) = call ;
4174
4184
4175
4185
if (UNEXPECTED (fbc -> common .fn_flags & ZEND_ACC_HAS_TYPE_HINTS )
4176
4186
&& UNEXPECTED (!zend_verify_internal_arg_types (fbc , call ))) {
4177
- UNDEF_RESULT ();
4178
- ZEND_VM_C_GOTO (fcall_end );
4187
+ ZEND_VM_C_GOTO (fcall_except );
4179
4188
}
4180
4189
4181
4190
ret = RETURN_VALUE_USED (opline ) ? EX_VAR (opline -> result .var ) : & retval ;
@@ -4198,15 +4207,13 @@ ZEND_VM_C_LABEL(fcall_except):
4198
4207
#endif
4199
4208
4200
4209
EG (current_execute_data ) = execute_data ;
4201
- zend_vm_stack_free_args (call );
4202
4210
4211
+ ZEND_VM_C_LABEL (fcall_end ):
4212
+ zend_vm_stack_free_args (call );
4203
4213
if (!RETURN_VALUE_USED (opline )) {
4204
4214
i_zval_ptr_dtor (ret );
4205
4215
}
4206
-
4207
4216
} else { /* ZEND_OVERLOADED_FUNCTION */
4208
- zval retval ;
4209
-
4210
4217
ret = RETURN_VALUE_USED (opline ) ? EX_VAR (opline -> result .var ) : & retval ;
4211
4218
4212
4219
call -> prev_execute_data = execute_data ;
@@ -4221,7 +4228,6 @@ ZEND_VM_C_LABEL(fcall_except):
4221
4228
}
4222
4229
}
4223
4230
4224
- ZEND_VM_C_LABEL (fcall_end ):
4225
4231
if (UNEXPECTED (ZEND_CALL_INFO (call ) & ZEND_CALL_RELEASE_THIS )) {
4226
4232
OBJ_RELEASE (Z_OBJ (call -> This ));
4227
4233
}
@@ -8291,14 +8297,13 @@ ZEND_VM_HANDLER(158, ZEND_CALL_TRAMPOLINE, ANY, ANY)
8291
8297
8292
8298
EG (current_execute_data ) = call -> prev_execute_data ;
8293
8299
8300
+ ZEND_VM_C_LABEL (call_trampoline_end ):
8294
8301
zend_vm_stack_free_args (call );
8295
-
8296
8302
if (ret == & retval ) {
8297
8303
zval_ptr_dtor (ret );
8298
8304
}
8299
8305
}
8300
8306
8301
- ZEND_VM_C_LABEL (call_trampoline_end ):
8302
8307
execute_data = EG (current_execute_data );
8303
8308
8304
8309
if (!EX (func ) || !ZEND_USER_CODE (EX (func )-> type ) || (call_info & ZEND_CALL_TOP )) {
0 commit comments