@@ -5431,17 +5431,26 @@ ZEND_VM_HANDLER(164, ZEND_RECV_VARIADIC, NUM, UNUSED, CACHE_SLOT)
5431
5431
if (EX_CALL_INFO () & ZEND_CALL_HAS_EXTRA_NAMED_PARAMS ) {
5432
5432
zend_string * name ;
5433
5433
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 )))) {
5439
5439
HANDLE_EXCEPTION ();
5440
5440
}
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
+ }
5445
5454
}
5446
5455
5447
5456
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION ();
@@ -8388,14 +8397,21 @@ ZEND_VM_HANDLER(158, ZEND_CALL_TRAMPOLINE, ANY, ANY)
8388
8397
ZEND_CALL_NUM_ARGS (call ) = 2 ;
8389
8398
8390
8399
ZVAL_STR (ZEND_CALL_ARG (call , 1 ), fbc -> common .function_name );
8400
+
8401
+ zval * call_args = ZEND_CALL_ARG (call , 2 );
8391
8402
if (args ) {
8392
- ZVAL_ARR (ZEND_CALL_ARG ( call , 2 ) , args );
8403
+ ZVAL_ARR (call_args , args );
8393
8404
} else {
8394
- ZVAL_EMPTY_ARRAY (ZEND_CALL_ARG ( call , 2 ) );
8405
+ ZVAL_EMPTY_ARRAY (call_args );
8395
8406
}
8396
8407
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
+ }
8399
8415
}
8400
8416
zend_free_trampoline (fbc );
8401
8417
fbc = call -> func ;
0 commit comments