@@ -72,13 +72,12 @@ zend_result zend_startup_builtin_functions(void) /* {{{ */
7272ZEND_FUNCTION (clone )
7373{
7474 zend_object * zobj ;
75- zval * args ;
76- uint32_t argc ;
77- HashTable * named_params ;
75+ HashTable * with = NULL ;
7876
79- ZEND_PARSE_PARAMETERS_START (1 , -1 )
77+ ZEND_PARSE_PARAMETERS_START (1 , 2 )
8078 Z_PARAM_OBJ (zobj )
81- Z_PARAM_VARIADIC_WITH_NAMED (args , argc , named_params );
79+ Z_PARAM_OPTIONAL
80+ Z_PARAM_ARRAY_HT (with )
8281 ZEND_PARSE_PARAMETERS_END ();
8382
8483 zend_class_entry * scope = zend_get_executed_scope ();
@@ -107,26 +106,9 @@ ZEND_FUNCTION(clone)
107106
108107 zend_object * cloned ;
109108 if (zobj -> handlers -> clone_obj_with ) {
110- if (UNEXPECTED (argc > 0 )) {
111- HashTable params ;
112- zend_hash_init (& params , argc + (named_params ? zend_hash_num_elements (named_params ) : 0 ), NULL , NULL , false);
113- for (uint32_t i = 0 ; i < argc ; i ++ ) {
114- zend_hash_index_add_new (& params , i , & args [i ]);
115- }
116- if (named_params != NULL ) {
117- zend_string * key ;
118- zval * val ;
119- ZEND_HASH_FOREACH_STR_KEY_VAL (named_params , key , val ) {
120- zend_hash_update (& params , key , val );
121- } ZEND_HASH_FOREACH_END ();
122- }
123- cloned = zobj -> handlers -> clone_obj_with (zobj , scope , & params );
124- zend_hash_destroy (& params );
125- } else {
126- cloned = zobj -> handlers -> clone_obj_with (zobj , scope , named_params );
127- }
109+ cloned = zobj -> handlers -> clone_obj_with (zobj , scope , with );
128110 } else {
129- if (UNEXPECTED (named_params || argc > 0 )) {
111+ if (UNEXPECTED (with != NULL && zend_hash_num_elements ( with ) > 0 )) {
130112 zend_throw_error (NULL , "Trying to clone an object with updated properties that is not compatible %s" , ZSTR_VAL (ce -> name ));
131113 RETURN_THROWS ();
132114 }
0 commit comments