From 74c84cd7f0a3a6a5948d633e713b768dd1776cc8 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Mon, 4 Dec 2017 17:17:02 +0300 Subject: [PATCH] Use zend_string_equal*() API for zend_string equality check instead of direct memcmp() usage. --- Zend/zend_compile.c | 3 +- Zend/zend_constants.c | 3 +- Zend/zend_execute_API.c | 3 +- Zend/zend_hash.c | 9 +- Zend/zend_object_handlers.c | 9 +- Zend/zend_operators.c | 4 +- Zend/zend_operators.h | 35 ++- Zend/zend_string.c | 17 +- Zend/zend_string.h | 6 +- Zend/zend_vm_def.h | 45 +--- Zend/zend_vm_execute.h | 408 +++++----------------------------- ext/opcache/ZendAccelerator.c | 20 +- 12 files changed, 112 insertions(+), 450 deletions(-) diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index e625fcfe42..0287b7a01a 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -408,8 +408,7 @@ static int lookup_cv(zend_op_array *op_array, zend_string *name) /* {{{ */{ while (i < op_array->last_var) { if (ZSTR_VAL(op_array->vars[i]) == ZSTR_VAL(name) || (ZSTR_H(op_array->vars[i]) == hash_value && - ZSTR_LEN(op_array->vars[i]) == ZSTR_LEN(name) && - memcmp(ZSTR_VAL(op_array->vars[i]), ZSTR_VAL(name), ZSTR_LEN(name)) == 0)) { + zend_string_equal_content(op_array->vars[i], name))) { return (int)(zend_intptr_t)ZEND_CALL_VAR_NUM(NULL, i); } i++; diff --git a/Zend/zend_constants.c b/Zend/zend_constants.c index 639c15807d..6e96ce7fc9 100644 --- a/Zend/zend_constants.c +++ b/Zend/zend_constants.c @@ -487,8 +487,7 @@ ZEND_API int zend_register_constant(zend_constant *c) } /* Check if the user is trying to define the internal pseudo constant name __COMPILER_HALT_OFFSET__ */ - if ((ZSTR_LEN(c->name) == sizeof("__COMPILER_HALT_OFFSET__")-1 - && !memcmp(ZSTR_VAL(name), "__COMPILER_HALT_OFFSET__", sizeof("__COMPILER_HALT_OFFSET__")-1)) + if (zend_string_equals_literal(name, "__COMPILER_HALT_OFFSET__") || zend_hash_add_constant(EG(zend_constants), name, c) == NULL) { /* The internal __COMPILER_HALT_OFFSET__ is prefixed by NULL byte */ diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c index c8d1e49376..8e366ca75c 100644 --- a/Zend/zend_execute_API.c +++ b/Zend/zend_execute_API.c @@ -1602,8 +1602,7 @@ ZEND_API int zend_set_local_var(zend_string *name, zval *value, int force) /* {{ do { if (ZSTR_H(*str) == h && - ZSTR_LEN(*str) == ZSTR_LEN(name) && - memcmp(ZSTR_VAL(*str), ZSTR_VAL(name), ZSTR_LEN(name)) == 0) { + zend_string_equal_content(*str, name)) { zval *var = EX_VAR_NUM(str - op_array->vars); ZVAL_COPY_VALUE(var, value); return SUCCESS; diff --git a/Zend/zend_hash.c b/Zend/zend_hash.c index 08dd56ff27..ec2141eec4 100644 --- a/Zend/zend_hash.c +++ b/Zend/zend_hash.c @@ -486,8 +486,7 @@ static zend_always_inline Bucket *zend_hash_find_bucket(const HashTable *ht, zen return p; } else if (EXPECTED(p->h == h) && EXPECTED(p->key) && - EXPECTED(ZSTR_LEN(p->key) == ZSTR_LEN(key)) && - EXPECTED(memcmp(ZSTR_VAL(p->key), ZSTR_VAL(key), ZSTR_LEN(key)) == 0)) { + EXPECTED(zend_string_equal_content(p->key, key))) { return p; } idx = Z_NEXT(p->val); @@ -1125,8 +1124,7 @@ ZEND_API int ZEND_FASTCALL zend_hash_del(HashTable *ht, zend_string *key) if ((p->key == key) || (p->h == h && p->key && - ZSTR_LEN(p->key) == ZSTR_LEN(key) && - memcmp(ZSTR_VAL(p->key), ZSTR_VAL(key), ZSTR_LEN(key)) == 0)) { + zend_string_equal_content(p->key, key))) { _zend_hash_del_el_ex(ht, idx, p, prev); return SUCCESS; } @@ -1156,8 +1154,7 @@ ZEND_API int ZEND_FASTCALL zend_hash_del_ind(HashTable *ht, zend_string *key) if ((p->key == key) || (p->h == h && p->key && - ZSTR_LEN(p->key) == ZSTR_LEN(key) && - memcmp(ZSTR_VAL(p->key), ZSTR_VAL(key), ZSTR_LEN(key)) == 0)) { + zend_string_equal_content(p->key, key))) { if (Z_TYPE(p->val) == IS_INDIRECT) { zval *data = Z_INDIRECT(p->val); diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index 4a78d796fe..d99fb7338f 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -502,8 +502,7 @@ ZEND_API uint32_t *zend_get_property_guard(zend_object *zobj, zend_string *membe if (EXPECTED(str == member) || /* hash values are always pred-calculated here */ (EXPECTED(ZSTR_H(str) == ZSTR_H(member)) && - EXPECTED(ZSTR_LEN(str) == ZSTR_LEN(member)) && - EXPECTED(memcmp(ZSTR_VAL(str), ZSTR_VAL(member), ZSTR_LEN(member)) == 0))) { + EXPECTED(zend_string_equal_content(str, member)))) { return &zv->u2.property_guard; } else if (EXPECTED(zv->u2.property_guard == 0)) { zend_string_release(Z_STR_P(zv)); @@ -580,8 +579,7 @@ zval *zend_std_read_property(zval *object, zval *member, int type, void **cache_ (EXPECTED(p->key == Z_STR_P(member)) || (EXPECTED(p->h == ZSTR_H(Z_STR_P(member))) && EXPECTED(p->key != NULL) && - EXPECTED(ZSTR_LEN(p->key) == Z_STRLEN_P(member)) && - EXPECTED(memcmp(ZSTR_VAL(p->key), Z_STRVAL_P(member), Z_STRLEN_P(member)) == 0)))) { + EXPECTED(zend_string_equal_content(p->key, Z_STR_P(member)))))) { retval = &p->val; goto exit; } @@ -1563,8 +1561,7 @@ static int zend_std_has_property(zval *object, zval *member, int has_set_exists, (EXPECTED(p->key == Z_STR_P(member)) || (EXPECTED(p->h == ZSTR_H(Z_STR_P(member))) && EXPECTED(p->key != NULL) && - EXPECTED(ZSTR_LEN(p->key) == Z_STRLEN_P(member)) && - EXPECTED(memcmp(ZSTR_VAL(p->key), Z_STRVAL_P(member), Z_STRLEN_P(member)) == 0)))) { + EXPECTED(zend_string_equal_content(p->key, Z_STR_P(member)))))) { value = &p->val; goto found; } diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c index d3f7729fed..7217108338 100644 --- a/Zend/zend_operators.c +++ b/Zend/zend_operators.c @@ -2143,9 +2143,7 @@ ZEND_API int ZEND_FASTCALL zend_is_identical(zval *op1, zval *op2) /* {{{ */ case IS_DOUBLE: return (Z_DVAL_P(op1) == Z_DVAL_P(op2)); case IS_STRING: - return (Z_STR_P(op1) == Z_STR_P(op2) || - (Z_STRLEN_P(op1) == Z_STRLEN_P(op2) && - memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1)) == 0)); + return zend_string_equals(Z_STR_P(op1), Z_STR_P(op2)); case IS_ARRAY: return (Z_ARRVAL_P(op1) == Z_ARRVAL_P(op2) || zend_hash_compare(Z_ARRVAL_P(op1), Z_ARRVAL_P(op2), (compare_func_t) hash_zval_identical_function, 1) == 0); diff --git a/Zend/zend_operators.h b/Zend/zend_operators.h index 50e1e2dd58..a21727f7ab 100644 --- a/Zend/zend_operators.h +++ b/Zend/zend_operators.h @@ -721,6 +721,17 @@ static zend_always_inline int fast_div_function(zval *result, zval *op1, zval *o return div_function(result, op1, op2); } +static zend_always_inline int zend_fast_equal_strings(zend_string *s1, zend_string *s2) +{ + if (s1 == s2) { + return 1; + } else if (ZSTR_VAL(s1)[0] > '9' || ZSTR_VAL(s2)[0] > '9') { + return zend_string_equal_content(s1, s2); + } else { + return zendi_smart_strcmp(s1, s2) == 0; + } +} + static zend_always_inline int fast_equal_check_function(zval *op1, zval *op2) { zval result; @@ -738,17 +749,7 @@ static zend_always_inline int fast_equal_check_function(zval *op1, zval *op2) } } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) { if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) { - if (Z_STR_P(op1) == Z_STR_P(op2)) { - return 1; - } else if (Z_STRVAL_P(op1)[0] > '9' || Z_STRVAL_P(op2)[0] > '9') { - if (Z_STRLEN_P(op1) != Z_STRLEN_P(op2)) { - return 0; - } else { - return memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1)) == 0; - } - } else { - return zendi_smart_strcmp(Z_STR_P(op1), Z_STR_P(op2)) == 0; - } + return zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2)); } } compare_function(&result, op1, op2); @@ -769,17 +770,7 @@ static zend_always_inline int fast_equal_check_string(zval *op1, zval *op2) { zval result; if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) { - if (Z_STR_P(op1) == Z_STR_P(op2)) { - return 1; - } else if (Z_STRVAL_P(op1)[0] > '9' || Z_STRVAL_P(op2)[0] > '9') { - if (Z_STRLEN_P(op1) != Z_STRLEN_P(op2)) { - return 0; - } else { - return memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1)) == 0; - } - } else { - return zendi_smart_strcmp(Z_STR_P(op1), Z_STR_P(op2)) == 0; - } + return zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2)); } compare_function(&result, op1, op2); return Z_LVAL(result) == 0; diff --git a/Zend/zend_string.c b/Zend/zend_string.c index ad51148d4a..bceb328f7f 100644 --- a/Zend/zend_string.c +++ b/Zend/zend_string.c @@ -129,7 +129,22 @@ static zend_always_inline zend_string *zend_interned_string_ht_lookup_ex(zend_ul static zend_always_inline zend_string *zend_interned_string_ht_lookup(zend_string *str, HashTable *interned_strings) { - return zend_interned_string_ht_lookup_ex(ZSTR_H(str), ZSTR_VAL(str), ZSTR_LEN(str), interned_strings); + zend_ulong h = ZSTR_H(str); + uint32_t nIndex; + uint32_t idx; + Bucket *p; + + nIndex = h | interned_strings->nTableMask; + idx = HT_HASH(interned_strings, nIndex); + while (idx != HT_INVALID_IDX) { + p = HT_HASH_TO_BUCKET(interned_strings, idx); + if ((p->h == h) && zend_string_equal_content(p->key, str)) { + return p->key; + } + idx = Z_NEXT(p->val); + } + + return NULL; } /* This function might be not thread safe at least because it would update the diff --git a/Zend/zend_string.h b/Zend/zend_string.h index eb981df822..686895d817 100644 --- a/Zend/zend_string.h +++ b/Zend/zend_string.h @@ -288,10 +288,14 @@ static zend_always_inline void zend_string_release(zend_string *s) } } +static zend_always_inline zend_bool zend_string_equal_content(zend_string *s1, zend_string *s2) +{ + return ZSTR_LEN(s1) == ZSTR_LEN(s2) && !memcmp(ZSTR_VAL(s1), ZSTR_VAL(s2), ZSTR_LEN(s1)); +} static zend_always_inline zend_bool zend_string_equals(zend_string *s1, zend_string *s2) { - return s1 == s2 || (ZSTR_LEN(s1) == ZSTR_LEN(s2) && !memcmp(ZSTR_VAL(s1), ZSTR_VAL(s2), ZSTR_LEN(s1))); + return s1 == s2 || zend_string_equal_content(s1, s2); } #define zend_string_equals_ci(s1, s2) \ diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 0513034107..e9b79c3885 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -409,17 +409,7 @@ ZEND_VM_HANDLER(17, ZEND_IS_EQUAL, CONST|TMPVAR|CV, CONST|TMPVAR|CV) } } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) { if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) { - if (Z_STR_P(op1) == Z_STR_P(op2)) { - result = 1; - } else if (Z_STRVAL_P(op1)[0] > '9' || Z_STRVAL_P(op2)[0] > '9') { - if (Z_STRLEN_P(op1) != Z_STRLEN_P(op2)) { - result = 0; - } else { - result = (memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1)) == 0); - } - } else { - result = (zendi_smart_strcmp(Z_STR_P(op1), Z_STR_P(op2)) == 0); - } + result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2)); FREE_OP1(); FREE_OP2(); } else { @@ -477,17 +467,7 @@ ZEND_VM_HANDLER(18, ZEND_IS_NOT_EQUAL, CONST|TMPVAR|CV, CONST|TMPVAR|CV) } } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) { if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) { - if (Z_STR_P(op1) == Z_STR_P(op2)) { - result = 0; - } else if (Z_STRVAL_P(op1)[0] > '9' || Z_STRVAL_P(op2)[0] > '9') { - if (Z_STRLEN_P(op1) != Z_STRLEN_P(op2)) { - result = 1; - } else { - result = (memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1)) != 0); - } - } else { - result = (zendi_smart_strcmp(Z_STR_P(op1), Z_STR_P(op2)) != 0); - } + result = !zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2)); FREE_OP1(); FREE_OP2(); } else { @@ -1809,8 +1789,7 @@ ZEND_VM_HANDLER(82, ZEND_FETCH_OBJ_R, CONST|TMP|VAR|UNUSED|THIS|CV, CONST|TMPVAR (EXPECTED(p->key == Z_STR_P(offset)) || (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) && EXPECTED(p->key != NULL) && - EXPECTED(ZSTR_LEN(p->key) == Z_STRLEN_P(offset)) && - EXPECTED(memcmp(ZSTR_VAL(p->key), Z_STRVAL_P(offset), Z_STRLEN_P(offset)) == 0)))) { + EXPECTED(zend_string_equal_content(p->key, Z_STR_P(offset)))))) { ZVAL_COPY_UNREF(EX_VAR(opline->result.var), &p->val); break; } @@ -1957,8 +1936,7 @@ ZEND_VM_HANDLER(91, ZEND_FETCH_OBJ_IS, CONST|TMPVAR|UNUSED|THIS|CV, CONST|TMPVAR (EXPECTED(p->key == Z_STR_P(offset)) || (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) && EXPECTED(p->key != NULL) && - EXPECTED(ZSTR_LEN(p->key) == Z_STRLEN_P(offset)) && - EXPECTED(memcmp(ZSTR_VAL(p->key), Z_STRVAL_P(offset), Z_STRLEN_P(offset)) == 0)))) { + EXPECTED(zend_string_equal_content(p->key, Z_STR_P(offset)))))) { ZVAL_COPY(EX_VAR(opline->result.var), &p->val); break; } @@ -4850,17 +4828,7 @@ ZEND_VM_HANDLER(48, ZEND_CASE, CONST|TMPVAR|CV, CONST|TMPVAR|CV) } } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) { if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) { - if (Z_STR_P(op1) == Z_STR_P(op2)) { - result = 1; - } else if (Z_STRVAL_P(op1)[0] > '9' || Z_STRVAL_P(op2)[0] > '9') { - if (Z_STRLEN_P(op1) != Z_STRLEN_P(op2)) { - result = 0; - } else { - result = (memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1)) == 0); - } - } else { - result = (zendi_smart_strcmp(Z_STR_P(op1), Z_STR_P(op2)) == 0); - } + result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2)); FREE_OP2(); } else { break; @@ -7588,8 +7556,7 @@ ZEND_VM_HOT_HANDLER(168, ZEND_BIND_GLOBAL, CV, CONST) (EXPECTED(p->key == Z_STR_P(varname)) || (EXPECTED(p->h == ZSTR_H(Z_STR_P(varname))) && EXPECTED(p->key != NULL) && - EXPECTED(ZSTR_LEN(p->key) == Z_STRLEN_P(varname)) && - EXPECTED(memcmp(ZSTR_VAL(p->key), Z_STRVAL_P(varname), Z_STRLEN_P(varname)) == 0)))) { + EXPECTED(zend_string_equal_content(p->key, Z_STR_P(varname)))))) { value = (zval*)p; /* value = &p->val; */ ZEND_VM_C_GOTO(check_indirect); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 185a89a496..20778c0487 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -4523,17 +4523,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CONST_CONST_HAND } } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) { if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) { - if (Z_STR_P(op1) == Z_STR_P(op2)) { - result = 1; - } else if (Z_STRVAL_P(op1)[0] > '9' || Z_STRVAL_P(op2)[0] > '9') { - if (Z_STRLEN_P(op1) != Z_STRLEN_P(op2)) { - result = 0; - } else { - result = (memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1)) == 0); - } - } else { - result = (zendi_smart_strcmp(Z_STR_P(op1), Z_STR_P(op2)) == 0); - } + result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2)); } else { @@ -4591,17 +4581,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CONST_CONST_ } } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) { if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) { - if (Z_STR_P(op1) == Z_STR_P(op2)) { - result = 0; - } else if (Z_STRVAL_P(op1)[0] > '9' || Z_STRVAL_P(op2)[0] > '9') { - if (Z_STRLEN_P(op1) != Z_STRLEN_P(op2)) { - result = 1; - } else { - result = (memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1)) != 0); - } - } else { - result = (zendi_smart_strcmp(Z_STR_P(op1), Z_STR_P(op2)) != 0); - } + result = !zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2)); } else { @@ -5062,8 +5042,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CONST_H (EXPECTED(p->key == Z_STR_P(offset)) || (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) && EXPECTED(p->key != NULL) && - EXPECTED(ZSTR_LEN(p->key) == Z_STRLEN_P(offset)) && - EXPECTED(memcmp(ZSTR_VAL(p->key), Z_STRVAL_P(offset), Z_STRLEN_P(offset)) == 0)))) { + EXPECTED(zend_string_equal_content(p->key, Z_STR_P(offset)))))) { ZVAL_COPY_UNREF(EX_VAR(opline->result.var), &p->val); break; } @@ -5162,8 +5141,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CONST_CONST_ (EXPECTED(p->key == Z_STR_P(offset)) || (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) && EXPECTED(p->key != NULL) && - EXPECTED(ZSTR_LEN(p->key) == Z_STRLEN_P(offset)) && - EXPECTED(memcmp(ZSTR_VAL(p->key), Z_STRVAL_P(offset), Z_STRLEN_P(offset)) == 0)))) { + EXPECTED(zend_string_equal_content(p->key, Z_STR_P(offset)))))) { ZVAL_COPY(EX_VAR(opline->result.var), &p->val); break; } @@ -5745,17 +5723,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CASE_SPEC_CONST_CONST_HANDLER( } } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) { if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) { - if (Z_STR_P(op1) == Z_STR_P(op2)) { - result = 1; - } else if (Z_STRVAL_P(op1)[0] > '9' || Z_STRVAL_P(op2)[0] > '9') { - if (Z_STRLEN_P(op1) != Z_STRLEN_P(op2)) { - result = 0; - } else { - result = (memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1)) == 0); - } - } else { - result = (zendi_smart_strcmp(Z_STR_P(op1), Z_STR_P(op2)) == 0); - } + result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2)); } else { break; @@ -8698,17 +8666,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CONST_CV_HANDLER } } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) { if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) { - if (Z_STR_P(op1) == Z_STR_P(op2)) { - result = 1; - } else if (Z_STRVAL_P(op1)[0] > '9' || Z_STRVAL_P(op2)[0] > '9') { - if (Z_STRLEN_P(op1) != Z_STRLEN_P(op2)) { - result = 0; - } else { - result = (memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1)) == 0); - } - } else { - result = (zendi_smart_strcmp(Z_STR_P(op1), Z_STR_P(op2)) == 0); - } + result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2)); } else { @@ -8766,17 +8724,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CONST_CV_HAN } } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) { if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) { - if (Z_STR_P(op1) == Z_STR_P(op2)) { - result = 0; - } else if (Z_STRVAL_P(op1)[0] > '9' || Z_STRVAL_P(op2)[0] > '9') { - if (Z_STRLEN_P(op1) != Z_STRLEN_P(op2)) { - result = 1; - } else { - result = (memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1)) != 0); - } - } else { - result = (zendi_smart_strcmp(Z_STR_P(op1), Z_STR_P(op2)) != 0); - } + result = !zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2)); } else { @@ -9170,8 +9118,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CV_HAND (EXPECTED(p->key == Z_STR_P(offset)) || (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) && EXPECTED(p->key != NULL) && - EXPECTED(ZSTR_LEN(p->key) == Z_STRLEN_P(offset)) && - EXPECTED(memcmp(ZSTR_VAL(p->key), Z_STRVAL_P(offset), Z_STRLEN_P(offset)) == 0)))) { + EXPECTED(zend_string_equal_content(p->key, Z_STR_P(offset)))))) { ZVAL_COPY_UNREF(EX_VAR(opline->result.var), &p->val); break; } @@ -9270,8 +9217,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CONST_CV_HAN (EXPECTED(p->key == Z_STR_P(offset)) || (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) && EXPECTED(p->key != NULL) && - EXPECTED(ZSTR_LEN(p->key) == Z_STRLEN_P(offset)) && - EXPECTED(memcmp(ZSTR_VAL(p->key), Z_STRVAL_P(offset), Z_STRLEN_P(offset)) == 0)))) { + EXPECTED(zend_string_equal_content(p->key, Z_STR_P(offset)))))) { ZVAL_COPY(EX_VAR(opline->result.var), &p->val); break; } @@ -9908,17 +9854,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CASE_SPEC_CONST_CV_HANDLER(ZEN } } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) { if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) { - if (Z_STR_P(op1) == Z_STR_P(op2)) { - result = 1; - } else if (Z_STRVAL_P(op1)[0] > '9' || Z_STRVAL_P(op2)[0] > '9') { - if (Z_STRLEN_P(op1) != Z_STRLEN_P(op2)) { - result = 0; - } else { - result = (memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1)) == 0); - } - } else { - result = (zendi_smart_strcmp(Z_STR_P(op1), Z_STR_P(op2)) == 0); - } + result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2)); } else { break; @@ -10767,17 +10703,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CONST_TMPVAR_HAN } } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) { if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) { - if (Z_STR_P(op1) == Z_STR_P(op2)) { - result = 1; - } else if (Z_STRVAL_P(op1)[0] > '9' || Z_STRVAL_P(op2)[0] > '9') { - if (Z_STRLEN_P(op1) != Z_STRLEN_P(op2)) { - result = 0; - } else { - result = (memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1)) == 0); - } - } else { - result = (zendi_smart_strcmp(Z_STR_P(op1), Z_STR_P(op2)) == 0); - } + result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2)); zval_ptr_dtor_nogc(free_op2); } else { @@ -10835,17 +10761,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CONST_TMPVAR } } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) { if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) { - if (Z_STR_P(op1) == Z_STR_P(op2)) { - result = 0; - } else if (Z_STRVAL_P(op1)[0] > '9' || Z_STRVAL_P(op2)[0] > '9') { - if (Z_STRLEN_P(op1) != Z_STRLEN_P(op2)) { - result = 1; - } else { - result = (memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1)) != 0); - } - } else { - result = (zendi_smart_strcmp(Z_STR_P(op1), Z_STR_P(op2)) != 0); - } + result = !zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2)); zval_ptr_dtor_nogc(free_op2); } else { @@ -11239,8 +11155,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_TMPVAR_ (EXPECTED(p->key == Z_STR_P(offset)) || (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) && EXPECTED(p->key != NULL) && - EXPECTED(ZSTR_LEN(p->key) == Z_STRLEN_P(offset)) && - EXPECTED(memcmp(ZSTR_VAL(p->key), Z_STRVAL_P(offset), Z_STRLEN_P(offset)) == 0)))) { + EXPECTED(zend_string_equal_content(p->key, Z_STR_P(offset)))))) { ZVAL_COPY_UNREF(EX_VAR(opline->result.var), &p->val); break; } @@ -11340,8 +11255,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CONST_TMPVAR (EXPECTED(p->key == Z_STR_P(offset)) || (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) && EXPECTED(p->key != NULL) && - EXPECTED(ZSTR_LEN(p->key) == Z_STRLEN_P(offset)) && - EXPECTED(memcmp(ZSTR_VAL(p->key), Z_STRVAL_P(offset), Z_STRLEN_P(offset)) == 0)))) { + EXPECTED(zend_string_equal_content(p->key, Z_STR_P(offset)))))) { ZVAL_COPY(EX_VAR(opline->result.var), &p->val); break; } @@ -11926,17 +11840,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CASE_SPEC_CONST_TMPVAR_HANDLER } } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) { if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) { - if (Z_STR_P(op1) == Z_STR_P(op2)) { - result = 1; - } else if (Z_STRVAL_P(op1)[0] > '9' || Z_STRVAL_P(op2)[0] > '9') { - if (Z_STRLEN_P(op1) != Z_STRLEN_P(op2)) { - result = 0; - } else { - result = (memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1)) == 0); - } - } else { - result = (zendi_smart_strcmp(Z_STR_P(op1), Z_STR_P(op2)) == 0); - } + result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2)); zval_ptr_dtor_nogc(free_op2); } else { break; @@ -13789,8 +13693,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_CONST_HAN (EXPECTED(p->key == Z_STR_P(offset)) || (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) && EXPECTED(p->key != NULL) && - EXPECTED(ZSTR_LEN(p->key) == Z_STRLEN_P(offset)) && - EXPECTED(memcmp(ZSTR_VAL(p->key), Z_STRVAL_P(offset), Z_STRLEN_P(offset)) == 0)))) { + EXPECTED(zend_string_equal_content(p->key, Z_STR_P(offset)))))) { ZVAL_COPY_UNREF(EX_VAR(opline->result.var), &p->val); break; } @@ -15164,8 +15067,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_CV_HANDLE (EXPECTED(p->key == Z_STR_P(offset)) || (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) && EXPECTED(p->key != NULL) && - EXPECTED(ZSTR_LEN(p->key) == Z_STRLEN_P(offset)) && - EXPECTED(memcmp(ZSTR_VAL(p->key), Z_STRVAL_P(offset), Z_STRLEN_P(offset)) == 0)))) { + EXPECTED(zend_string_equal_content(p->key, Z_STR_P(offset)))))) { ZVAL_COPY_UNREF(EX_VAR(opline->result.var), &p->val); break; } @@ -15717,8 +15619,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_TMPVAR_HA (EXPECTED(p->key == Z_STR_P(offset)) || (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) && EXPECTED(p->key != NULL) && - EXPECTED(ZSTR_LEN(p->key) == Z_STRLEN_P(offset)) && - EXPECTED(memcmp(ZSTR_VAL(p->key), Z_STRVAL_P(offset), Z_STRLEN_P(offset)) == 0)))) { + EXPECTED(zend_string_equal_content(p->key, Z_STR_P(offset)))))) { ZVAL_COPY_UNREF(EX_VAR(opline->result.var), &p->val); break; } @@ -18563,8 +18464,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CONST_HAN (EXPECTED(p->key == Z_STR_P(offset)) || (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) && EXPECTED(p->key != NULL) && - EXPECTED(ZSTR_LEN(p->key) == Z_STRLEN_P(offset)) && - EXPECTED(memcmp(ZSTR_VAL(p->key), Z_STRVAL_P(offset), Z_STRLEN_P(offset)) == 0)))) { + EXPECTED(zend_string_equal_content(p->key, Z_STR_P(offset)))))) { ZVAL_COPY_UNREF(EX_VAR(opline->result.var), &p->val); break; } @@ -22876,8 +22776,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CV_HANDLE (EXPECTED(p->key == Z_STR_P(offset)) || (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) && EXPECTED(p->key != NULL) && - EXPECTED(ZSTR_LEN(p->key) == Z_STRLEN_P(offset)) && - EXPECTED(memcmp(ZSTR_VAL(p->key), Z_STRVAL_P(offset), Z_STRLEN_P(offset)) == 0)))) { + EXPECTED(zend_string_equal_content(p->key, Z_STR_P(offset)))))) { ZVAL_COPY_UNREF(EX_VAR(opline->result.var), &p->val); break; } @@ -25485,8 +25384,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_TMPVAR_HA (EXPECTED(p->key == Z_STR_P(offset)) || (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) && EXPECTED(p->key != NULL) && - EXPECTED(ZSTR_LEN(p->key) == Z_STRLEN_P(offset)) && - EXPECTED(memcmp(ZSTR_VAL(p->key), Z_STRVAL_P(offset), Z_STRLEN_P(offset)) == 0)))) { + EXPECTED(zend_string_equal_content(p->key, Z_STR_P(offset)))))) { ZVAL_COPY_UNREF(EX_VAR(opline->result.var), &p->val); break; } @@ -27548,8 +27446,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CONST_ (EXPECTED(p->key == Z_STR_P(offset)) || (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) && EXPECTED(p->key != NULL) && - EXPECTED(ZSTR_LEN(p->key) == Z_STRLEN_P(offset)) && - EXPECTED(memcmp(ZSTR_VAL(p->key), Z_STRVAL_P(offset), Z_STRLEN_P(offset)) == 0)))) { + EXPECTED(zend_string_equal_content(p->key, Z_STR_P(offset)))))) { ZVAL_COPY_UNREF(EX_VAR(opline->result.var), &p->val); break; } @@ -27695,8 +27592,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_UNUSED_CONST (EXPECTED(p->key == Z_STR_P(offset)) || (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) && EXPECTED(p->key != NULL) && - EXPECTED(ZSTR_LEN(p->key) == Z_STRLEN_P(offset)) && - EXPECTED(memcmp(ZSTR_VAL(p->key), Z_STRVAL_P(offset), Z_STRLEN_P(offset)) == 0)))) { + EXPECTED(zend_string_equal_content(p->key, Z_STR_P(offset)))))) { ZVAL_COPY(EX_VAR(opline->result.var), &p->val); break; } @@ -30184,8 +30080,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CV_HAN (EXPECTED(p->key == Z_STR_P(offset)) || (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) && EXPECTED(p->key != NULL) && - EXPECTED(ZSTR_LEN(p->key) == Z_STRLEN_P(offset)) && - EXPECTED(memcmp(ZSTR_VAL(p->key), Z_STRVAL_P(offset), Z_STRLEN_P(offset)) == 0)))) { + EXPECTED(zend_string_equal_content(p->key, Z_STR_P(offset)))))) { ZVAL_COPY_UNREF(EX_VAR(opline->result.var), &p->val); break; } @@ -30331,8 +30226,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_UNUSED_CV_HA (EXPECTED(p->key == Z_STR_P(offset)) || (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) && EXPECTED(p->key != NULL) && - EXPECTED(ZSTR_LEN(p->key) == Z_STRLEN_P(offset)) && - EXPECTED(memcmp(ZSTR_VAL(p->key), Z_STRVAL_P(offset), Z_STRLEN_P(offset)) == 0)))) { + EXPECTED(zend_string_equal_content(p->key, Z_STR_P(offset)))))) { ZVAL_COPY(EX_VAR(opline->result.var), &p->val); break; } @@ -31939,8 +31833,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR (EXPECTED(p->key == Z_STR_P(offset)) || (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) && EXPECTED(p->key != NULL) && - EXPECTED(ZSTR_LEN(p->key) == Z_STRLEN_P(offset)) && - EXPECTED(memcmp(ZSTR_VAL(p->key), Z_STRVAL_P(offset), Z_STRLEN_P(offset)) == 0)))) { + EXPECTED(zend_string_equal_content(p->key, Z_STR_P(offset)))))) { ZVAL_COPY_UNREF(EX_VAR(opline->result.var), &p->val); break; } @@ -32087,8 +31980,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_UNUSED_TMPVA (EXPECTED(p->key == Z_STR_P(offset)) || (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) && EXPECTED(p->key != NULL) && - EXPECTED(ZSTR_LEN(p->key) == Z_STRLEN_P(offset)) && - EXPECTED(memcmp(ZSTR_VAL(p->key), Z_STRVAL_P(offset), Z_STRLEN_P(offset)) == 0)))) { + EXPECTED(zend_string_equal_content(p->key, Z_STR_P(offset)))))) { ZVAL_COPY(EX_VAR(opline->result.var), &p->val); break; } @@ -35357,17 +35249,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CV_CONST_HANDLER } } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) { if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) { - if (Z_STR_P(op1) == Z_STR_P(op2)) { - result = 1; - } else if (Z_STRVAL_P(op1)[0] > '9' || Z_STRVAL_P(op2)[0] > '9') { - if (Z_STRLEN_P(op1) != Z_STRLEN_P(op2)) { - result = 0; - } else { - result = (memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1)) == 0); - } - } else { - result = (zendi_smart_strcmp(Z_STR_P(op1), Z_STR_P(op2)) == 0); - } + result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2)); } else { @@ -35425,17 +35307,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CV_CONST_HAN } } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) { if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) { - if (Z_STR_P(op1) == Z_STR_P(op2)) { - result = 0; - } else if (Z_STRVAL_P(op1)[0] > '9' || Z_STRVAL_P(op2)[0] > '9') { - if (Z_STRLEN_P(op1) != Z_STRLEN_P(op2)) { - result = 1; - } else { - result = (memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1)) != 0); - } - } else { - result = (zendi_smart_strcmp(Z_STR_P(op1), Z_STR_P(op2)) != 0); - } + result = !zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2)); } else { @@ -36517,8 +36389,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CONST_HAND (EXPECTED(p->key == Z_STR_P(offset)) || (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) && EXPECTED(p->key != NULL) && - EXPECTED(ZSTR_LEN(p->key) == Z_STRLEN_P(offset)) && - EXPECTED(memcmp(ZSTR_VAL(p->key), Z_STRVAL_P(offset), Z_STRLEN_P(offset)) == 0)))) { + EXPECTED(zend_string_equal_content(p->key, Z_STR_P(offset)))))) { ZVAL_COPY_UNREF(EX_VAR(opline->result.var), &p->val); break; } @@ -36664,8 +36535,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CV_CONST_HAN (EXPECTED(p->key == Z_STR_P(offset)) || (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) && EXPECTED(p->key != NULL) && - EXPECTED(ZSTR_LEN(p->key) == Z_STRLEN_P(offset)) && - EXPECTED(memcmp(ZSTR_VAL(p->key), Z_STRVAL_P(offset), Z_STRLEN_P(offset)) == 0)))) { + EXPECTED(zend_string_equal_content(p->key, Z_STR_P(offset)))))) { ZVAL_COPY(EX_VAR(opline->result.var), &p->val); break; } @@ -38078,17 +37948,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CASE_SPEC_CV_CONST_HANDLER(ZEN } } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) { if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) { - if (Z_STR_P(op1) == Z_STR_P(op2)) { - result = 1; - } else if (Z_STRVAL_P(op1)[0] > '9' || Z_STRVAL_P(op2)[0] > '9') { - if (Z_STRLEN_P(op1) != Z_STRLEN_P(op2)) { - result = 0; - } else { - result = (memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1)) == 0); - } - } else { - result = (zendi_smart_strcmp(Z_STR_P(op1), Z_STR_P(op2)) == 0); - } + result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2)); } else { break; @@ -38891,8 +38751,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BIND_GLOBAL_SPEC_C (EXPECTED(p->key == Z_STR_P(varname)) || (EXPECTED(p->h == ZSTR_H(Z_STR_P(varname))) && EXPECTED(p->key != NULL) && - EXPECTED(ZSTR_LEN(p->key) == Z_STRLEN_P(varname)) && - EXPECTED(memcmp(ZSTR_VAL(p->key), Z_STRVAL_P(varname), Z_STRLEN_P(varname)) == 0)))) { + EXPECTED(zend_string_equal_content(p->key, Z_STR_P(varname)))))) { value = (zval*)p; /* value = &p->val; */ goto check_indirect; @@ -41908,17 +41767,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CV_CV_HANDLER(ZE } } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) { if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) { - if (Z_STR_P(op1) == Z_STR_P(op2)) { - result = 1; - } else if (Z_STRVAL_P(op1)[0] > '9' || Z_STRVAL_P(op2)[0] > '9') { - if (Z_STRLEN_P(op1) != Z_STRLEN_P(op2)) { - result = 0; - } else { - result = (memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1)) == 0); - } - } else { - result = (zendi_smart_strcmp(Z_STR_P(op1), Z_STR_P(op2)) == 0); - } + result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2)); } else { @@ -41976,17 +41825,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CV_CV_HANDLE } } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) { if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) { - if (Z_STR_P(op1) == Z_STR_P(op2)) { - result = 0; - } else if (Z_STRVAL_P(op1)[0] > '9' || Z_STRVAL_P(op2)[0] > '9') { - if (Z_STRLEN_P(op1) != Z_STRLEN_P(op2)) { - result = 1; - } else { - result = (memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1)) != 0); - } - } else { - result = (zendi_smart_strcmp(Z_STR_P(op1), Z_STR_P(op2)) != 0); - } + result = !zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2)); } else { @@ -43001,8 +42840,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CV_HANDLER (EXPECTED(p->key == Z_STR_P(offset)) || (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) && EXPECTED(p->key != NULL) && - EXPECTED(ZSTR_LEN(p->key) == Z_STRLEN_P(offset)) && - EXPECTED(memcmp(ZSTR_VAL(p->key), Z_STRVAL_P(offset), Z_STRLEN_P(offset)) == 0)))) { + EXPECTED(zend_string_equal_content(p->key, Z_STR_P(offset)))))) { ZVAL_COPY_UNREF(EX_VAR(opline->result.var), &p->val); break; } @@ -43148,8 +42986,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CV_CV_HANDLE (EXPECTED(p->key == Z_STR_P(offset)) || (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) && EXPECTED(p->key != NULL) && - EXPECTED(ZSTR_LEN(p->key) == Z_STRLEN_P(offset)) && - EXPECTED(memcmp(ZSTR_VAL(p->key), Z_STRVAL_P(offset), Z_STRLEN_P(offset)) == 0)))) { + EXPECTED(zend_string_equal_content(p->key, Z_STR_P(offset)))))) { ZVAL_COPY(EX_VAR(opline->result.var), &p->val); break; } @@ -44618,17 +44455,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CASE_SPEC_CV_CV_HANDLER(ZEND_O } } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) { if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) { - if (Z_STR_P(op1) == Z_STR_P(op2)) { - result = 1; - } else if (Z_STRVAL_P(op1)[0] > '9' || Z_STRVAL_P(op2)[0] > '9') { - if (Z_STRLEN_P(op1) != Z_STRLEN_P(op2)) { - result = 0; - } else { - result = (memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1)) == 0); - } - } else { - result = (zendi_smart_strcmp(Z_STR_P(op1), Z_STR_P(op2)) == 0); - } + result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2)); } else { break; @@ -45606,17 +45433,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_CV_TMPVAR_HANDLE } } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) { if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) { - if (Z_STR_P(op1) == Z_STR_P(op2)) { - result = 1; - } else if (Z_STRVAL_P(op1)[0] > '9' || Z_STRVAL_P(op2)[0] > '9') { - if (Z_STRLEN_P(op1) != Z_STRLEN_P(op2)) { - result = 0; - } else { - result = (memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1)) == 0); - } - } else { - result = (zendi_smart_strcmp(Z_STR_P(op1), Z_STR_P(op2)) == 0); - } + result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2)); zval_ptr_dtor_nogc(free_op2); } else { @@ -45674,17 +45491,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_CV_TMPVAR_HA } } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) { if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) { - if (Z_STR_P(op1) == Z_STR_P(op2)) { - result = 0; - } else if (Z_STRVAL_P(op1)[0] > '9' || Z_STRVAL_P(op2)[0] > '9') { - if (Z_STRLEN_P(op1) != Z_STRLEN_P(op2)) { - result = 1; - } else { - result = (memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1)) != 0); - } - } else { - result = (zendi_smart_strcmp(Z_STR_P(op1), Z_STR_P(op2)) != 0); - } + result = !zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2)); zval_ptr_dtor_nogc(free_op2); } else { @@ -46703,8 +46510,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR_HAN (EXPECTED(p->key == Z_STR_P(offset)) || (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) && EXPECTED(p->key != NULL) && - EXPECTED(ZSTR_LEN(p->key) == Z_STRLEN_P(offset)) && - EXPECTED(memcmp(ZSTR_VAL(p->key), Z_STRVAL_P(offset), Z_STRLEN_P(offset)) == 0)))) { + EXPECTED(zend_string_equal_content(p->key, Z_STR_P(offset)))))) { ZVAL_COPY_UNREF(EX_VAR(opline->result.var), &p->val); break; } @@ -46851,8 +46657,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CV_TMPVAR_HA (EXPECTED(p->key == Z_STR_P(offset)) || (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) && EXPECTED(p->key != NULL) && - EXPECTED(ZSTR_LEN(p->key) == Z_STRLEN_P(offset)) && - EXPECTED(memcmp(ZSTR_VAL(p->key), Z_STRVAL_P(offset), Z_STRLEN_P(offset)) == 0)))) { + EXPECTED(zend_string_equal_content(p->key, Z_STR_P(offset)))))) { ZVAL_COPY(EX_VAR(opline->result.var), &p->val); break; } @@ -48211,17 +48016,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CASE_SPEC_CV_TMPVAR_HANDLER(ZE } } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) { if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) { - if (Z_STR_P(op1) == Z_STR_P(op2)) { - result = 1; - } else if (Z_STRVAL_P(op1)[0] > '9' || Z_STRVAL_P(op2)[0] > '9') { - if (Z_STRLEN_P(op1) != Z_STRLEN_P(op2)) { - result = 0; - } else { - result = (memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1)) == 0); - } - } else { - result = (zendi_smart_strcmp(Z_STR_P(op1), Z_STR_P(op2)) == 0); - } + result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2)); zval_ptr_dtor_nogc(free_op2); } else { break; @@ -49598,17 +49393,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_TMPVAR_CONST_HAN } } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) { if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) { - if (Z_STR_P(op1) == Z_STR_P(op2)) { - result = 1; - } else if (Z_STRVAL_P(op1)[0] > '9' || Z_STRVAL_P(op2)[0] > '9') { - if (Z_STRLEN_P(op1) != Z_STRLEN_P(op2)) { - result = 0; - } else { - result = (memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1)) == 0); - } - } else { - result = (zendi_smart_strcmp(Z_STR_P(op1), Z_STR_P(op2)) == 0); - } + result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2)); zval_ptr_dtor_nogc(free_op1); } else { @@ -49666,17 +49451,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_CONST } } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) { if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) { - if (Z_STR_P(op1) == Z_STR_P(op2)) { - result = 0; - } else if (Z_STRVAL_P(op1)[0] > '9' || Z_STRVAL_P(op2)[0] > '9') { - if (Z_STRLEN_P(op1) != Z_STRLEN_P(op2)) { - result = 1; - } else { - result = (memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1)) != 0); - } - } else { - result = (zendi_smart_strcmp(Z_STR_P(op1), Z_STR_P(op2)) != 0); - } + result = !zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2)); zval_ptr_dtor_nogc(free_op1); } else { @@ -50094,8 +49869,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CONST (EXPECTED(p->key == Z_STR_P(offset)) || (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) && EXPECTED(p->key != NULL) && - EXPECTED(ZSTR_LEN(p->key) == Z_STRLEN_P(offset)) && - EXPECTED(memcmp(ZSTR_VAL(p->key), Z_STRVAL_P(offset), Z_STRLEN_P(offset)) == 0)))) { + EXPECTED(zend_string_equal_content(p->key, Z_STR_P(offset)))))) { ZVAL_COPY(EX_VAR(opline->result.var), &p->val); break; } @@ -50411,17 +50185,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CASE_SPEC_TMPVAR_CONST_HANDLER } } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) { if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) { - if (Z_STR_P(op1) == Z_STR_P(op2)) { - result = 1; - } else if (Z_STRVAL_P(op1)[0] > '9' || Z_STRVAL_P(op2)[0] > '9') { - if (Z_STRLEN_P(op1) != Z_STRLEN_P(op2)) { - result = 0; - } else { - result = (memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1)) == 0); - } - } else { - result = (zendi_smart_strcmp(Z_STR_P(op1), Z_STR_P(op2)) == 0); - } + result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2)); } else { break; @@ -52054,17 +51818,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_TMPVAR_CV_HANDLE } } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) { if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) { - if (Z_STR_P(op1) == Z_STR_P(op2)) { - result = 1; - } else if (Z_STRVAL_P(op1)[0] > '9' || Z_STRVAL_P(op2)[0] > '9') { - if (Z_STRLEN_P(op1) != Z_STRLEN_P(op2)) { - result = 0; - } else { - result = (memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1)) == 0); - } - } else { - result = (zendi_smart_strcmp(Z_STR_P(op1), Z_STR_P(op2)) == 0); - } + result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2)); zval_ptr_dtor_nogc(free_op1); } else { @@ -52122,17 +51876,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_CV_HA } } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) { if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) { - if (Z_STR_P(op1) == Z_STR_P(op2)) { - result = 0; - } else if (Z_STRVAL_P(op1)[0] > '9' || Z_STRVAL_P(op2)[0] > '9') { - if (Z_STRLEN_P(op1) != Z_STRLEN_P(op2)) { - result = 1; - } else { - result = (memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1)) != 0); - } - } else { - result = (zendi_smart_strcmp(Z_STR_P(op1), Z_STR_P(op2)) != 0); - } + result = !zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2)); zval_ptr_dtor_nogc(free_op1); } else { @@ -52481,8 +52225,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CV_HA (EXPECTED(p->key == Z_STR_P(offset)) || (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) && EXPECTED(p->key != NULL) && - EXPECTED(ZSTR_LEN(p->key) == Z_STRLEN_P(offset)) && - EXPECTED(memcmp(ZSTR_VAL(p->key), Z_STRVAL_P(offset), Z_STRLEN_P(offset)) == 0)))) { + EXPECTED(zend_string_equal_content(p->key, Z_STR_P(offset)))))) { ZVAL_COPY(EX_VAR(opline->result.var), &p->val); break; } @@ -52798,17 +52541,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CASE_SPEC_TMPVAR_CV_HANDLER(ZE } } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) { if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) { - if (Z_STR_P(op1) == Z_STR_P(op2)) { - result = 1; - } else if (Z_STRVAL_P(op1)[0] > '9' || Z_STRVAL_P(op2)[0] > '9') { - if (Z_STRLEN_P(op1) != Z_STRLEN_P(op2)) { - result = 0; - } else { - result = (memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1)) == 0); - } - } else { - result = (zendi_smart_strcmp(Z_STR_P(op1), Z_STR_P(op2)) == 0); - } + result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2)); } else { break; @@ -53409,17 +53142,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_EQUAL_SPEC_TMPVAR_TMPVAR_HA } } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) { if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) { - if (Z_STR_P(op1) == Z_STR_P(op2)) { - result = 1; - } else if (Z_STRVAL_P(op1)[0] > '9' || Z_STRVAL_P(op2)[0] > '9') { - if (Z_STRLEN_P(op1) != Z_STRLEN_P(op2)) { - result = 0; - } else { - result = (memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1)) == 0); - } - } else { - result = (zendi_smart_strcmp(Z_STR_P(op1), Z_STR_P(op2)) == 0); - } + result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2)); zval_ptr_dtor_nogc(free_op1); zval_ptr_dtor_nogc(free_op2); } else { @@ -53477,17 +53200,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_EQUAL_SPEC_TMPVAR_TMPVA } } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) { if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) { - if (Z_STR_P(op1) == Z_STR_P(op2)) { - result = 0; - } else if (Z_STRVAL_P(op1)[0] > '9' || Z_STRVAL_P(op2)[0] > '9') { - if (Z_STRLEN_P(op1) != Z_STRLEN_P(op2)) { - result = 1; - } else { - result = (memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1)) != 0); - } - } else { - result = (zendi_smart_strcmp(Z_STR_P(op1), Z_STR_P(op2)) != 0); - } + result = !zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2)); zval_ptr_dtor_nogc(free_op1); zval_ptr_dtor_nogc(free_op2); } else { @@ -53836,8 +53549,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_TMPVA (EXPECTED(p->key == Z_STR_P(offset)) || (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) && EXPECTED(p->key != NULL) && - EXPECTED(ZSTR_LEN(p->key) == Z_STRLEN_P(offset)) && - EXPECTED(memcmp(ZSTR_VAL(p->key), Z_STRVAL_P(offset), Z_STRLEN_P(offset)) == 0)))) { + EXPECTED(zend_string_equal_content(p->key, Z_STR_P(offset)))))) { ZVAL_COPY(EX_VAR(opline->result.var), &p->val); break; } @@ -54155,17 +53867,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CASE_SPEC_TMPVAR_TMPVAR_HANDLE } } else if (EXPECTED(Z_TYPE_P(op1) == IS_STRING)) { if (EXPECTED(Z_TYPE_P(op2) == IS_STRING)) { - if (Z_STR_P(op1) == Z_STR_P(op2)) { - result = 1; - } else if (Z_STRVAL_P(op1)[0] > '9' || Z_STRVAL_P(op2)[0] > '9') { - if (Z_STRLEN_P(op1) != Z_STRLEN_P(op2)) { - result = 0; - } else { - result = (memcmp(Z_STRVAL_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op1)) == 0); - } - } else { - result = (zendi_smart_strcmp(Z_STR_P(op1), Z_STR_P(op2)) == 0); - } + result = zend_fast_equal_strings(Z_STR_P(op1), Z_STR_P(op2)); zval_ptr_dtor_nogc(free_op2); } else { break; diff --git a/ext/opcache/ZendAccelerator.c b/ext/opcache/ZendAccelerator.c index 2a50b59eed..9094f1a5db 100644 --- a/ext/opcache/ZendAccelerator.c +++ b/ext/opcache/ZendAccelerator.c @@ -411,10 +411,8 @@ static zend_string *accel_find_interned_string(zend_string *str) arData = ZCSG(interned_strings).arData; while (idx != HT_INVALID_IDX) { p = HT_HASH_TO_BUCKET_EX(arData, idx); - if ((p->h == h) && (ZSTR_LEN(p->key) == ZSTR_LEN(str))) { - if (!memcmp(ZSTR_VAL(p->key), ZSTR_VAL(str), ZSTR_LEN(str))) { - return p->key; - } + if (p->h == h && zend_string_equal_content(p->key, str)) { + return p->key; } idx = Z_NEXT(p->val); } @@ -447,11 +445,9 @@ zend_string *accel_new_interned_string(zend_string *str) idx = HT_HASH(&ZCSG(interned_strings), nIndex); while (idx != HT_INVALID_IDX) { p = HT_HASH_TO_BUCKET(&ZCSG(interned_strings), idx); - if ((p->h == h) && (ZSTR_LEN(p->key) == ZSTR_LEN(str))) { - if (!memcmp(ZSTR_VAL(p->key), ZSTR_VAL(str), ZSTR_LEN(str))) { - zend_string_release(str); - return p->key; - } + if (p->h == h && zend_string_equal_content(p->key, str)) { + zend_string_release(str); + return p->key; } idx = Z_NEXT(p->val); } @@ -1033,16 +1029,14 @@ static inline int do_validate_timestamps(zend_persistent_script *persistent_scri */ if (file_handle->opened_path) { if (persistent_script->script.filename != file_handle->opened_path && - (ZSTR_LEN(persistent_script->script.filename) != ZSTR_LEN(file_handle->opened_path) || - memcmp(ZSTR_VAL(persistent_script->script.filename), ZSTR_VAL(file_handle->opened_path), ZSTR_LEN(file_handle->opened_path)) != 0)) { + !zend_string_equal_content(persistent_script->script.filename, file_handle->opened_path)) { return FAILURE; } } else { full_path_ptr = accelerator_orig_zend_resolve_path(file_handle->filename, strlen(file_handle->filename)); if (full_path_ptr && persistent_script->script.filename != full_path_ptr && - (ZSTR_LEN(persistent_script->script.filename) != ZSTR_LEN(full_path_ptr) || - memcmp(ZSTR_VAL(persistent_script->script.filename), ZSTR_VAL(full_path_ptr), ZSTR_LEN(full_path_ptr)) != 0)) { + !zend_string_equal_content(persistent_script->script.filename, full_path_ptr)) { zend_string_release(full_path_ptr); return FAILURE; } -- 2.40.0