Skip to content

Commit d880ead

Browse files
committed
Improve fast_is_[not_]identical() functions to teturn value instead of takeing additional arguments.
Pair INSTANCEOF with the following JMPZ/JMPNZ.
1 parent 1d718fe commit d880ead

File tree

6 files changed

+279
-175
lines changed

6 files changed

+279
-175
lines changed

Zend/zend_operators.c

Lines changed: 20 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1885,60 +1885,47 @@ static int hash_zval_identical_function(zval *z1, zval *z2) /* {{{ */
18851885
}
18861886
/* }}} */
18871887

1888-
ZEND_API int ZEND_FASTCALL is_identical_function(zval *result, zval *op1, zval *op2) /* {{{ */
1888+
ZEND_API int ZEND_FASTCALL zend_is_identical(zval *op1, zval *op2) /* {{{ */
18891889
{
18901890
if (Z_TYPE_P(op1) != Z_TYPE_P(op2)) {
1891-
ZVAL_FALSE(result);
1892-
return SUCCESS;
1891+
return 0;
18931892
}
18941893
switch (Z_TYPE_P(op1)) {
18951894
case IS_NULL:
18961895
case IS_FALSE:
18971896
case IS_TRUE:
1898-
ZVAL_TRUE(result);
1899-
break;
1897+
return 1;
19001898
case IS_LONG:
1901-
ZVAL_BOOL(result, Z_LVAL_P(op1) == Z_LVAL_P(op2));
1902-
break;
1899+
return (Z_LVAL_P(op1) == Z_LVAL_P(op2));
19031900
case IS_RESOURCE:
1904-
ZVAL_BOOL(result, Z_RES_P(op1) == Z_RES_P(op2));
1905-
break;
1901+
return (Z_RES_P(op1) == Z_RES_P(op2));
19061902
case IS_DOUBLE:
1907-
ZVAL_BOOL(result, Z_DVAL_P(op1) == Z_DVAL_P(op2));
1908-
break;
1903+
return (Z_DVAL_P(op1) == Z_DVAL_P(op2));
19091904
case IS_STRING:
1910-
if (Z_STR_P(op1) == Z_STR_P(op2)) {
1911-
ZVAL_TRUE(result);
1912-
} else {
1913-
ZVAL_BOOL(result, (Z_STRLEN_P(op1) == Z_STRLEN_P(op2))
1914-
&& (!memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1))));
1915-
}
1916-
break;
1905+
return (Z_STR_P(op1) == Z_STR_P(op2) ||
1906+
(Z_STRLEN_P(op1) == Z_STRLEN_P(op2) &&
1907+
memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1)) == 0));
19171908
case IS_ARRAY:
1918-
ZVAL_BOOL(result, Z_ARRVAL_P(op1) == Z_ARRVAL_P(op2) ||
1919-
zend_hash_compare(Z_ARRVAL_P(op1), Z_ARRVAL_P(op2), (compare_func_t) hash_zval_identical_function, 1)==0);
1920-
break;
1909+
return (Z_ARRVAL_P(op1) == Z_ARRVAL_P(op2) ||
1910+
zend_hash_compare(Z_ARRVAL_P(op1), Z_ARRVAL_P(op2), (compare_func_t) hash_zval_identical_function, 1) == 0);
19211911
case IS_OBJECT:
1922-
if (Z_OBJ_HT_P(op1) == Z_OBJ_HT_P(op2)) {
1923-
ZVAL_BOOL(result, Z_OBJ_P(op1) == Z_OBJ_P(op2));
1924-
} else {
1925-
ZVAL_FALSE(result);
1926-
}
1927-
break;
1912+
return (Z_OBJ_P(op1) == Z_OBJ_P(op2) && Z_OBJ_HT_P(op1) == Z_OBJ_HT_P(op2));
19281913
default:
1929-
ZVAL_FALSE(result);
1930-
return FAILURE;
1914+
return 0;
19311915
}
1916+
}
1917+
/* }}} */
1918+
1919+
ZEND_API int ZEND_FASTCALL is_identical_function(zval *result, zval *op1, zval *op2) /* {{{ */
1920+
{
1921+
ZVAL_BOOL(result, zend_is_identical(op1, op2));
19321922
return SUCCESS;
19331923
}
19341924
/* }}} */
19351925

19361926
ZEND_API int ZEND_FASTCALL is_not_identical_function(zval *result, zval *op1, zval *op2) /* {{{ */
19371927
{
1938-
if (is_identical_function(result, op1, op2) == FAILURE) {
1939-
return FAILURE;
1940-
}
1941-
ZVAL_BOOL(result, Z_TYPE_P(result) != IS_TRUE);
1928+
ZVAL_BOOL(result, !zend_is_identical(op1, op2));
19421929
return SUCCESS;
19431930
}
19441931
/* }}} */

