Skip to content

Commit 445f258

Browse files
committed
Update for changes to the RFC
1 parent 86dd94b commit 445f258

File tree

8 files changed

+92
-84
lines changed

8 files changed

+92
-84
lines changed
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
--TEST--
2+
__compareTo: __compareTo should be called when comparing for equality
3+
--FILE--
4+
<?php
5+
class A
6+
{
7+
public function __compareTo($other)
8+
{
9+
echo "A::__compareTo\n";
10+
}
11+
}
12+
13+
class B extends A
14+
{
15+
public function __equals($other)
16+
{
17+
echo "B::__equals\n";
18+
}
19+
}
20+
21+
new A == new A; // A::__compareTo
22+
new A != new A; // A::__compareTo
23+
new A === new A;
24+
new A !== new A;
25+
26+
new B == new A; // B::__equals
27+
new B != new A; // B::__equals
28+
new B === new A;
29+
new B !== new A;
30+
31+
new A == new B; // B::__equals
32+
new A != new B; // B::__equals
33+
new A === new B;
34+
new A !== new B;
35+
36+
new B == new B; // B::__equals
37+
new B != new B; // B::__equals
38+
new B === new B;
39+
new B !== new B;
40+
?>
41+
--EXPECT--
42+
A::__compareTo
43+
A::__compareTo
44+
B::__equals
45+
B::__equals
46+
B::__equals
47+
B::__equals
48+
B::__equals
49+
B::__equals

Zend/tests/comparisons/equals-before-compare.phpt

Lines changed: 0 additions & 26 deletions
This file was deleted.
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
--TEST--
2+
__equals: __equals should not be called when comparing for ordering
3+
--FILE--
4+
<?php
5+
class Equatable
6+
{
7+
public function __equals($other)
8+
{
9+
throw new Exception();
10+
}
11+
}
12+
13+
new Equatable < new Equatable;
14+
new Equatable > new Equatable;
15+
new Equatable >= new Equatable;
16+
new Equatable <= new Equatable;
17+
new Equatable <=> new Equatable;
18+
?>
19+
--EXPECT--

Zend/tests/comparisons/equals-only-auto-ordering.phpt

Lines changed: 0 additions & 17 deletions
This file was deleted.

Zend/zend_operators.c

Lines changed: 20 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -2043,15 +2043,6 @@ 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-
}
20552046
}
20562047
}
20572048

@@ -2064,15 +2055,6 @@ ZEND_API int ZEND_FASTCALL compare_function(zval *result, zval *op1, zval *op2)
20642055
convert_compare_result_to_long(result);
20652056
Z_LVAL_P(result) *= -1;
20662057
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-
}
20762058
}
20772059
}
20782060

@@ -2092,15 +2074,6 @@ ZEND_API int ZEND_FASTCALL compare_function(zval *result, zval *op1, zval *op2)
20922074
if (Z_OBJ_HANDLER_P(op1, compare) && Z_OBJ_HANDLER_P(op1, compare)(result, op1, op2) == SUCCESS) {
20932075
convert_compare_result_to_long(result);
20942076
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-
}
21042077
}
21052078
}
21062079

@@ -2109,15 +2082,6 @@ ZEND_API int ZEND_FASTCALL compare_function(zval *result, zval *op1, zval *op2)
21092082
convert_compare_result_to_long(result);
21102083
Z_LVAL_P(result) *= -1;
21112084
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-
}
21212085
}
21222086
}
21232087

@@ -2339,6 +2303,26 @@ ZEND_API int ZEND_FASTCALL is_smaller_or_equal_function(zval *result, zval *op1,
23392303
}
23402304
/* }}} */
23412305

2306+
ZEND_API int ZEND_FASTCALL is_greater_function(zval *result, zval *op1, zval *op2) /* {{{ */
2307+
{
2308+
if (compare_function(result, op1, op2) == FAILURE) {
2309+
return FAILURE;
2310+
}
2311+
ZVAL_BOOL(result, (Z_LVAL_P(result) > 0));
2312+
return SUCCESS;
2313+
}
2314+
/* }}} */
2315+
2316+
ZEND_API int ZEND_FASTCALL is_greater_or_equal_function(zval *result, zval *op1, zval *op2) /* {{{ */
2317+
{
2318+
if (compare_function(result, op1, op2) == FAILURE) {
2319+
return FAILURE;
2320+
}
2321+
ZVAL_BOOL(result, (Z_LVAL_P(result) >= 0));
2322+
return SUCCESS;
2323+
}
2324+
/* }}} */
2325+
23422326
static zend_bool ZEND_FASTCALL instanceof_interface_only(const zend_class_entry *instance_ce, const zend_class_entry *ce) /* {{{ */
23432327
{
23442328
uint32_t i;

Zend/zend_operators.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,8 @@ ZEND_API int ZEND_FASTCALL is_not_identical_function(zval *result, zval *op1, zv
6767
ZEND_API int ZEND_FASTCALL is_not_equal_function(zval *result, zval *op1, zval *op2);
6868
ZEND_API int ZEND_FASTCALL is_smaller_function(zval *result, zval *op1, zval *op2);
6969
ZEND_API int ZEND_FASTCALL is_smaller_or_equal_function(zval *result, zval *op1, zval *op2);
70+
ZEND_API int ZEND_FASTCALL is_greater_function(zval *result, zval *op1, zval *op2);
71+
ZEND_API int ZEND_FASTCALL is_greater_or_equal_function(zval *result, zval *op1, zval *op2);
7072

7173
ZEND_API zend_bool ZEND_FASTCALL instanceof_function_ex(const zend_class_entry *instance_ce, const zend_class_entry *ce, zend_bool interfaces_only);
7274
ZEND_API zend_bool ZEND_FASTCALL instanceof_function(const zend_class_entry *instance_ce, const zend_class_entry *ce);

Zend/zend_vm_def.h

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -544,8 +544,7 @@ ZEND_VM_COLD_CONSTCONST_HANDLER(19, ZEND_IS_SMALLER, CONST|TMPVAR|CV, CONST|TMPV
544544
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
545545
}
546546
result = EX_VAR(opline->result.var);
547-
compare_function(result, op1, op2);
548-
ZVAL_BOOL(result, Z_LVAL_P(result) < 0);
547+
is_smaller_function(result);
549548
FREE_OP1();
550549
FREE_OP2();
551550
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -594,8 +593,7 @@ ZEND_VM_COLD_CONSTCONST_HANDLER(20, ZEND_IS_SMALLER_OR_EQUAL, CONST|TMPVAR|CV, C
594593
op2 = GET_OP2_UNDEF_CV(op2, BP_VAR_R);
595594
}
596595
result = EX_VAR(opline->result.var);
597-
compare_function(result, op1, op2);
598-
ZVAL_BOOL(result, Z_LVAL_P(result) <= 0);
596+
is_smaller_or_equal_function(result);
599597
FREE_OP1();
600598
FREE_OP2();
601599
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();

Zend/zend_vm_execute.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47479,7 +47479,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CV_CV_HANDLER(ZE
4747947479
result = EX_VAR(opline->result.var);
4748047480
is_equal_function(result, op1, op2);
4748147481

47482-
4748347482
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
4748447483
}
4748547484

0 commit comments

Comments
 (0)