]> granicus.if.org Git - php/commitdiff
Expand SEPARATE_STRING()
authorDmitry Stogov <dmitry@zend.com>
Wed, 17 Jan 2018 23:30:07 +0000 (02:30 +0300)
committerDmitry Stogov <dmitry@zend.com>
Wed, 17 Jan 2018 23:30:07 +0000 (02:30 +0300)
Zend/zend_execute.c

index 359669c4b77e14066980cec41cb0598601c00d06..c660988f9cad56e8472734fe4cb3c0104b2f202b 100644 (file)
@@ -1292,7 +1292,6 @@ static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_wrong_property_check(
 
 static zend_never_inline void zend_assign_to_string_offset(zval *str, zval *dim, zval *value, zval *result EXECUTE_DATA_DC)
 {
-       zend_string *old_str;
        zend_uchar c;
        size_t string_len;
        zend_long offset;
@@ -1335,17 +1334,15 @@ static zend_never_inline void zend_assign_to_string_offset(zval *str, zval *dim,
        if ((size_t)offset >= Z_STRLEN_P(str)) {
                /* Extend string if needed */
                zend_long old_len = Z_STRLEN_P(str);
-               Z_STR_P(str) = zend_string_extend(Z_STR_P(str), offset + 1, 0);
-               Z_TYPE_INFO_P(str) = IS_STRING_EX;
+               ZVAL_NEW_STR(str, zend_string_extend(Z_STR_P(str), offset + 1, 0));
                memset(Z_STRVAL_P(str) + old_len, ' ', offset - old_len);
                Z_STRVAL_P(str)[offset+1] = 0;
        } else if (!Z_REFCOUNTED_P(str)) {
-               old_str = Z_STR_P(str);
-               Z_STR_P(str) = zend_string_init(Z_STRVAL_P(str), Z_STRLEN_P(str), 0);
-               Z_TYPE_INFO_P(str) = IS_STRING_EX;
-               zend_string_release(old_str);
+               ZVAL_NEW_STR(str, zend_string_init(Z_STRVAL_P(str), Z_STRLEN_P(str), 0));
+       } else if (Z_REFCOUNT_P(str) > 1) {
+               Z_DELREF_P(str);
+               ZVAL_NEW_STR(str, zend_string_init(Z_STRVAL_P(str), Z_STRLEN_P(str), 0));
        } else {
-               SEPARATE_STRING(str);
                zend_string_forget_hash_val(Z_STR_P(str));
        }