Skip to content

Commit 86dd94b

Browse files
committed
Allow equality to automatically determine equal ordering
1 parent 9430e81 commit 86dd94b

File tree

3 files changed

+81
-0
lines changed

3 files changed

+81
-0
lines changed
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
--TEST--
2+
__compareTo: RHS operator should be considered even if LHS doesn't implement
3+
--FILE--
4+
<?php
5+
6+
class A
7+
{
8+
// Does not implement __compareTo
9+
}
10+
11+
class B
12+
{
13+
public function __compareTo($other)
14+
{
15+
echo "Comparing!\n";
16+
return 1;
17+
}
18+
}
19+
20+
var_dump(new A <=> new B);
21+
var_dump(new B <=> new A);
22+
23+
?>
24+
--EXPECTF--
25+
Comparing!
26+
int(-1)
27+
Comparing!
28+
int(1)
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
--TEST--
2+
__equals: Equal values automatically have equal ordering
3+
--FILE--
4+
<?php
5+
include("setup.inc");
6+
7+
$a = new Equatable(1);
8+
$b = new Equatable(1);
9+
10+
/* Give $a a value that $b doesn't have so that default comparison would break. */
11+
$a->unique = 10;
12+
13+
var_dump($a <=> $b);
14+
15+
?>
16+
--EXPECTF--
17+
int(0)

Zend/zend_operators.c

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2043,6 +2043,15 @@ ZEND_API int ZEND_FASTCALL compare_function(zval *result, zval *op1, zval *op2)
20432043
if (Z_OBJ_HANDLER_P(op1, compare)(result, op1, op2) == SUCCESS) {
20442044
convert_compare_result_to_long(result);
20452045
return SUCCESS;
2046+
} else {
2047+
if (Z_OBJ_HANDLER_P(op1, equals)) {
2048+
if (Z_OBJ_HANDLER_P(op1, equals)(result, op1, op2) == SUCCESS) {
2049+
if (i_zend_is_true(result)) {
2050+
ZVAL_LONG(result, 0);
2051+
return SUCCESS;
2052+
}
2053+
}
2054+
}
20462055
}
20472056
}
20482057

@@ -2055,6 +2064,15 @@ ZEND_API int ZEND_FASTCALL compare_function(zval *result, zval *op1, zval *op2)
20552064
convert_compare_result_to_long(result);
20562065
Z_LVAL_P(result) *= -1;
20572066
return SUCCESS;
2067+
} else {
2068+
if (Z_OBJ_HANDLER_P(op2, equals)) {
2069+
if (Z_OBJ_HANDLER_P(op2, equals)(result, op2, op1) == SUCCESS) {
2070+
if (i_zend_is_true(result)) {
2071+
ZVAL_LONG(result, 0);
2072+
return SUCCESS;
2073+
}
2074+
}
2075+
}
20582076
}
20592077
}
20602078

@@ -2074,6 +2092,15 @@ ZEND_API int ZEND_FASTCALL compare_function(zval *result, zval *op1, zval *op2)
20742092
if (Z_OBJ_HANDLER_P(op1, compare) && Z_OBJ_HANDLER_P(op1, compare)(result, op1, op2) == SUCCESS) {
20752093
convert_compare_result_to_long(result);
20762094
return SUCCESS;
2095+
} else {
2096+
if (Z_OBJ_HANDLER_P(op1, equals)) {
2097+
if (Z_OBJ_HANDLER_P(op1, equals)(result, op1, op2) == SUCCESS) {
2098+
if (i_zend_is_true(result)) {
2099+
ZVAL_LONG(result, 0);
2100+
return SUCCESS;
2101+
}
2102+
}
2103+
}
20772104
}
20782105
}
20792106

@@ -2082,6 +2109,15 @@ ZEND_API int ZEND_FASTCALL compare_function(zval *result, zval *op1, zval *op2)
20822109
convert_compare_result_to_long(result);
20832110
Z_LVAL_P(result) *= -1;
20842111
return SUCCESS;
2112+
} else {
2113+
if (Z_OBJ_HANDLER_P(op2, equals)) {
2114+
if (Z_OBJ_HANDLER_P(op2, equals)(result, op2, op1) == SUCCESS) {
2115+
if (i_zend_is_true(result)) {
2116+
ZVAL_LONG(result, 0);
2117+
return SUCCESS;
2118+
}
2119+
}
2120+
}
20852121
}
20862122
}
20872123

0 commit comments

Comments
 (0)