@@ -5431,17 +5431,26 @@ ZEND_VM_HANDLER(164, ZEND_RECV_VARIADIC, NUM, UNUSED, CACHE_SLOT)
54315431 if (EX_CALL_INFO () & ZEND_CALL_HAS_EXTRA_NAMED_PARAMS ) {
54325432 zend_string * name ;
54335433 zval * param ;
5434-
5435- SEPARATE_ARRAY ( params );
5436- ZEND_HASH_FOREACH_STR_KEY_VAL ( EX ( extra_named_params ), name , param ) {
5437- if ( UNEXPECTED (( EX (func ) -> op_array . fn_flags & ZEND_ACC_HAS_TYPE_HINTS ) != 0 ) ) {
5438- if (UNEXPECTED (!zend_verify_variadic_arg_type (EX (func ), arg_num , param , CACHE_ADDR (opline -> extended_value )))) {
5434+ zend_arg_info * arg_info = & EX ( func ) -> common . arg_info [ EX ( func ) -> common . num_args ];
5435+ if ( ZEND_TYPE_IS_SET ( arg_info -> type )) {
5436+ SEPARATE_ARRAY ( params );
5437+ ZEND_HASH_FOREACH_STR_KEY_VAL ( EX (extra_named_params ), name , param ) {
5438+ if (UNEXPECTED (!zend_verify_variadic_arg_type (EX (func ), arg_info , arg_num , param , CACHE_ADDR (opline -> extended_value )))) {
54395439 HANDLE_EXCEPTION ();
54405440 }
5441- }
5442- Z_TRY_ADDREF_P (param );
5443- zend_hash_add_new (Z_ARRVAL_P (params ), name , param );
5444- } ZEND_HASH_FOREACH_END ();
5441+ Z_TRY_ADDREF_P (param );
5442+ zend_hash_add_new (Z_ARRVAL_P (params ), name , param );
5443+ } ZEND_HASH_FOREACH_END ();
5444+ } else if (zend_hash_num_elements (Z_ARRVAL_P (params )) == 0 ) {
5445+ GC_ADDREF (EX (extra_named_params ));
5446+ ZVAL_ARR (params , EX (extra_named_params ));
5447+ } else {
5448+ SEPARATE_ARRAY (params );
5449+ ZEND_HASH_FOREACH_STR_KEY_VAL (EX (extra_named_params ), name , param ) {
5450+ Z_TRY_ADDREF_P (param );
5451+ zend_hash_add_new (Z_ARRVAL_P (params ), name , param );
5452+ } ZEND_HASH_FOREACH_END ();
5453+ }
54455454 }
54465455
54475456 ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION ();
@@ -8388,14 +8397,21 @@ ZEND_VM_HANDLER(158, ZEND_CALL_TRAMPOLINE, ANY, ANY)
83888397 ZEND_CALL_NUM_ARGS (call ) = 2 ;
83898398
83908399 ZVAL_STR (ZEND_CALL_ARG (call , 1 ), fbc -> common .function_name );
8400+
8401+ zval * call_args = ZEND_CALL_ARG (call , 2 );
83918402 if (args ) {
8392- ZVAL_ARR (ZEND_CALL_ARG ( call , 2 ) , args );
8403+ ZVAL_ARR (call_args , args );
83938404 } else {
8394- ZVAL_EMPTY_ARRAY (ZEND_CALL_ARG ( call , 2 ) );
8405+ ZVAL_EMPTY_ARRAY (call_args );
83958406 }
83968407 if (UNEXPECTED (call_info & ZEND_CALL_HAS_EXTRA_NAMED_PARAMS )) {
8397- SEPARATE_ARRAY (ZEND_CALL_ARG (call , 2 ));
8398- zend_hash_copy (Z_ARRVAL_P (ZEND_CALL_ARG (call , 2 )), call -> extra_named_params , zval_add_ref );
8408+ if (zend_hash_num_elements (Z_ARRVAL_P (call_args )) == 0 ) {
8409+ GC_ADDREF (call -> extra_named_params );
8410+ ZVAL_ARR (call_args , call -> extra_named_params );
8411+ } else {
8412+ SEPARATE_ARRAY (call_args );
8413+ zend_hash_copy (Z_ARRVAL_P (call_args ), call -> extra_named_params , zval_add_ref );
8414+ }
83998415 }
84008416 zend_free_trampoline (fbc );
84018417 fbc = call -> func ;
0 commit comments