]> granicus.if.org Git - php/commitdiff
Use zend_string_equal*() API for zend_string equality check instead of direct memcmp...
authorDmitry Stogov <dmitry@zend.com>
Mon, 4 Dec 2017 14:17:02 +0000 (17:17 +0300)
committerDmitry Stogov <dmitry@zend.com>
Mon, 4 Dec 2017 14:17:02 +0000 (17:17 +0300)
12 files changed:
Zend/zend_compile.c
Zend/zend_constants.c
Zend/zend_execute_API.c
Zend/zend_hash.c
Zend/zend_object_handlers.c
Zend/zend_operators.c
Zend/zend_operators.h
Zend/zend_string.c
Zend/zend_string.h
Zend/zend_vm_def.h
Zend/zend_vm_execute.h
ext/opcache/ZendAccelerator.c

index e625fcfe42ef8454b340bc1193d5438bf750c407..0287b7a01ade44ba21bb2cfaeb9caaa564e73d47 100644 (file)
@@ -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++;
index 639c15807d960d492ff8949d43d6961693549adf..6e96ce7fc97b78b0d7023399fb78560e5771555d 100644 (file)
@@ -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 */
index c8d1e493767b34997787c648b499a74798d6e6aa..8e366ca75c7dd2645a95af2966d4ba7cad6467c4 100644 (file)
@@ -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;
index 08dd56ff274bccfe5cabdf9e10284c7dfc503c70..ec2141eec4a5acd194f437ce1b163298d9691231 100644 (file)
@@ -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);
 
index 4a78d796fe816aefc4d15befe8f255b1010839fe..d99fb7338f5facd81279e406516ad380cd650782 100644 (file)
@@ -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;
                                        }
index d3f7729fed19f44d7f2f1e060603713dc4572efd..7217108338b8542949936249c90992a72a3beddc 100644 (file)
@@ -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);
index 50e1e2dd587dff58cca37099187e4faad80725f5..a21727f7ab02e6e6f3a4c580df7f47d13436ab4d 100644 (file)
@@ -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;
index ad51148d4a824d96df6c50fb4efcc6014611bb02..bceb328f7f1206e85da306d56418001e498885ae 100644 (file)
@@ -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
index eb981df82290ef5c2d9e6cfc6488c69144696ff4..686895d81781a10ad7475b75ed0b8fffad6f038f 100644 (file)
@@ -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) \
index 0513034107b2dfedfbf7424617bde62b80867acc..e9b79c3885613e243c067f5217af3fc18d31392d 100644 (file)
@@ -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);
index 185a89a496106061da9a87afc447fa2c784767f8..20778c048740c2e02917d5dba2753b5a68f7ee2f 100644 (file)
@@ -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;
index 2a50b59eed0dc131a9c3ffc6bb9be588fc7bf9b1..9094f1a5dbdfe5cb463fbf66270426bd8993be1e 100644 (file)
@@ -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;
                }