Zend/zend_operators.h

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ ZEND_API int ZEND_FASTCALL shift_left_function(zval *result, zval *op1, zval *op
6060
ZEND_API int ZEND_FASTCALL shift_right_function(zval *result, zval *op1, zval *op2);
6161
ZEND_API int ZEND_FASTCALL concat_function(zval *result, zval *op1, zval *op2);
6262

63+
ZEND_API int ZEND_FASTCALL zend_is_identical(zval *op1, zval *op2);
64+
6365
ZEND_API int ZEND_FASTCALL is_equal_function(zval *result, zval *op1, zval *op2);
6466
ZEND_API int ZEND_FASTCALL is_identical_function(zval *result, zval *op1, zval *op2);
6567
ZEND_API int ZEND_FASTCALL is_not_identical_function(zval *result, zval *op1, zval *op2);
@@ -842,23 +844,20 @@ static zend_always_inline int fast_equal_check_string(zval *op1, zval *op2)
842844
return Z_LVAL(result) == 0;
843845
}
844846

845-
static zend_always_inline void fast_is_identical_function(zval *result, zval *op1, zval *op2)
847+
static zend_always_inline int fast_is_identical_function(zval *op1, zval *op2)
846848
{
847849
if (Z_TYPE_P(op1) != Z_TYPE_P(op2)) {
848-
ZVAL_FALSE(result);
849-
return;
850+
return 0;
850851
}
851-
is_identical_function(result, op1, op2);
852+
return zend_is_identical(op1, op2);
852853
}
853854

854-
static zend_always_inline void fast_is_not_identical_function(zval *result, zval *op1, zval *op2)
855+
static zend_always_inline int fast_is_not_identical_function(zval *op1, zval *op2)
855856
{
856857
if (Z_TYPE_P(op1) != Z_TYPE_P(op2)) {
857-
ZVAL_TRUE(result);
858-
return;
858+
return 1;
859859
}
860-
is_identical_function(result, op1, op2);
861-
ZVAL_BOOL(result, Z_TYPE_P(result) != IS_TRUE);
860+
return !zend_is_identical(op1, op2);
862861
}
863862

864863
#define ZEND_TRY_BINARY_OP1_OBJECT_OPERATION(opcode, binary_op) \

Zend/zend_vm_def.h

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -263,32 +263,39 @@ ZEND_VM_HANDLER(15, ZEND_IS_IDENTICAL, CONST|TMP|VAR|CV, CONST|TMP|VAR|CV)
263263
{
264264
USE_OPLINE
265265
zend_free_op free_op1, free_op2;
266+
int result;
266267

267268
SAVE_OPLINE();
268-
fast_is_identical_function(EX_VAR(opline->result.var),
269+
result = fast_is_identical_function(
269270
GET_OP1_ZVAL_PTR_DEREF(BP_VAR_R),
270271
GET_OP2_ZVAL_PTR_DEREF(BP_VAR_R));
271272
FREE_OP1();
272273
FREE_OP2();
273-
ZEND_VM_SMART_BRANCH(Z_TYPE_INFO_P(EX_VAR(opline->result.var)) == IS_TRUE, 1);
274-
CHECK_EXCEPTION();
274+
ZEND_VM_SMART_BRANCH(result, (OP1_TYPE|OP2_TYPE) & (IS_VAR|IS_TMP_VAR));
275+
ZVAL_BOOL(EX_VAR(opline->result.var), result);
276+
if ((OP1_TYPE|OP2_TYPE) & (IS_VAR|IS_TMP_VAR)) {
277+
CHECK_EXCEPTION();
278+
}
275279
ZEND_VM_NEXT_OPCODE();
276280
}
277281

278282
ZEND_VM_HANDLER(16, ZEND_IS_NOT_IDENTICAL, CONST|TMP|VAR|CV, CONST|TMP|VAR|CV)
279283
{
280284
USE_OPLINE
281285
zend_free_op free_op1, free_op2;
282-
zval *result = EX_VAR(opline->result.var);
286+
int result;
283287

284288
SAVE_OPLINE();
285-
fast_is_not_identical_function(result,
289+
result = fast_is_not_identical_function(
286290
GET_OP1_ZVAL_PTR_DEREF(BP_VAR_R),
287291
GET_OP2_ZVAL_PTR_DEREF(BP_VAR_R));
288292
FREE_OP1();
289293
FREE_OP2();
290-
ZEND_VM_SMART_BRANCH(Z_TYPE_INFO_P(EX_VAR(opline->result.var)) == IS_TRUE, 1);
291-
CHECK_EXCEPTION();
294+
ZEND_VM_SMART_BRANCH(result, (OP1_TYPE|OP2_TYPE) & (IS_VAR|IS_TMP_VAR));
295+
ZVAL_BOOL(EX_VAR(opline->result.var), result);
296+
if ((OP1_TYPE|OP2_TYPE) & (IS_VAR|IS_TMP_VAR)) {
297+
CHECK_EXCEPTION();
298+
}
292299
ZEND_VM_NEXT_OPCODE();
293300
}
294301

@@ -6915,8 +6922,9 @@ ZEND_VM_C_LABEL(try_instanceof):
69156922
} else {
69166923
result = 0;
69176924
}
6918-
ZVAL_BOOL(EX_VAR(opline->result.var), result);
69196925
FREE_OP1();
6926+
ZEND_VM_SMART_BRANCH(result, 1);
6927+
ZVAL_BOOL(EX_VAR(opline->result.var), result);
69206928
CHECK_EXCEPTION();
69216929
ZEND_VM_NEXT_OPCODE();
69226930
}

0 commit comments

Comments
 (0)