@@ -5039,6 +5039,7 @@ ZEND_VM_C_LABEL(send_again):
5039
5039
break ;
5040
5040
}
5041
5041
5042
+ zend_string * name = NULL ;
5042
5043
if (iter -> funcs -> get_current_key ) {
5043
5044
zval key ;
5044
5045
iter -> funcs -> get_current_key (iter , & key );
@@ -5048,15 +5049,24 @@ ZEND_VM_C_LABEL(send_again):
5048
5049
5049
5050
// TODO: Support named params.
5050
5051
if (UNEXPECTED (Z_TYPE (key ) != IS_LONG )) {
5051
- zend_throw_error (NULL ,
5052
- (Z_TYPE (key ) == IS_STRING ) ?
5053
- "Cannot unpack Traversable with string keys" :
5054
- "Cannot unpack Traversable with non-integer keys" );
5055
- zval_ptr_dtor (& key );
5056
- break ;
5052
+ if (UNEXPECTED (Z_TYPE (key ) != IS_STRING )) {
5053
+ zend_throw_error (NULL ,
5054
+ "Keys must be of type int|string during argument unpacking" );
5055
+ zval_ptr_dtor (& key );
5056
+ break ;
5057
+ }
5058
+
5059
+ name = Z_STR_P (& key );
5057
5060
}
5058
5061
}
5059
5062
5063
+ if (name ) {
5064
+ void * cache_slot [2 ] = {NULL , NULL };
5065
+ have_named_params = 1 ;
5066
+ top = zend_handle_named_arg (& EX (call ), name , & arg_num , cache_slot );
5067
+ } else {
5068
+ }
5069
+
5060
5070
if (ARG_MUST_BE_SENT_BY_REF (EX (call )-> func , arg_num )) {
5061
5071
zend_error (
5062
5072
E_WARNING , "Cannot pass by-reference argument %d of %s%s%s()"
@@ -5075,6 +5085,9 @@ ZEND_VM_C_LABEL(send_again):
5075
5085
ZVAL_COPY_VALUE (top , arg );
5076
5086
ZEND_CALL_NUM_ARGS (EX (call ))++ ;
5077
5087
5088
+ if (name ) {
5089
+ zend_string_release (name );
5090
+ }
5078
5091
iter -> funcs -> move_forward (iter );
5079
5092
}
5080
5093
0 commit comments