@@ -1203,43 +1203,54 @@ PHP_METHOD(ArrayObject, count)
12031203 RETURN_LONG (spl_array_object_count_elements_helper (intern ));
12041204} /* }}} */
12051205
1206- static void spl_array_method (INTERNAL_FUNCTION_PARAMETERS , char * fname , size_t fname_len , int use_arg ) /* {{{ */
1206+ enum spl_array_object_sort_methods {
1207+ SPL_NAT_SORT ,
1208+ SPL_CALLBACK_SORT ,
1209+ SPL_OPTIONAL_FLAG_SORT
1210+ };
1211+
1212+ static void spl_array_method (INTERNAL_FUNCTION_PARAMETERS , const char * fname , size_t fname_len , enum spl_array_object_sort_methods use_arg ) /* {{{ */
12071213{
12081214 spl_array_object * intern = Z_SPLARRAY_P (ZEND_THIS );
12091215 HashTable * * ht_ptr = spl_array_get_hash_table_ptr (intern );
12101216 HashTable * aht = * ht_ptr ;
1211- zval function_name , params [2 ], * arg = NULL ;
1217+ zval params [2 ], * arg = NULL ;
12121218
1213- ZVAL_STRINGL (& function_name , fname , fname_len );
1219+ zend_function * fn = zend_hash_str_find_ptr (EG (function_table ), fname , fname_len );
1220+ if (UNEXPECTED (fn == NULL )) {
1221+ zend_throw_error (NULL , "Cannot call method %s when function %s is disabled" , fname , fname );
1222+ RETURN_THROWS ();
1223+ }
12141224
12151225 ZVAL_NEW_EMPTY_REF (& params [0 ]);
12161226 ZVAL_ARR (Z_REFVAL (params [0 ]), aht );
12171227 GC_ADDREF (aht );
12181228
1219- if (! use_arg ) {
1229+ if (use_arg == SPL_NAT_SORT ) {
12201230 if (zend_parse_parameters_none () == FAILURE ) {
12211231 goto exit ;
12221232 }
12231233
12241234 intern -> nApplyCount ++ ;
1225- call_user_function ( EG ( function_table ) , NULL , & function_name , return_value , 1 , params );
1235+ zend_call_known_function ( fn , NULL , NULL , return_value , 1 , params , NULL );
12261236 intern -> nApplyCount -- ;
1227- } else if (use_arg == SPL_ARRAY_METHOD_SORT_FLAGS_ARG ) {
1237+ } else if (use_arg == SPL_OPTIONAL_FLAG_SORT ) {
12281238 zend_long sort_flags = 0 ;
12291239 if (zend_parse_parameters (ZEND_NUM_ARGS (), "|l" , & sort_flags ) == FAILURE ) {
12301240 goto exit ;
12311241 }
12321242 ZVAL_LONG (& params [1 ], sort_flags );
12331243 intern -> nApplyCount ++ ;
1234- call_user_function ( EG ( function_table ) , NULL , & function_name , return_value , 2 , params );
1244+ zend_call_known_function ( fn , NULL , NULL , return_value , 2 , params , NULL );
12351245 intern -> nApplyCount -- ;
12361246 } else {
1247+ ZEND_ASSERT (use_arg == SPL_CALLBACK_SORT );
12371248 if (zend_parse_parameters (ZEND_NUM_ARGS (), "z" , & arg ) == FAILURE ) {
12381249 goto exit ;
12391250 }
12401251 ZVAL_COPY_VALUE (& params [1 ], arg );
12411252 intern -> nApplyCount ++ ;
1242- call_user_function ( EG ( function_table ) , NULL , & function_name , return_value , 2 , params );
1253+ zend_call_known_function ( fn , NULL , NULL , return_value , 2 , params , NULL );
12431254 intern -> nApplyCount -- ;
12441255 }
12451256
@@ -1251,7 +1262,6 @@ static void spl_array_method(INTERNAL_FUNCTION_PARAMETERS, char *fname, size_t f
12511262 * ht_ptr = Z_ARRVAL_P (ht_zv );
12521263 ZVAL_NULL (ht_zv );
12531264 zval_ptr_dtor (& params [0 ]);
1254- zend_string_free (Z_STR (function_name ));
12551265 }
12561266} /* }}} */
12571267
@@ -1261,23 +1271,23 @@ PHP_METHOD(cname, fname) \
12611271 spl_array_method(INTERNAL_FUNCTION_PARAM_PASSTHRU, #fname, sizeof(#fname)-1, use_arg); \
12621272}
12631273
1264- /* {{{ Sort the entries by values. */
1265- SPL_ARRAY_METHOD (ArrayObject , asort , SPL_ARRAY_METHOD_SORT_FLAGS_ARG ) /* }}} */
1274+ /* Sort the entries by values. */
1275+ SPL_ARRAY_METHOD (ArrayObject , asort , SPL_OPTIONAL_FLAG_SORT )
12661276
1267- /* {{{ Sort the entries by key. */
1268- SPL_ARRAY_METHOD (ArrayObject , ksort , SPL_ARRAY_METHOD_SORT_FLAGS_ARG ) /* }}} */
1277+ /* Sort the entries by key. */
1278+ SPL_ARRAY_METHOD (ArrayObject , ksort , SPL_OPTIONAL_FLAG_SORT )
12691279
1270- /* {{{ Sort the entries by values user defined function. */
1271- SPL_ARRAY_METHOD (ArrayObject , uasort , SPL_ARRAY_METHOD_CALLBACK_ARG ) /* }}} */
1280+ /* Sort the entries by values user defined function. */
1281+ SPL_ARRAY_METHOD (ArrayObject , uasort , SPL_CALLBACK_SORT )
12721282
1273- /* {{{ Sort the entries by key using user defined function. */
1274- SPL_ARRAY_METHOD (ArrayObject , uksort , SPL_ARRAY_METHOD_CALLBACK_ARG ) /* }}} */
1283+ /* Sort the entries by key using user defined function. */
1284+ SPL_ARRAY_METHOD (ArrayObject , uksort , SPL_CALLBACK_SORT )
12751285
1276- /* {{{ Sort the entries by values using "natural order" algorithm. */
1277- SPL_ARRAY_METHOD (ArrayObject , natsort , SPL_ARRAY_METHOD_NO_ARG ) /* }}} */
1286+ /* Sort the entries by values using "natural order" algorithm. */
1287+ SPL_ARRAY_METHOD (ArrayObject , natsort , SPL_NAT_SORT )
12781288
1279- /* {{{ Sort the entries by key using case insensitive "natural order" algorithm. */
1280- SPL_ARRAY_METHOD (ArrayObject , natcasesort , SPL_ARRAY_METHOD_NO_ARG ) /* }}} */
1289+ /* {{{ Sort the entries by key using case- insensitive "natural order" algorithm. */
1290+ SPL_ARRAY_METHOD (ArrayObject , natcasesort , SPL_NAT_SORT )
12811291
12821292/* {{{ Serialize the object */
12831293PHP_METHOD (ArrayObject , serialize )
0 commit comments