Skip to content

Commit 6a983ef

Browse files
committed
ext/spl/ArrayObject: handle ZPP for each sort methods directly
1 parent 117f876 commit 6a983ef

File tree

1 file changed

+68
-57
lines changed

1 file changed

+68
-57
lines changed

ext/spl/spl_array.c

Lines changed: 68 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -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 */
12901301
PHP_METHOD(ArrayObject, serialize)

0 commit comments

Comments
 (0)