Skip to content

Commit 6f0aa11

Browse files
committed
ext/spl/ArrayObject: handle ZPP for each sort methods directly
1 parent 08a6ebf commit 6f0aa11

1 file changed

Lines changed: 68 additions & 57 deletions

File tree

ext/spl/spl_array.c

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

0 commit comments

Comments
 (0)