8000 ext/spl: Refactor ArrayObject sort methods · php/php-src@50ddf6a · GitHub
[go: up one dir, main page]

Skip to content

Commit 50ddf6a

Browse files
committed
ext/spl: Refactor ArrayObject sort methods
1 parent faef004 commit 50ddf6a

File tree

8 files changed

+37
-31
lines changed

8 files changed

+37
-31
lines changed

ext/spl/spl_array.c

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

ext/spl/spl_array.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,6 @@
2727
#define SPL_ARRAY_INT_MASK 0xFFFF0000
2828
#define SPL_ARRAY_CLONE_MASK 0x0100FFFF
2929

30-
#define SPL_ARRAY_METHOD_NO_ARG 0
31-
#define SPL_ARRAY_METHOD_CALLBACK_ARG 1
32-
#define SPL_ARRAY_METHOD_SORT_FLAGS_ARG 2
33-
3430
extern PHPAPI zend_class_entry *spl_ce_ArrayObject;
3531
extern PHPAPI zend_class_entry *spl_ce_ArrayIterator;
3632
extern PHPAPI zend_class_entry *spl_ce_RecursiveArrayIterator;

ext/spl/tests/ArrayObject/asort_disabled.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ var_dump($ao);
1111

1212
?>
1313
--EXPECTF--
14-
Fatal error: Uncaught Error: Invalid callback asort, function "asort" not found or invalid function name in %s:%d
14+
Fatal error: Uncaught Error: Cannot call method asort when function asort is disabled in %s:%d
1515
Stack trace:
1616
#0 %s(%d): ArrayObject->asort()
1717
#1 {main}

ext/spl/tests/ArrayObject/ksort_disabled.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ var_dump($ao);
1111

1212
?>
1313
--EXPECTF--
14-
Fatal error: Uncaught Error: Invalid callback ksort, function "ksort" not found or invalid function name in %s:%d
14+
Fatal error: Uncaught Error: Cannot call method ksort when function ksort is disabled in %s:%d
1515
Stack trace:
1616
#0 %s(%d): ArrayObject->ksort()
1717
#1 {main}

ext/spl/tests/ArrayObject/natcasesort_disabled.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ var_dump($ao);
1111

1212
?>
1313
--EXPECTF--
14-
Fatal error: Uncaught Error: Invalid callback natcasesort, function "natcasesort" not found or invalid function name in %s:%d
14+
Fatal error: Uncaught Error: Cannot call method natcasesort when function natcasesort is disabled in %s:%d
1515
Stack trace:
1616
#0 %s(%d): ArrayObject->natcasesort()
1717
#1 {main}

ext/spl/tests/ArrayObject/natsort_disabled.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ var_dump($ao);
1111

1212
?>
1313
--EXPECTF--
14-
Fatal error: Uncaught Error: Invalid callback natsort, function "natsort" not found or invalid function name in %s:%d
14+
Fatal error: Uncaught Error: Cannot call method natsort when function natsort is disabled in %s:%d
1515
Stack trace:
1616
#0 %s(%d): ArrayObject->natsort()
1717
#1 {main}

ext/spl/tests/ArrayObject/uasort_disabled.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ var_dump($ao);
1111

1212
?>
1313
--EXPECTF--
14-
Fatal error: Uncaught Error: Invalid callback uasort, function "uasort" not found or invalid function name in %s:%d
14+
Fatal error: Uncaught Error: Cannot call method uasort when function uasort is disabled in %s:%d
1515
Stack trace:
1616
#0 %s(%d): ArrayObject->uasort(Object(Closure))
1717
#1 {main}

ext/spl/tests/ArrayObject/uksort_disabled.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ var_dump($ao);
1111

1212
?>
1313
--EXPECTF--
14-
Fatal error: Uncaught Error: Invalid callback uksort, function "uksort" not found or invalid function name in %s:%d
14+
Fatal error: Uncaught Error: Cannot call method uksort when function uksort is disabled in %s:%d
1515
Stack trace:
1616
#0 %s(%d): ArrayObject->uksort(Object(Closure))
1717
#1 {main}

0 commit comments

Comments
 (0)
0