@@ -1815,26 +1815,27 @@ ZEND_METHOD(ReflectionFunctionAbstract, getStaticVariables)
1815
1815
ZEND_METHOD (ReflectionFunction , invoke )
1816
1816
{
1817
1817
zval retval ;
1818
- zval * params = NULL ;
1819
- int result , num_args = 0 ;
1818
+ zval * params ;
1819
+ int result , num_args ;
1820
+ HashTable * named_params ;
1820
1821
zend_fcall_info fci ;
1821
1822
zend_fcall_info_cache fcc ;
1822
1823
reflection_object * intern ;
1823
1824
zend_function * fptr ;
1824
1825
1825
- GET_REFLECTION_OBJECT_PTR (fptr );
1826
+ ZEND_PARSE_PARAMETERS_START (0 , -1 )
1827
+ Z_PARAM_VARIADIC_WITH_NAMED (params , num_args , named_params )
1828
+ ZEND_PARSE_PARAMETERS_END ();
1826
1829
1827
- if (zend_parse_parameters (ZEND_NUM_ARGS (), "*" , & params , & num_args ) == FAILURE ) {
1828
- RETURN_THROWS ();
1829
- }
1830
+ GET_REFLECTION_OBJECT_PTR (fptr );
1830
1831
1831
1832
fci .size = sizeof (fci );
1832
1833
ZVAL_UNDEF (& fci .function_name );
1833
1834
fci .object = NULL ;
1834
1835
fci .retval = & retval ;
1835
1836
fci .param_count = num_args ;
1836
1837
fci .params = params ;
1837
- fci .named_params = NULL ;
1838
+ fci .named_params = named_params ;
1838
1839
fci .no_separation = 1 ;
1839
1840
1840
1841
fcc .function_handler = fptr ;
@@ -1868,37 +1869,26 @@ ZEND_METHOD(ReflectionFunction, invoke)
1868
1869
ZEND_METHOD (ReflectionFunction , invokeArgs )
1869
1870
{
1870
1871
zval retval ;
1871
- zval * params , * val ;
1872
1872
int result ;
1873
- int i , argc ;
1874
1873
zend_fcall_info fci ;
1875
1874
zend_fcall_info_cache fcc ;
1876
1875
reflection_object * intern ;
1877
1876
zend_function * fptr ;
1878
- zval * param_array ;
1877
+ HashTable * params ;
1879
1878
1880
1879
GET_REFLECTION_OBJECT_PTR (fptr );
1881
1880
1882
- if (zend_parse_parameters (ZEND_NUM_ARGS (), "a " , & param_array ) == FAILURE ) {
1881
+ if (zend_parse_parameters (ZEND_NUM_ARGS (), "h " , & params ) == FAILURE ) {
1883
1882
RETURN_THROWS ();
1884
1883
}
1885
1884
1886
- argc = zend_hash_num_elements (Z_ARRVAL_P (param_array ));
1887
-
1888
- params = safe_emalloc (sizeof (zval ), argc , 0 );
1889
- argc = 0 ;
1890
- ZEND_HASH_FOREACH_VAL (Z_ARRVAL_P (param_array ), val ) {
1891
- ZVAL_COPY (& params [argc ], val );
1892
- argc ++ ;
1893
- } ZEND_HASH_FOREACH_END ();
1894
-
1895
1885
fci .size = sizeof (fci );
1896
1886
ZVAL_UNDEF (& fci .function_name );
1897
1887
fci .object = NULL ;
1898
1888
fci .retval = & retval ;
1899
- fci .param_count = argc ;
1900
- fci .params = params ;
1901
- fci .named_params = NULL ;
1889
+ fci .param_count = 0 ;
1890
+ fci .params = NULL ;
1891
+ fci .named_params = params ;
1902
1892
fci .no_separation = 1 ;
1903
1893
1904
1894
fcc .function_handler = fptr ;
@@ -1912,11 +1902,6 @@ ZEND_METHOD(ReflectionFunction, invokeArgs)
1912
1902
1913
1903
result = zend_call_function (& fci , & fcc );
1914
1904
1915
- for (i = 0 ; i < argc ; i ++ ) {
1916
- zval_ptr_dtor (& params [i ]);
1917
- }
1918
- efree (params );
1919
-
1920
1905
if (result == FAILURE ) {
1921
1906
zend_throw_exception_ex (reflection_exception_ptr , 0 ,
1922
1907
"Invocation of function %s() failed" , ZSTR_VAL (fptr -> common .function_name ));
@@ -3183,14 +3168,14 @@ ZEND_METHOD(ReflectionMethod, getClosure)
3183
3168
static void reflection_method_invoke (INTERNAL_FUNCTION_PARAMETERS , int variadic )
3184
3169
{
3185
3170
zval retval ;
3186
- zval * params = NULL , * val , * object ;
3171
+ zval * params = NULL , * object ;
3172
+ HashTable * named_params = NULL ;
3187
3173
reflection_object * intern ;
3188
3174
zend_function * mptr ;
3189
- int i , argc = 0 , result ;
3175
+ int argc = 0 , result ;
3190
3176
zend_fcall_info fci ;
3191
3177
zend_fcall_info_cache fcc ;
3192
3178
zend_class_entry * obj_ce ;
3193
- zval * param_array ;
3194
3179
3195
3180
GET_REFLECTION_OBJECT_PTR (mptr );
3196
3181
@@ -3211,22 +3196,14 @@ static void reflection_method_invoke(INTERNAL_FUNCTION_PARAMETERS, int variadic)
3211
3196
}
3212
3197
3213
3198
if (variadic ) {
3214
- if (zend_parse_parameters (ZEND_NUM_ARGS (), "o!*" , & object , & params , & argc ) == FAILURE ) {
3215
- RETURN_THROWS ();
3216
- }
3199
+ ZEND_PARSE_PARAMETERS_START (1 , -1 )
3200
+ Z_PARAM_OBJECT_OR_NULL (object )
3201
+ Z_PARAM_VARIADIC_WITH_NAMED (params , argc , named_params )
3202
+ ZEND_PARSE_PARAMETERS_END ();
3217
3203
} else {
3218
- if (zend_parse_parameters (ZEND_NUM_ARGS (), "o!a " , & object , & param_array ) == FAILURE ) {
3204
+ if (zend_parse_parameters (ZEND_NUM_ARGS (), "o!h " , & object , & named_params ) == FAILURE ) {
3219
3205
RETURN_THROWS ();
3220
3206
}
3221
-
3222
- argc = zend_hash_num_elements (Z_ARRVAL_P (param_array ));
3223
-
3224
- params = safe_emalloc (sizeof (zval ), argc , 0 );
3225
- argc = 0 ;
3226
- ZEND_HASH_FOREACH_VAL (Z_ARRVAL_P (param_array ), val ) {
3227
- ZVAL_COPY (& params [argc ], val );
3228
- argc ++ ;
3229
- } ZEND_HASH_FOREACH_END ();
3230
3207
}
3231
3208
3232
3209
/* In case this is a static method, we shouldn't pass an object_ptr
@@ -3263,7 +3240,7 @@ static void reflection_method_invoke(INTERNAL_FUNCTION_PARAMETERS, int variadic)
3263
3240
fci .retval = & retval ;
3264
3241
fci .param_count = argc ;
3265
3242
fci .params = params ;
3266
- fci .named_params = NULL ;
3243
+ fci .named_params = named_params ;
3267
3244
fci .no_separation = 1 ;
3268
3245
3269
3246
fcc .function_handler = mptr ;
@@ -3279,13 +3256,6 @@ static void reflection_method_invoke(INTERNAL_FUNCTION_PARAMETERS, int variadic)
3279
3256
3280
3257
result = zend_call_function (& fci , & fcc );
3281
3258
3282
- if (!variadic ) {
3283
- for (i = 0 ; i < argc ; i ++ ) {
3284
- zval_ptr_dtor (& params [i ]);
3285
- }
3286
- efree (params );
3287
- }
3288
-
3289
3259
if (result == FAILURE ) {
3290
3260
zend_throw_exception_ex (reflection_exception_ptr , 0 ,
3291
3261
"Invocation of method %s::%s() failed" , ZSTR_VAL (mptr -> common .scope -> name ), ZSTR_VAL (mptr -> common .function_name ));
@@ -4811,29 +4781,23 @@ ZEND_METHOD(ReflectionClass, newInstance)
4811
4781
4812
4782
/* Run the constructor if there is one */
4813
4783
if (constructor ) {
4814
- zval * params = NULL ;
4815
- int i , num_args = 0 ;
4784
+ zval * params ;
4785
+ int num_args ;
4786
+ HashTable * named_params ;
4816
4787
4817
4788
if (!(constructor -> common .fn_flags & ZEND_ACC_PUBLIC )) {
4818
4789
zend_throw_exception_ex (reflection_exception_ptr , 0 , "Access to non-public constructor of class %s" , ZSTR_VAL (ce -> name ));
4819
4790
zval_ptr_dtor (return_value );
4820
4791
RETURN_NULL ();
4821
4792
}
4822
4793
4823
- if (zend_parse_parameters (ZEND_NUM_ARGS (), "*" , & params , & num_args ) == FAILURE ) {
4824
- zval_ptr_dtor (return_value );
4825
- RETURN_THROWS ();
4826
- }
4827
-
4828
- for (i = 0 ; i < num_args ; i ++ ) {
4829
- Z_TRY_ADDREF (params [i ]);
4830
- }
4831
-
4832
- zend_call_known_instance_method (constructor , Z_OBJ_P (return_value ), NULL , num_args , params );
4794
+ ZEND_PARSE_PARAMETERS_START (0 , -1 )
4795
+ Z_PARAM_VARIADIC_WITH_NAMED (params , num_args , named_params )
4796
+ ZEND_PARSE_PARAMETERS_END ();
4833
4797
4834
- for ( i = 0 ; i < num_args ; i ++ ) {
4835
- zval_ptr_dtor ( & params [ i ]);
4836
- }
4798
+ zend_call_known_function (
4799
+ constructor , Z_OBJ_P ( return_value ), Z_OBJCE_P ( return_value ), NULL ,
4800
+ num_args , params , named_params );
4837
4801
4838
4802
if (EG (exception )) {
4839
4803
zend_object_store_ctor_failed (Z_OBJ_P (return_value ));
@@ -4871,10 +4835,9 @@ ZEND_METHOD(ReflectionClass, newInstanceWithoutConstructor)
4871
4835
Returns an instance of this class */
4872
4836
ZEND_METHOD (ReflectionClass , newInstanceArgs )
4873
4837
{
4874
- zval * val ;
4875
4838
reflection_object * intern ;
4876
4839
zend_class_entry * ce , * old_scope ;
4877
- int i , argc = 0 ;
4840
+ int argc = 0 ;
4878
4841
HashTable * args ;
4879
4842
zend_function * constructor ;
4880
4843
@@ -4884,8 +4847,8 @@ ZEND_METHOD(ReflectionClass, newInstanceArgs)
4884
4847
RETURN_THROWS ();
4885
4848
}
4886
4849
4887
- if (ZEND_NUM_ARGS () > 0 ) {
4888
- argc = args -> nNumOfElements ;
4850
+ if (args ) {
4851
+ argc = zend_hash_num_elements ( args ) ;
4889
4852
}
4890
4853
4891
4854
if (UNEXPECTED (object_init_ex (return_value , ce ) != SUCCESS )) {
@@ -4899,31 +4862,14 @@ ZEND_METHOD(ReflectionClass, newInstanceArgs)
4899
4862
4900
4863
/* Run the constructor if there is one */
4901
4864
if (constructor ) {
4902
- zval * params = NULL ;
4903
-
4904
4865
if (!(constructor -> common .fn_flags & ZEND_ACC_PUBLIC )) {
4905
4866
zend_throw_exception_ex (reflection_exception_ptr , 0 , "Access to non-public constructor of class %s" , ZSTR_VAL (ce -> name ));
4906
4867
zval_ptr_dtor (return_value );
4907
4868
RETURN_NULL ();
4908
4869
}
4909
4870
4910
- if (argc ) {
4911
- params = safe_emalloc (sizeof (zval ), argc , 0 );
4912
- argc = 0 ;
4913
- ZEND_HASH_FOREACH_VAL (args , val ) {
4914
- ZVAL_COPY (& params [argc ], val );
4915
- argc ++ ;
4916
- } ZEND_HASH_FOREACH_END ();
4917
- }
4918
-
4919
- zend_call_known_instance_method (constructor , Z_OBJ_P (return_value ), NULL , argc , params );
4920
-
4921
- if (params ) {
4922
- for (i = 0 ; i < argc ; i ++ ) {
4923
- zval_ptr_dtor (& params [i ]);
4924
- }
4925
- efree (params );
4926
- }
4871
+ zend_call_known_function (
4872
+ constructor , Z_OBJ_P (return_value ), Z_OBJCE_P (return_value ), NULL , 0 , NULL , args );
4927
4873
4928
4874
if (EG (exception )) {
4929
4875
zend_object_store_ctor_failed (Z_OBJ_P (return_value ));
0 commit comments