@@ -1203,43 +1203,54 @@ PHP_METHOD(ArrayObject, count)
1203
1203
RETURN_LONG (spl_array_object_count_elements_helper (intern ));
1204
1204
} /* }}} */
1205
1205
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 ) /* {{{ */
1207
1213
{
1208
1214
spl_array_object * intern = Z_SPLARRAY_P (ZEND_THIS );
1209
1215
HashTable * * ht_ptr = spl_array_get_hash_table_ptr (intern );
1210
1216
HashTable * aht = * ht_ptr ;
1211
- zval function_name , params [2 ], * arg = NULL ;
1217
+ zval params [2 ], * arg = NULL ;
1212
1218
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
+ }
1214
1224
1215
1225
ZVAL_NEW_EMPTY_REF (& params [0 ]);
1216
1226
ZVAL_ARR (Z_REFVAL (params [0 ]), aht );
1217
1227
GC_ADDREF (aht );
1218
1228
1219
- if (! use_arg ) {
1229
+ if (use_arg == SPL_NAT_SORT ) {
1220
1230
if (zend_parse_parameters_none () == FAILURE ) {
1221
1231
goto exit ;
1222
1232
}
1223
1233
1224
1234
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 );
1226
1236
intern -> nApplyCount -- ;
1227
- } else if (use_arg == SPL_ARRAY_METHOD_SORT_FLAGS_ARG ) {
1237
+ } else if (use_arg == SPL_OPTIONAL_FLAG_SORT ) {
1228
1238
zend_long sort_flags = 0 ;
1229
1239
if (zend_parse_parameters (ZEND_NUM_ARGS (), "|l" , & sort_flags ) == FAILURE ) {
1230
1240
goto exit ;
1231
1241
}
1232
1242
ZVAL_LONG (& params [1 ], sort_flags );
1233
1243
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 );
1235
1245
intern -> nApplyCount -- ;
1236
1246
} else {
1247
+ ZEND_ASSERT (use_arg == SPL_CALLBACK_SORT );
1237
1248
if (zend_parse_parameters (ZEND_NUM_ARGS (), "z" , & arg ) == FAILURE ) {
1238
1249
goto exit ;
1239
1250
}
1240
1251
ZVAL_COPY_VALUE (& params [1 ], arg );
1241
1252
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 );
1243
1254
intern -> nApplyCount -- ;
1244
1255
}
1245
1256
@@ -1251,7 +1262,6 @@ static void spl_array_method(INTERNAL_FUNCTION_PARAMETERS, char *fname, size_t f
1251
1262
* ht_ptr = Z_ARRVAL_P (ht_zv );
1252
1263
ZVAL_NULL (ht_zv );
1253
1264
zval_ptr_dtor (& params [0 ]);
1254
- zend_string_free (Z_STR (function_name ));
1255
1265
}
1256
1266
} /* }}} */
1257
1267
@@ -1261,23 +1271,23 @@ PHP_METHOD(cname, fname) \
1261
1271
spl_array_method(INTERNAL_FUNCTION_PARAM_PASSTHRU, #fname, sizeof(#fname)-1, use_arg); \
1262
1272
}
1263
1273
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 )
1266
1276
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 )
1269
1279
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 )
1272
1282
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 )
1275
1285
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 )
1278
1288
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 )
1281
1291
1282
1292
/* {{{ Serialize the object */
1283
1293
PHP_METHOD (ArrayObject , serialize )
0 commit comments