Skip to content

Stdlib: sort() enum arrays use object-handle order like Zend (#5691) - #16439

Merged
PurHur merged 1 commit into
masterfrom
agent/issue-5691-sort-enum-cases
Jul 5, 2026
Merged

PurHur merged 1 commit into
masterfrom
agent/issue-5691-sort-enum-cases

Conversation

@PurHur

@PurHur PurHur commented Jul 5, 2026

Copy link
Copy Markdown
Owner

Summary

  • Fix compareEnumCasesForSort() to use stable enum case object-handle order for sort()/rsort()/asort()/arsort(), matching php-src php_array_data_compare_unstable_i / transitive SORT_REGULAR (PR Fix SORT_REGULAR with new transitive comparison functions php/php-src#20517).
  • Previously backed enums sorted by backing scalar, diverging from Zend for string-backed enums and declaration orders that do not match backing value order.

Root cause

EnumCaseSupport::compareEnumCasesForSort() used backingValueForMinMax() spaceship for backed enums; php-src compares enum zvals by object pointer/handle, not backing value.

php-src reference

  • ext/standard/array.cphp_array_data_compare_unstable_i, php_array_compare_transitive

PHP implementation

  • lib/VM/EnumCaseSupport.phpcompareEnumCasesForSort()

Verification

./script/docker-exec.sh -- bash -lc 'source script/php-env.sh
php -r "enum E: string { case A=\"b\"; case B=\"a\"; } \$a = [E::B, E::A]; sort(\$a); foreach (\$a as \$v) echo \$v->name, \"\\n\";"
php bin/vm.php -r "enum E: string { case A=\"b\"; case B=\"a\"; } \$a = [E::B, E::A]; sort(\$a); foreach (\$a as \$v) echo \$v->name, \"\\n\";"
php bin/vm.php test/compliance/cases/stdlib/sort_enum_cases.phpt
vendor/bin/phpunit --filter SortEnumCasesBuiltinTest
'

Output:

A
B
A
B
A
B
C
A
B
A
B
C
A
B
PHPUnit ... OK (6 tests, 7 assertions)

Closes #5691

Made with Cursor

php-src SORT_REGULAR compares enum case zvals by stable object handle,
not backing scalar value. compareEnumCasesForSort() now matches that
transitive ordering so string-backed and non-monotonic int enums sort
like php-src array.c.

Co-authored-by: Cursor <cursoragent@cursor.com>
@PurHur
PurHur merged commit 4e0190d into master Jul 5, 2026
@PurHur
PurHur deleted the agent/issue-5691-sort-enum-cases branch July 5, 2026 12:36
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Stdlib: sort() on enum case arrays throws LogicException — must sort by backing like Zend (ext/standard/array.c)

1 participant