@@ -1200,18 +1200,12 @@ PHP_METHOD(ArrayObject, count)
12001200 RETURN_LONG (spl_array_object_count_elements_helper (intern ));
12011201} /* }}} */
12021202
1203- enum spl_array_object_sort_methods {
1204- SPL_NAT_SORT ,
1205- SPL_CALLBACK_SORT ,
1206- SPL_OPTIONAL_FLAG_SORT
1207- };
1208-
1209- static void spl_array_method (INTERNAL_FUNCTION_PARAMETERS , const char * fname , size_t fname_len , enum spl_array_object_sort_methods use_arg ) /* {{{ */
1203+ static void spl_array_method (zval * return_value , spl_array_object * intern , const char * fname , size_t fname_len , const zval * extra_arg ) /* {{{ */
12101204{
1211- spl_array_object * intern = Z_SPLARRAY_P (ZEND_THIS );
12121205 HashTable * * ht_ptr = spl_array_get_hash_table_ptr (intern );
12131206 HashTable * aht = * ht_ptr ;
1214- zval params [2 ], * arg = NULL ;
1207+ zval params [2 ];
1208+ uint32_t param_num = 1 ;
12151209
12161210 zend_function * fn = zend_hash_str_find_ptr (EG (function_table ), fname , fname_len );
12171211 if (UNEXPECTED (fn == NULL )) {
@@ -1223,68 +1217,85 @@ static void spl_array_method(INTERNAL_FUNCTION_PARAMETERS, const char *fname, si
12231217 ZVAL_ARR (Z_REFVAL (params [0 ]), aht );
12241218 GC_ADDREF (aht );
12251219
1226- if (use_arg == SPL_NAT_SORT ) {
1227- if (zend_parse_parameters_none () == FAILURE ) {
1228- goto exit ;
1229- }
1230-
1231- intern -> nApplyCount ++ ;
1232- zend_call_known_function (fn , NULL , NULL , return_value , 1 , params , NULL );
1233- intern -> nApplyCount -- ;
1234- } else if (use_arg == SPL_OPTIONAL_FLAG_SORT ) {
1235- zend_long sort_flags = 0 ;
1236- if (zend_parse_parameters (ZEND_NUM_ARGS (), "|l" , & sort_flags ) == FAILURE ) {
1237- goto exit ;
1238- }
1239- ZVAL_LONG (& params [1 ], sort_flags );
1240- intern -> nApplyCount ++ ;
1241- zend_call_known_function (fn , NULL , NULL , return_value , 2 , params , NULL );
1242- intern -> nApplyCount -- ;
1243- } else {
1244- ZEND_ASSERT (use_arg == SPL_CALLBACK_SORT );
1245- if (zend_parse_parameters (ZEND_NUM_ARGS (), "z" , & arg ) == FAILURE ) {
1246- goto exit ;
1247- }
1248- ZVAL_COPY_VALUE (& params [1 ], arg );
1249- intern -> nApplyCount ++ ;
1250- zend_call_known_function (fn , NULL , NULL , return_value , 2 , params , NULL );
1251- intern -> nApplyCount -- ;
1220+ if (extra_arg ) {
1221+ param_num = 2 ;
1222+ ZVAL_COPY_VALUE (& params [1 ], extra_arg );
12521223 }
1224+ intern -> nApplyCount ++ ;
1225+ zend_call_known_function (fn , NULL , NULL , return_value , param_num , params , NULL );
1226+ intern -> nApplyCount -- ;
12531227
1254- exit :
1255- {
1256- zval * ht_zv = Z_REFVAL (params [0 ]);
1257- zend_array_release (* ht_ptr );
1258- SEPARATE_ARRAY (ht_zv );
1259- * ht_ptr = Z_ARRVAL_P (ht_zv );
1260- ZVAL_NULL (ht_zv );
1261- zval_ptr_dtor (& params [0 ]);
1262- }
1228+ zval * ht_zv = Z_REFVAL (params [0 ]);
1229+ zend_array_release (* ht_ptr );
1230+ SEPARATE_ARRAY (ht_zv );
1231+ * ht_ptr = Z_ARRVAL_P (ht_zv );
1232+ ZVAL_NULL (ht_zv );
1233+ zval_ptr_dtor (& params [0 ]);
12631234} /* }}} */
12641235
1265- #define SPL_ARRAY_METHOD (cname , fname , use_arg ) \
1266- PHP_METHOD(cname, fname) \
1267- { \
1268- spl_array_method(INTERNAL_FUNCTION_PARAM_PASSTHRU, #fname, sizeof(#fname)-1, use_arg); \
1269- }
1270-
12711236/* Sort the entries by values. */
1272- SPL_ARRAY_METHOD (ArrayObject , asort , SPL_OPTIONAL_FLAG_SORT )
1237+ PHP_METHOD (ArrayObject , asort )
1238+ {
1239+ zend_long sort_flags = 0 ;
1240+ if (zend_parse_parameters (ZEND_NUM_ARGS (), "|l" , & sort_flags ) == FAILURE ) {
1241+ RETURN_THROWS ();
1242+ }
1243+ zval sort_flag_param ;
1244+ ZVAL_LONG (& sort_flag_param , sort_flags );
1245+
1246+ spl_array_method (return_value , Z_SPLARRAY_P (ZEND_THIS ), ZEND_STRL ("asort" ), & sort_flag_param );
1247+ }
12731248
12741249/* Sort the entries by key. */
1275- SPL_ARRAY_METHOD (ArrayObject , ksort , SPL_OPTIONAL_FLAG_SORT )
1250+ PHP_METHOD (ArrayObject , ksort )
1251+ {
1252+ zend_long sort_flags = 0 ;
1253+ if (zend_parse_parameters (ZEND_NUM_ARGS (), "|l" , & sort_flags ) == FAILURE ) {
1254+ RETURN_THROWS ();
1255+ }
1256+ zval sort_flag_param ;
1257+ ZVAL_LONG (& sort_flag_param , sort_flags );
1258+
1259+ spl_array_method (return_value , Z_SPLARRAY_P (ZEND_THIS ), ZEND_STRL ("ksort" ), & sort_flag_param );
1260+ }
12761261
12771262/* Sort the entries by values user defined function. */
1278- SPL_ARRAY_METHOD (ArrayObject , uasort , SPL_CALLBACK_SORT )
1263+ PHP_METHOD (ArrayObject , uasort )
1264+ {
1265+ zval * callback = NULL ;
1266+ /* TODO: Should check variable is callable */
1267+ if (zend_parse_parameters (ZEND_NUM_ARGS (), "z" , & callback ) == FAILURE ) {
1268+ RETURN_THROWS ();
1269+ }
1270+ spl_array_method (return_value , Z_SPLARRAY_P (ZEND_THIS ), ZEND_STRL ("uasort" ), callback );
1271+ }
12791272
12801273/* Sort the entries by key using user defined function. */
1281- SPL_ARRAY_METHOD (ArrayObject , uksort , SPL_CALLBACK_SORT )
1274+ PHP_METHOD (ArrayObject , uksort )
1275+ {
1276+ zval * callback = NULL ;
1277+ /* TODO: Should check variable is callable */
1278+ if (zend_parse_parameters (ZEND_NUM_ARGS (), "z" , & callback ) == FAILURE ) {
1279+ RETURN_THROWS ();
1280+ }
1281+ spl_array_method (return_value , Z_SPLARRAY_P (ZEND_THIS ), ZEND_STRL ("uksort" ), callback );
1282+ }
12821283
12831284/* Sort the entries by values using "natural order" algorithm. */
1284- SPL_ARRAY_METHOD (ArrayObject , natsort , SPL_NAT_SORT )
1285+ PHP_METHOD (ArrayObject , natsort )
1286+ {
1287+ ZEND_PARSE_PARAMETERS_NONE ();
1288+
1289+ spl_array_method (return_value , Z_SPLARRAY_P (ZEND_THIS ), ZEND_STRL ("natsort" ), NULL );
1290+ }
12851291
1286- /* {{{ Sort the entries by key using case-insensitive "natural order" algorithm. */
1287- SPL_ARRAY_METHOD (ArrayObject , natcasesort , SPL_NAT_SORT )
1292+ /* Sort the entries by key using case-insensitive "natural order" algorithm. */
1293+ PHP_METHOD (ArrayObject , natcasesort )
1294+ {
1295+ ZEND_PARSE_PARAMETERS_NONE ();
1296+
1297+ spl_array_method (return_value , Z_SPLARRAY_P (ZEND_THIS ), ZEND_STRL ("natcasesort" ), NULL );
1298+ }
12881299
12891300/* {{{ Serialize the object */
12901301PHP_METHOD (ArrayObject , serialize )
0 commit comments