@@ -1153,18 +1153,12 @@ PHP_METHOD(ArrayObject, count)
11531153 RETURN_LONG (spl_array_object_count_elements_helper (intern ));
11541154} /* }}} */
11551155
1156- enum spl_array_object_sort_methods {
1157- SPL_NAT_SORT ,
1158- SPL_CALLBACK_SORT ,
1159- SPL_OPTIONAL_FLAG_SORT
1160- };
1161-
1162- static void spl_array_method (INTERNAL_FUNCTION_PARAMETERS , const char * fname , size_t fname_len , enum spl_array_object_sort_methods use_arg ) /* {{{ */
1156+ static void spl_array_method (zval * return_value , spl_array_object * intern , const char * fname , size_t fname_len , const zval * extra_arg ) /* {{{ */
11631157{
1164- spl_array_object * intern = Z_SPLARRAY_P (ZEND_THIS );
11651158 HashTable * * ht_ptr = spl_array_get_hash_table_ptr (intern );
11661159 HashTable * aht = * ht_ptr ;
1167- zval params [2 ], * arg = NULL ;
1160+ zval params [2 ];
1161+ uint32_t param_num = 1 ;
11681162
11691163 zend_function * fn = zend_hash_str_find_ptr (EG (function_table ), fname , fname_len );
11701164 if (UNEXPECTED (fn == NULL )) {
@@ -1176,68 +1170,85 @@ static void spl_array_method(INTERNAL_FUNCTION_PARAMETERS, const char *fname, si
11761170 ZVAL_ARR (Z_REFVAL (params [0 ]), aht );
11771171 GC_ADDREF (aht );
11781172
1179- if (use_arg == SPL_NAT_SORT ) {
1180- if (zend_parse_parameters_none () == FAILURE ) {
1181- goto exit ;
1182- }
1183-
1184- intern -> nApplyCount ++ ;
1185- zend_call_known_function (fn , NULL , NULL , return_value , 1 , params , NULL );
1186- intern -> nApplyCount -- ;
1187- } else if (use_arg == SPL_OPTIONAL_FLAG_SORT ) {
1188- zend_long sort_flags = 0 ;
1189- if (zend_parse_parameters (ZEND_NUM_ARGS (), "|l" , & sort_flags ) == FAILURE ) {
1190- goto exit ;
1191- }
1192- ZVAL_LONG (& params [1 ], sort_flags );
1193- intern -> nApplyCount ++ ;
1194- zend_call_known_function (fn , NULL , NULL , return_value , 2 , params , NULL );
1195- intern -> nApplyCount -- ;
1196- } else {
1197- ZEND_ASSERT (use_arg == SPL_CALLBACK_SORT );
1198- if (zend_parse_parameters (ZEND_NUM_ARGS (), "z" , & arg ) == FAILURE ) {
1199- goto exit ;
1200- }
1201- ZVAL_COPY_VALUE (& params [1 ], arg );
1202- intern -> nApplyCount ++ ;
1203- zend_call_known_function (fn , NULL , NULL , return_value , 2 , params , NULL );
1204- intern -> nApplyCount -- ;
1173+ if (extra_arg ) {
1174+ param_num = 2 ;
1175+ ZVAL_COPY_VALUE (& params [1 ], extra_arg );
12051176 }
1177+ intern -> nApplyCount ++ ;
1178+ zend_call_known_function (fn , NULL , NULL , return_value , param_num , params , NULL );
1179+ intern -> nApplyCount -- ;
12061180
1207- exit :
1208- {
1209- zval * ht_zv = Z_REFVAL (params [0 ]);
1210- zend_array_release (* ht_ptr );
1211- SEPARATE_ARRAY (ht_zv );
1212- * ht_ptr = Z_ARRVAL_P (ht_zv );
1213- ZVAL_NULL (ht_zv );
1214- zval_ptr_dtor (& params [0 ]);
1215- }
1181+ zval * ht_zv = Z_REFVAL (params [0 ]);
1182+ zend_array_release (* ht_ptr );
1183+ SEPARATE_ARRAY (ht_zv );
1184+ * ht_ptr = Z_ARRVAL_P (ht_zv );
1185+ ZVAL_NULL (ht_zv );
1186+ zval_ptr_dtor (& params [0 ]);
12161187} /* }}} */
12171188
1218- #define SPL_ARRAY_METHOD (cname , fname , use_arg ) \
1219- PHP_METHOD(cname, fname) \
1220- { \
1221- spl_array_method(INTERNAL_FUNCTION_PARAM_PASSTHRU, #fname, sizeof(#fname)-1, use_arg); \
1222- }
1223-
12241189/* Sort the entries by values. */
1225- SPL_ARRAY_METHOD (ArrayObject , asort , SPL_OPTIONAL_FLAG_SORT )
1190+ PHP_METHOD (ArrayObject , asort )
1191+ {
1192+ zend_long sort_flags = 0 ;
1193+ if (zend_parse_parameters (ZEND_NUM_ARGS (), "|l" , & sort_flags ) == FAILURE ) {
1194+ RETURN_THROWS ();
1195+ }
1196+ zval sort_flag_param ;
1197+ ZVAL_LONG (& sort_flag_param , sort_flags );
1198+
1199+ spl_array_method (return_value , Z_SPLARRAY_P (ZEND_THIS ), ZEND_STRL ("asort" ), & sort_flag_param );
1200+ }
12261201
12271202/* Sort the entries by key. */
1228- SPL_ARRAY_METHOD (ArrayObject , ksort , SPL_OPTIONAL_FLAG_SORT )
1203+ PHP_METHOD (ArrayObject , ksort )
1204+ {
1205+ zend_long sort_flags = 0 ;
1206+ if (zend_parse_parameters (ZEND_NUM_ARGS (), "|l" , & sort_flags ) == FAILURE ) {
1207+ RETURN_THROWS ();
1208+ }
1209+ zval sort_flag_param ;
1210+ ZVAL_LONG (& sort_flag_param , sort_flags );
1211+
1212+ spl_array_method (return_value , Z_SPLARRAY_P (ZEND_THIS ), ZEND_STRL ("ksort" ), & sort_flag_param );
1213+ }
12291214
12301215/* Sort the entries by values user defined function. */
1231- SPL_ARRAY_METHOD (ArrayObject , uasort , SPL_CALLBACK_SORT )
1216+ PHP_METHOD (ArrayObject , uasort )
1217+ {
1218+ zval * callback = NULL ;
1219+ /* TODO: Should check variable is callable */
1220+ if (zend_parse_parameters (ZEND_NUM_ARGS (), "z" , & callback ) == FAILURE ) {
1221+ RETURN_THROWS ();
1222+ }
1223+ spl_array_method (return_value , Z_SPLARRAY_P (ZEND_THIS ), ZEND_STRL ("uasort" ), callback );
1224+ }
12321225
12331226/* Sort the entries by key using user defined function. */
1234- SPL_ARRAY_METHOD (ArrayObject , uksort , SPL_CALLBACK_SORT )
1227+ PHP_METHOD (ArrayObject , uksort )
1228+ {
1229+ zval * callback = NULL ;
1230+ /* TODO: Should check variable is callable */
1231+ if (zend_parse_parameters (ZEND_NUM_ARGS (), "z" , & callback ) == FAILURE ) {
1232+ RETURN_THROWS ();
1233+ }
1234+ spl_array_method (return_value , Z_SPLARRAY_P (ZEND_THIS ), ZEND_STRL ("uksort" ), callback );
1235+ }
12351236
12361237/* Sort the entries by values using "natural order" algorithm. */
1237- SPL_ARRAY_METHOD (ArrayObject , natsort , SPL_NAT_SORT )
1238+ PHP_METHOD (ArrayObject , natsort )
1239+ {
1240+ ZEND_PARSE_PARAMETERS_NONE ();
1241+
1242+ spl_array_method (return_value , Z_SPLARRAY_P (ZEND_THIS ), ZEND_STRL ("natsort" ), NULL );
1243+ }
12381244
1239- /* {{{ Sort the entries by key using case-insensitive "natural order" algorithm. */
1240- SPL_ARRAY_METHOD (ArrayObject , natcasesort , SPL_NAT_SORT )
1245+ /* Sort the entries by key using case-insensitive "natural order" algorithm. */
1246+ PHP_METHOD (ArrayObject , natcasesort )
1247+ {
1248+ ZEND_PARSE_PARAMETERS_NONE ();
1249+
1250+ spl_array_method (return_value , Z_SPLARRAY_P (ZEND_THIS ), ZEND_STRL ("natcasesort" ), NULL );
1251+ }
12411252
12421253/* {{{ Serialize the object */
12431254PHP_METHOD (ArrayObject , serialize )
0 commit comments