]> granicus.if.org Git - php/commitdiff
Avoid unnecessary reference-counting on strings.
authorDmitry Stogov <dmitry@zend.com>
Thu, 16 Nov 2017 14:09:32 +0000 (17:09 +0300)
committerDmitry Stogov <dmitry@zend.com>
Thu, 16 Nov 2017 14:09:32 +0000 (17:09 +0300)
29 files changed:
Zend/zend.c
Zend/zend_closures.c
Zend/zend_execute.c
Zend/zend_inheritance.c
Zend/zend_ini_parser.y
Zend/zend_object_handlers.c
Zend/zend_operators.c
Zend/zend_operators.h
Zend/zend_vm_def.h
Zend/zend_vm_execute.h
ext/curl/interface.c
ext/date/php_date.c
ext/pcre/php_pcre.c
ext/reflection/php_reflection.c
ext/session/session.c
ext/simplexml/simplexml.c
ext/soap/php_encoding.c
ext/sockets/conversions.c
ext/sockets/multicast.c
ext/standard/array.c
ext/standard/basic_functions.c
ext/standard/file.c
ext/standard/filters.c
ext/standard/formatted_print.c
ext/standard/http.c
ext/standard/pack.c
ext/standard/string.c
ext/standard/var.c
ext/wddx/wddx.c

index 290807e67aec869728f376a21a0cc31abf630517..70def493cdb0023929ae64fea2ee82e6f135d208 100644 (file)
@@ -322,14 +322,15 @@ ZEND_API int zend_make_printable_zval(zval *expr, zval *expr_copy) /* {{{ */
 
 ZEND_API size_t zend_print_zval(zval *expr, int indent) /* {{{ */
 {
-       zend_string *str = zval_get_string(expr);
+       zend_string *tmp_str;
+       zend_string *str = zval_get_tmp_string(expr, &tmp_str);
        size_t len = ZSTR_LEN(str);
 
        if (len != 0) {
                zend_write(ZSTR_VAL(str), len);
        }
 
-       zend_string_release(str);
+       zend_tmp_string_release(tmp_str);
        return len;
 }
 /* }}} */
@@ -436,9 +437,12 @@ static void zend_print_zval_r_to_buf(smart_str *buf, zval *expr, int indent) /*
                case IS_REFERENCE:
                        zend_print_zval_r_to_buf(buf, Z_REFVAL_P(expr), indent);
                        break;
+               case IS_STRING:
+                       smart_str_append(buf, Z_STR_P(expr));
+                       break;
                default:
                        {
-                               zend_string *str = zval_get_string(expr);
+                               zend_string *str = zval_get_string_func(expr);
                                smart_str_append(buf, str);
                                zend_string_release(str);
                        }
index ee7b38224ec67046e4340da157f63e3b8ccd9b36..5aee27b02f7c92f36af4f7a2693352236fba7f2d 100644 (file)
@@ -198,7 +198,8 @@ ZEND_METHOD(Closure, bind)
                } else if (Z_TYPE_P(scope_arg) == IS_NULL) {
                        ce = NULL;
                } else {
-                       zend_string *class_name = zval_get_string(scope_arg);
+                       zend_string *tmp_class_name;
+                       zend_string *class_name = zval_get_tmp_string(scope_arg, &tmp_class_name);
                        if (zend_string_equals_literal(class_name, "static")) {
                                ce = closure->func.common.scope;
                        } else if ((ce = zend_lookup_class_ex(class_name, NULL, 1)) == NULL) {
@@ -206,7 +207,7 @@ ZEND_METHOD(Closure, bind)
                                zend_string_release(class_name);
                                RETURN_NULL();
                        }
-                       zend_string_release(class_name);
+                       zend_tmp_string_release(tmp_class_name);
                }
        } else { /* scope argument not given; do not change the scope by default */
                ce = closure->func.common.scope;
index f44537b81871ea1d49e36f63af2f605a4cb46045..959c36a5b3521c72ba5d2df5f970b9547e7295ef 100644 (file)
@@ -1242,7 +1242,7 @@ static zend_never_inline void zend_assign_to_string_offset(zval *str, zval *dim,
 
        if (Z_TYPE_P(value) != IS_STRING) {
                /* Convert to string, just the time to pick the 1st byte */
-               zend_string *tmp = zval_get_string(value);
+               zend_string *tmp = zval_get_string_func(value);
 
                string_len = ZSTR_LEN(tmp);
                c = (zend_uchar)ZSTR_VAL(tmp)[0];
@@ -1934,19 +1934,19 @@ use_read_property:
 static zend_always_inline zval* zend_fetch_static_property_address(zval *varname, zend_uchar varname_type, znode_op op2, zend_uchar op2_type, int type EXECUTE_DATA_DC OPLINE_DC)
 {
        zval *retval;
-       zend_string *name;
+       zend_string *name, *tmp_name;
        zend_class_entry *ce;
 
        if (varname_type == IS_CONST) {
                name = Z_STR_P(varname);
        } else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) {
                name = Z_STR_P(varname);
-               zend_string_addref(name);
+               tmp_name = NULL;
        } else {
                if (varname_type == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
                        zval_undefined_cv(EX(opline)->op1.var EXECUTE_DATA_CC);
                }
-               name = zval_get_string(varname);
+               name = zval_get_tmp_string(varname, &tmp_name);
        }
 
        if (op2_type == IS_CONST) {
@@ -1969,7 +1969,7 @@ static zend_always_inline zval* zend_fetch_static_property_address(zval *varname
                                ce = zend_fetch_class_by_name(Z_STR_P(class_name), class_name + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
                                if (UNEXPECTED(ce == NULL)) {
                                        if (varname_type != IS_CONST) {
-                                               zend_string_release(name);
+                                               zend_tmp_string_release(tmp_name);
                                        }
                                        return NULL;
                                }
@@ -1981,7 +1981,7 @@ static zend_always_inline zval* zend_fetch_static_property_address(zval *varname
                        ce = zend_fetch_class(NULL, op2.num);
                        if (UNEXPECTED(ce == NULL)) {
                                if (varname_type != IS_CONST) {
-                                       zend_string_release(name);
+                                       zend_tmp_string_release(tmp_name);
                                }
                                return NULL;
                        }
@@ -2007,7 +2007,7 @@ static zend_always_inline zval* zend_fetch_static_property_address(zval *varname
        retval = zend_std_get_static_property(ce, name, type == BP_VAR_IS);
 
        if (varname_type != IS_CONST) {
-               zend_string_release(name);
+               zend_tmp_string_release(tmp_name);
        }
 
        if (UNEXPECTED(retval == NULL)) {
index b9794b0d62c9a53e3375d4b48f81c09acf736046..288f9d1670f7eb04c2b640c3de76d5273ce432fc 100644 (file)
@@ -520,9 +520,10 @@ static ZEND_COLD zend_string *zend_get_function_declaration(const zend_function
                                                                smart_str_appends(&str, "<expression>");
                                                        }
                                                } else {
-                                                       zend_string *zv_str = zval_get_string(zv);
+                                                       zend_string *tmp_zv_str;
+                                                       zend_string *zv_str = zval_get_tmp_string(zv, &tmp_zv_str);
                                                        smart_str_append(&str, zv_str);
-                                                       zend_string_release(zv_str);
+                                                       zend_tmp_string_release(tmp_zv_str);
                                                }
                                        }
                                } else {
index 82997e7f02fdc59466a2de4aca76efbb2cec7aee..afca5538de067623300ec37b53f283aa5a489ca2 100644 (file)
@@ -111,13 +111,14 @@ static void zend_ini_add_string(zval *result, zval *op1, zval *op2)
        int length, op1_len;
 
        if (Z_TYPE_P(op1) != IS_STRING) {
-               zend_string *str = zval_get_string(op1);
                /* ZEND_ASSERT(!Z_REFCOUNTED_P(op1)); */
                if (ZEND_SYSTEM_INI) {
+                       zend_string *tmp_str;
+                       zend_string *str = zval_get_tmp_string(op1, &tmp_str);
                        ZVAL_PSTRINGL(op1, ZSTR_VAL(str), ZSTR_LEN(str));
-                       zend_string_release(str);
+                       zend_tmp_string_release(tmp_str);
                } else {
-                       ZVAL_STR(op1, str);
+                       ZVAL_STR(op1, zval_get_string_func(op1));
                }
        }
        op1_len = (int)Z_STRLEN_P(op1);
index 37336cd2144c6882723e6f3bce0c578e6136b4d6..6764e1f3e3221529b4af59a0f4f956bfb352d931 100644 (file)
@@ -886,16 +886,12 @@ static int zend_std_has_dimension(zval *object, zval *offset, int check_empty) /
 static zval *zend_std_get_property_ptr_ptr(zval *object, zval *member, int type, void **cache_slot) /* {{{ */
 {
        zend_object *zobj;
-       zend_string *name;
+       zend_string *name, *tmp_name;
        zval *retval = NULL;
        uintptr_t property_offset;
 
        zobj = Z_OBJ_P(object);
-       if (EXPECTED(Z_TYPE_P(member) == IS_STRING)) {
-               name = Z_STR_P(member);
-       } else {
-               name = zval_get_string(member);
-       }
+       name = zval_get_tmp_string(member, &tmp_name);
 
 #if DEBUG_OBJECT_HANDLERS
        fprintf(stderr, "Ptr object #%d property: %s\n", Z_OBJ_HANDLE_P(object), ZSTR_VAL(name));
@@ -928,9 +924,7 @@ static zval *zend_std_get_property_ptr_ptr(zval *object, zval *member, int type,
                                zobj->properties = zend_array_dup(zobj->properties);
                        }
                    if (EXPECTED((retval = zend_hash_find(zobj->properties, name)) != NULL)) {
-                               if (UNEXPECTED(Z_TYPE_P(member) != IS_STRING)) {
-                                       zend_string_release(name);
-                               }
+                               zend_tmp_string_release(tmp_name);
                                return retval;
                    }
                }
@@ -948,9 +942,7 @@ static zval *zend_std_get_property_ptr_ptr(zval *object, zval *member, int type,
                }
        }
 
-       if (UNEXPECTED(Z_TYPE_P(member) != IS_STRING)) {
-               zend_string_release(name);
-       }
+       zend_tmp_string_release(tmp_name);
        return retval;
 }
 /* }}} */
index dcbe40f92cd476fa5dae6cb5eb26d67ca0314505..f3d78c19bc312b2f7290a60aa739f5748fb10a26 100644 (file)
@@ -1809,8 +1809,9 @@ ZEND_API int ZEND_FASTCALL concat_function(zval *result, zval *op1, zval *op2) /
 
 ZEND_API int ZEND_FASTCALL string_compare_function_ex(zval *op1, zval *op2, zend_bool case_insensitive) /* {{{ */
 {
-       zend_string *str1 = zval_get_string(op1);
-       zend_string *str2 = zval_get_string(op2);
+       zend_string *tmp_str1, *tmp_str2;
+       zend_string *str1 = zval_get_tmp_string(op1, &tmp_str1);
+       zend_string *str2 = zval_get_tmp_string(op2, &tmp_str2);
        int ret;
 
        if (case_insensitive) {
@@ -1819,8 +1820,8 @@ ZEND_API int ZEND_FASTCALL string_compare_function_ex(zval *op1, zval *op2, zend
                ret = zend_binary_strcmp(ZSTR_VAL(str1), ZSTR_LEN(str1), ZSTR_VAL(str2), ZSTR_LEN(str2));
        }
 
-       zend_string_release(str1);
-       zend_string_release(str2);
+       zend_tmp_string_release(tmp_str1);
+       zend_tmp_string_release(tmp_str2);
        return ret;
 }
 /* }}} */
@@ -1835,12 +1836,13 @@ ZEND_API int ZEND_FASTCALL string_compare_function(zval *op1, zval *op2) /* {{{
                        return zend_binary_strcmp(Z_STRVAL_P(op1), Z_STRLEN_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op2));
                }
        } else {
-               zend_string *str1 = zval_get_string(op1);
-               zend_string *str2 = zval_get_string(op2);
+               zend_string *tmp_str1, *tmp_str2;
+               zend_string *str1 = zval_get_tmp_string(op1, &tmp_str1);
+               zend_string *str2 = zval_get_tmp_string(op2, &tmp_str2);
                int ret = zend_binary_strcmp(ZSTR_VAL(str1), ZSTR_LEN(str1), ZSTR_VAL(str2), ZSTR_LEN(str2));
 
-               zend_string_release(str1);
-               zend_string_release(str2);
+               zend_tmp_string_release(tmp_str1);
+               zend_tmp_string_release(tmp_str2);
                return ret;
        }
 }
@@ -1856,12 +1858,13 @@ ZEND_API int ZEND_FASTCALL string_case_compare_function(zval *op1, zval *op2) /*
                        return zend_binary_strcasecmp_l(Z_STRVAL_P(op1), Z_STRLEN_P(op1), Z_STRVAL_P(op2), Z_STRLEN_P(op2));
                }
        } else {
-               zend_string *str1 = zval_get_string(op1);
-               zend_string *str2 = zval_get_string(op2);
+               zend_string *tmp_str1, *tmp_str2;
+               zend_string *str1 = zval_get_tmp_string(op1, &tmp_str1);
+               zend_string *str2 = zval_get_tmp_string(op2, &tmp_str2);
                int ret = zend_binary_strcasecmp_l(ZSTR_VAL(str1), ZSTR_LEN(str1), ZSTR_VAL(str2), ZSTR_LEN(str1));
 
-               zend_string_release(str1);
-               zend_string_release(str2);
+               zend_tmp_string_release(tmp_str1);
+               zend_tmp_string_release(tmp_str2);
                return ret;
        }
 }
@@ -1870,12 +1873,13 @@ ZEND_API int ZEND_FASTCALL string_case_compare_function(zval *op1, zval *op2) /*
 #if HAVE_STRCOLL
 ZEND_API int ZEND_FASTCALL string_locale_compare_function(zval *op1, zval *op2) /* {{{ */
 {
-       zend_string *str1 = zval_get_string(op1);
-       zend_string *str2 = zval_get_string(op2);
+       zend_string *tmp_str1, *tmp_str2;
+       zend_string *str1 = zval_get_tmp_string(op1, &tmp_str1);
+       zend_string *str2 = zval_get_tmp_string(op2, &tmp_str2);
        int ret = strcoll(ZSTR_VAL(str1), ZSTR_VAL(str2));
 
-       zend_string_release(str1);
-       zend_string_release(str2);
+       zend_tmp_string_release(tmp_str1);
+       zend_tmp_string_release(tmp_str2);
        return ret;
 }
 /* }}} */
index 9ded26db9bdab1239859c1fdd96aed553ffea63e..9d9e2055a54ab00373d5f286b145dfa4af1ab1d8 100644 (file)
@@ -273,6 +273,20 @@ static zend_always_inline zend_string *zval_get_string(zval *op) {
        return EXPECTED(Z_TYPE_P(op) == IS_STRING) ? zend_string_copy(Z_STR_P(op)) : zval_get_string_func(op);
 }
 
+static zend_always_inline zend_string *zval_get_tmp_string(zval *op, zend_string **tmp) {
+       if (EXPECTED(Z_TYPE_P(op) == IS_STRING)) {
+               *tmp = NULL;
+               return Z_STR_P(op);
+       } else {
+               return *tmp = zval_get_string_func(op);
+       }
+}
+static zend_always_inline void zend_tmp_string_release(zend_string *tmp) {
+       if (UNEXPECTED(tmp)) {
+               zend_string_release(tmp);
+       }
+}
+
 /* Compatibility macros for 7.2 and below */
 #define _zval_get_long(op) zval_get_long(op)
 #define _zval_get_double(op) zval_get_double(op)
index 3277a79617ac5038ab5f7cfa26b30e25d709eccd..7e557e4c9e7190bef3b974420e1076f402f6aa47 100644 (file)
@@ -1379,7 +1379,7 @@ ZEND_VM_HELPER(zend_fetch_var_address_helper, CONST|TMPVAR|CV, UNUSED, int type)
        zend_free_op free_op1;
        zval *varname;
        zval *retval;
-       zend_string *name;
+       zend_string *name, *tmp_name;
        HashTable *target_symbol_table;
 
        SAVE_OPLINE();
@@ -1389,12 +1389,12 @@ ZEND_VM_HELPER(zend_fetch_var_address_helper, CONST|TMPVAR|CV, UNUSED, int type)
                name = Z_STR_P(varname);
        } else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) {
                name = Z_STR_P(varname);
-               zend_string_addref(name);
+               tmp_name = NULL;
        } else {
                if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
                        GET_OP1_UNDEF_CV(varname, BP_VAR_R);
                }
-               name = zval_get_string(varname);
+               name = zval_get_tmp_string(varname, &tmp_name);
        }
 
        target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK EXECUTE_DATA_CC);
@@ -1435,7 +1435,7 @@ ZEND_VM_C_LABEL(fetch_this):
                                EMPTY_SWITCH_DEFAULT_CASE()
                        }
                        if (OP1_TYPE != IS_CONST) {
-                               zend_string_release(name);
+                               zend_tmp_string_release(tmp_name);
                        }
                        ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
                }
@@ -1487,7 +1487,7 @@ ZEND_VM_C_LABEL(fetch_this):
        }
 
        if (OP1_TYPE != IS_CONST) {
-               zend_string_release(name);
+               zend_tmp_string_release(tmp_name);
        }
 
        ZEND_ASSERT(retval != NULL);
@@ -5418,7 +5418,8 @@ ZEND_VM_HANDLER(196, ZEND_UNSET_CV, CV, UNUSED)
 ZEND_VM_HANDLER(74, ZEND_UNSET_VAR, CONST|TMPVAR|CV, UNUSED, VAR_FETCH)
 {
        USE_OPLINE
-       zval tmp, *varname;
+       zval *varname;
+       zend_string *name, *tmp_name;
        HashTable *target_symbol_table;
        zend_free_op free_op1;
 
@@ -5426,20 +5427,23 @@ ZEND_VM_HANDLER(74, ZEND_UNSET_VAR, CONST|TMPVAR|CV, UNUSED, VAR_FETCH)
 
        varname = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
 
-       ZVAL_UNDEF(&tmp);
-       if (OP1_TYPE != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
+       if (OP1_TYPE == IS_CONST) {
+               name = Z_STR_P(varname);
+       } else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) {
+               name = Z_STR_P(varname);
+               tmp_name = NULL;
+       } else {
                if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
                        varname = GET_OP1_UNDEF_CV(varname, BP_VAR_R);
                }
-               ZVAL_STR(&tmp, zval_get_string(varname));
-               varname = &tmp;
+               name = zval_get_tmp_string(varname, &tmp_name);
        }
 
        target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK EXECUTE_DATA_CC);
-       zend_hash_del_ind(target_symbol_table, Z_STR_P(varname));
+       zend_hash_del_ind(target_symbol_table, name);
 
-       if (OP1_TYPE != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
-               zend_string_release(Z_STR(tmp));
+       if (OP1_TYPE != IS_CONST) {
+               zend_tmp_string_release(tmp_name);
        }
        FREE_OP1();
        ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -5448,7 +5452,8 @@ ZEND_VM_HANDLER(74, ZEND_UNSET_VAR, CONST|TMPVAR|CV, UNUSED, VAR_FETCH)
 ZEND_VM_HANDLER(179, ZEND_UNSET_STATIC_PROP, CONST|TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR)
 {
        USE_OPLINE
-       zval tmp, *varname;
+       zval *varname;
+       zend_string *name, *tmp_name;
        zend_class_entry *ce;
        zend_free_op free_op1;
 
@@ -5456,13 +5461,16 @@ ZEND_VM_HANDLER(179, ZEND_UNSET_STATIC_PROP, CONST|TMPVAR|CV, UNUSED|CLASS_FETCH
 
        varname = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R);
 
-       ZVAL_UNDEF(&tmp);
-       if (OP1_TYPE != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
+       if (OP1_TYPE == IS_CONST) {
+               name = Z_STR_P(varname);
+       } else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) {
+               name = Z_STR_P(varname);
+               tmp_name = NULL;
+       } else {
                if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
                        varname = GET_OP1_UNDEF_CV(varname, BP_VAR_R);
                }
-               ZVAL_STR(&tmp, zval_get_string(varname));
-               varname = &tmp;
+               name = zval_get_tmp_string(varname, &tmp_name);
        }
 
        if (OP2_TYPE == IS_CONST) {
@@ -5471,8 +5479,8 @@ ZEND_VM_HANDLER(179, ZEND_UNSET_STATIC_PROP, CONST|TMPVAR|CV, UNUSED|CLASS_FETCH
                        ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), RT_CONSTANT(opline, opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
                        if (UNEXPECTED(ce == NULL)) {
                                ZEND_ASSERT(EG(exception));
-                               if (OP1_TYPE != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
-                                       zend_string_release(Z_STR(tmp));
+                               if (OP1_TYPE != IS_CONST) {
+                                       zend_tmp_string_release(tmp_name);
                                }
                                FREE_OP1();
                                HANDLE_EXCEPTION();
@@ -5483,8 +5491,8 @@ ZEND_VM_HANDLER(179, ZEND_UNSET_STATIC_PROP, CONST|TMPVAR|CV, UNUSED|CLASS_FETCH
                ce = zend_fetch_class(NULL, opline->op2.num);
                if (UNEXPECTED(ce == NULL)) {
                        ZEND_ASSERT(EG(exception));
-                       if (OP1_TYPE != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
-                               zend_string_release(Z_STR(tmp));
+                       if (OP1_TYPE != IS_CONST) {
+                               zend_tmp_string_release(tmp_name);
                        }
                        FREE_OP1();
                        HANDLE_EXCEPTION();
@@ -5492,10 +5500,10 @@ ZEND_VM_HANDLER(179, ZEND_UNSET_STATIC_PROP, CONST|TMPVAR|CV, UNUSED|CLASS_FETCH
        } else {
                ce = Z_CE_P(EX_VAR(opline->op2.var));
        }
-       zend_std_unset_static_property(ce, Z_STR_P(varname));
+       zend_std_unset_static_property(ce, name);
 
-       if (OP1_TYPE != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
-               zend_string_release(Z_STR(tmp));
+       if (OP1_TYPE != IS_CONST) {
+               zend_tmp_string_release(tmp_name);
        }
        FREE_OP1();
        ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -6234,22 +6242,23 @@ ZEND_VM_HANDLER(114, ZEND_ISSET_ISEMPTY_VAR, CONST|TMPVAR|CV, UNUSED, VAR_FETCH|
        zval *value;
        int result;
        zend_free_op free_op1;
-       zval tmp, *varname;
+       zval *varname;
+       zend_string *name, *tmp_name;
        HashTable *target_symbol_table;
 
        SAVE_OPLINE();
        varname = GET_OP1_ZVAL_PTR(BP_VAR_IS);
-       ZVAL_UNDEF(&tmp);
-       if (OP1_TYPE != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
-               ZVAL_STR(&tmp, zval_get_string(varname));
-               varname = &tmp;
+       if (OP1_TYPE == IS_CONST) {
+               name = Z_STR_P(varname);
+       } else {
+               name = zval_get_tmp_string(varname, &tmp_name);
        }
 
        target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK EXECUTE_DATA_CC);
-       value = zend_hash_find_ind(target_symbol_table, Z_STR_P(varname));
+       value = zend_hash_find_ind(target_symbol_table, name);
 
-       if (OP1_TYPE != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
-               zend_string_release(Z_STR(tmp));
+       if (OP1_TYPE != IS_CONST) {
+               zend_tmp_string_release(tmp_name);
        }
        FREE_OP1();
 
@@ -6271,15 +6280,16 @@ ZEND_VM_HANDLER(180, ZEND_ISSET_ISEMPTY_STATIC_PROP, CONST|TMPVAR|CV, UNUSED|CLA
        zval *value;
        int result;
        zend_free_op free_op1;
-       zval tmp, *varname;
+       zval *varname;
+       zend_string *name, *tmp_name;
        zend_class_entry *ce;
 
        SAVE_OPLINE();
        varname = GET_OP1_ZVAL_PTR(BP_VAR_IS);
-       ZVAL_UNDEF(&tmp);
-       if (OP1_TYPE != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
-               ZVAL_STR(&tmp, zval_get_string(varname));
-               varname = &tmp;
+       if (OP1_TYPE == IS_CONST) {
+               name = Z_STR_P(varname);
+       } else {
+               name = zval_get_tmp_string(varname, &tmp_name);
        }
 
        if (OP2_TYPE == IS_CONST) {
@@ -6306,8 +6316,8 @@ ZEND_VM_HANDLER(180, ZEND_ISSET_ISEMPTY_STATIC_PROP, CONST|TMPVAR|CV, UNUSED|CLA
                        ce = zend_fetch_class(NULL, opline->op2.num);
                        if (UNEXPECTED(ce == NULL)) {
                                ZEND_ASSERT(EG(exception));
-                               if (OP1_TYPE != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
-                                       zend_string_release(Z_STR(tmp));
+                               if (OP1_TYPE != IS_CONST) {
+                                       zend_tmp_string_release(tmp_name);
                                }
                                FREE_OP1();
                                ZVAL_UNDEF(EX_VAR(opline->result.var));
@@ -6330,14 +6340,14 @@ ZEND_VM_HANDLER(180, ZEND_ISSET_ISEMPTY_STATIC_PROP, CONST|TMPVAR|CV, UNUSED|CLA
                }
        }
 
-       value = zend_std_get_static_property(ce, Z_STR_P(varname), 1);
+       value = zend_std_get_static_property(ce, name, 1);
 
        if (OP1_TYPE == IS_CONST && value) {
                CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(RT_CONSTANT(opline, opline->op1)), ce, value);
        }               
 
-       if (OP1_TYPE != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
-               zend_string_release(Z_STR(tmp));
+       if (OP1_TYPE != IS_CONST) {
+               zend_tmp_string_release(tmp_name);
        }
        FREE_OP1();
 
index 460c21466d5c6f95f1c621a4d70a27e0544cfb36..9cf533c81499133c798e585a6d3e14ee084facfc 100644 (file)
@@ -5940,7 +5940,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_CONST_CONST_HA
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
-       zval tmp, *varname;
+       zval *varname;
+       zend_string *name, *tmp_name;
        zend_class_entry *ce;
 
 
@@ -5948,13 +5949,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_CONST_C
 
        varname = RT_CONSTANT(opline, opline->op1);
 
-       ZVAL_UNDEF(&tmp);
-       if (IS_CONST != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
+       if (IS_CONST == IS_CONST) {
+               name = Z_STR_P(varname);
+       } else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) {
+               name = Z_STR_P(varname);
+               tmp_name = NULL;
+       } else {
                if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
                        varname = GET_OP1_UNDEF_CV(varname, BP_VAR_R);
                }
-               ZVAL_STR(&tmp, zval_get_string(varname));
-               varname = &tmp;
+               name = zval_get_tmp_string(varname, &tmp_name);
        }
 
        if (IS_CONST == IS_CONST) {
@@ -5963,8 +5967,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_CONST_C
                        ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), RT_CONSTANT(opline, opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
                        if (UNEXPECTED(ce == NULL)) {
                                ZEND_ASSERT(EG(exception));
-                               if (IS_CONST != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
-                                       zend_string_release(Z_STR(tmp));
+                               if (IS_CONST != IS_CONST) {
+                                       zend_tmp_string_release(tmp_name);
                                }
 
                                HANDLE_EXCEPTION();
@@ -5975,8 +5979,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_CONST_C
                ce = zend_fetch_class(NULL, opline->op2.num);
                if (UNEXPECTED(ce == NULL)) {
                        ZEND_ASSERT(EG(exception));
-                       if (IS_CONST != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
-                               zend_string_release(Z_STR(tmp));
+                       if (IS_CONST != IS_CONST) {
+                               zend_tmp_string_release(tmp_name);
                        }
 
                        HANDLE_EXCEPTION();
@@ -5984,10 +5988,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_CONST_C
        } else {
                ce = Z_CE_P(EX_VAR(opline->op2.var));
        }
-       zend_std_unset_static_property(ce, Z_STR_P(varname));
+       zend_std_unset_static_property(ce, name);
 
-       if (IS_CONST != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
-               zend_string_release(Z_STR(tmp));
+       if (IS_CONST != IS_CONST) {
+               zend_tmp_string_release(tmp_name);
        }
 
        ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -5999,15 +6003,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
        zval *value;
        int result;
 
-       zval tmp, *varname;
+       zval *varname;
+       zend_string *name, *tmp_name;
        zend_class_entry *ce;
 
        SAVE_OPLINE();
        varname = RT_CONSTANT(opline, opline->op1);
-       ZVAL_UNDEF(&tmp);
-       if (IS_CONST != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
-               ZVAL_STR(&tmp, zval_get_string(varname));
-               varname = &tmp;
+       if (IS_CONST == IS_CONST) {
+               name = Z_STR_P(varname);
+       } else {
+               name = zval_get_tmp_string(varname, &tmp_name);
        }
 
        if (IS_CONST == IS_CONST) {
@@ -6034,8 +6039,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
                        ce = zend_fetch_class(NULL, opline->op2.num);
                        if (UNEXPECTED(ce == NULL)) {
                                ZEND_ASSERT(EG(exception));
-                               if (IS_CONST != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
-                                       zend_string_release(Z_STR(tmp));
+                               if (IS_CONST != IS_CONST) {
+                                       zend_tmp_string_release(tmp_name);
                                }
 
                                ZVAL_UNDEF(EX_VAR(opline->result.var));
@@ -6058,14 +6063,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
                }
        }
 
-       value = zend_std_get_static_property(ce, Z_STR_P(varname), 1);
+       value = zend_std_get_static_property(ce, name, 1);
 
        if (IS_CONST == IS_CONST && value) {
                CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(RT_CONSTANT(opline, opline->op1)), ce, value);
        }
 
-       if (IS_CONST != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
-               zend_string_release(Z_STR(tmp));
+       if (IS_CONST != IS_CONST) {
+               zend_tmp_string_release(tmp_name);
        }
 
 is_static_prop_return:
@@ -6851,7 +6856,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_IS_SPEC_CONS
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
-       zval tmp, *varname;
+       zval *varname;
+       zend_string *name, *tmp_name;
        zend_class_entry *ce;
 
 
@@ -6859,13 +6865,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_CONST_V
 
        varname = RT_CONSTANT(opline, opline->op1);
 
-       ZVAL_UNDEF(&tmp);
-       if (IS_CONST != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
+       if (IS_CONST == IS_CONST) {
+               name = Z_STR_P(varname);
+       } else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) {
+               name = Z_STR_P(varname);
+               tmp_name = NULL;
+       } else {
                if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
                        varname = GET_OP1_UNDEF_CV(varname, BP_VAR_R);
                }
-               ZVAL_STR(&tmp, zval_get_string(varname));
-               varname = &tmp;
+               name = zval_get_tmp_string(varname, &tmp_name);
        }
 
        if (IS_VAR == IS_CONST) {
@@ -6874,8 +6883,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_CONST_V
                        ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), RT_CONSTANT(opline, opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
                        if (UNEXPECTED(ce == NULL)) {
                                ZEND_ASSERT(EG(exception));
-                               if (IS_CONST != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
-                                       zend_string_release(Z_STR(tmp));
+                               if (IS_CONST != IS_CONST) {
+                                       zend_tmp_string_release(tmp_name);
                                }
 
                                HANDLE_EXCEPTION();
@@ -6886,8 +6895,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_CONST_V
                ce = zend_fetch_class(NULL, opline->op2.num);
                if (UNEXPECTED(ce == NULL)) {
                        ZEND_ASSERT(EG(exception));
-                       if (IS_CONST != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
-                               zend_string_release(Z_STR(tmp));
+                       if (IS_CONST != IS_CONST) {
+                               zend_tmp_string_release(tmp_name);
                        }
 
                        HANDLE_EXCEPTION();
@@ -6895,10 +6904,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_CONST_V
        } else {
                ce = Z_CE_P(EX_VAR(opline->op2.var));
        }
-       zend_std_unset_static_property(ce, Z_STR_P(varname));
+       zend_std_unset_static_property(ce, name);
 
-       if (IS_CONST != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
-               zend_string_release(Z_STR(tmp));
+       if (IS_CONST != IS_CONST) {
+               zend_tmp_string_release(tmp_name);
        }
 
        ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -6910,15 +6919,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
        zval *value;
        int result;
 
-       zval tmp, *varname;
+       zval *varname;
+       zend_string *name, *tmp_name;
        zend_class_entry *ce;
 
        SAVE_OPLINE();
        varname = RT_CONSTANT(opline, opline->op1);
-       ZVAL_UNDEF(&tmp);
-       if (IS_CONST != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
-               ZVAL_STR(&tmp, zval_get_string(varname));
-               varname = &tmp;
+       if (IS_CONST == IS_CONST) {
+               name = Z_STR_P(varname);
+       } else {
+               name = zval_get_tmp_string(varname, &tmp_name);
        }
 
        if (IS_VAR == IS_CONST) {
@@ -6945,8 +6955,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
                        ce = zend_fetch_class(NULL, opline->op2.num);
                        if (UNEXPECTED(ce == NULL)) {
                                ZEND_ASSERT(EG(exception));
-                               if (IS_CONST != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
-                                       zend_string_release(Z_STR(tmp));
+                               if (IS_CONST != IS_CONST) {
+                                       zend_tmp_string_release(tmp_name);
                                }
 
                                ZVAL_UNDEF(EX_VAR(opline->result.var));
@@ -6969,14 +6979,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
                }
        }
 
-       value = zend_std_get_static_property(ce, Z_STR_P(varname), 1);
+       value = zend_std_get_static_property(ce, name, 1);
 
        if (IS_CONST == IS_CONST && value) {
                CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(RT_CONSTANT(opline, opline->op1)), ce, value);
        }
 
-       if (IS_CONST != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
-               zend_string_release(Z_STR(tmp));
+       if (IS_CONST != IS_CONST) {
+               zend_tmp_string_release(tmp_name);
        }
 
 is_static_prop_return:
@@ -7134,7 +7144,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_
 
        zval *varname;
        zval *retval;
-       zend_string *name;
+       zend_string *name, *tmp_name;
        HashTable *target_symbol_table;
 
        SAVE_OPLINE();
@@ -7144,12 +7154,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_
                name = Z_STR_P(varname);
        } else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) {
                name = Z_STR_P(varname);
-               zend_string_addref(name);
+               tmp_name = NULL;
        } else {
                if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
                        GET_OP1_UNDEF_CV(varname, BP_VAR_R);
                }
-               name = zval_get_string(varname);
+               name = zval_get_tmp_string(varname, &tmp_name);
        }
 
        target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK EXECUTE_DATA_CC);
@@ -7190,7 +7200,7 @@ fetch_this:
                                EMPTY_SWITCH_DEFAULT_CASE()
                        }
                        if (IS_CONST != IS_CONST) {
-                               zend_string_release(name);
+                               zend_tmp_string_release(tmp_name);
                        }
                        ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
                }
@@ -7242,7 +7252,7 @@ fetch_this:
        }
 
        if (IS_CONST != IS_CONST) {
-               zend_string_release(name);
+               zend_tmp_string_release(tmp_name);
        }
 
        ZEND_ASSERT(retval != NULL);
@@ -7716,7 +7726,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_CONST_UNUSED_H
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
-       zval tmp, *varname;
+       zval *varname;
+       zend_string *name, *tmp_name;
        HashTable *target_symbol_table;
 
 
@@ -7724,20 +7735,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_CONST_UNUSED_HA
 
        varname = RT_CONSTANT(opline, opline->op1);
 
-       ZVAL_UNDEF(&tmp);
-       if (IS_CONST != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
+       if (IS_CONST == IS_CONST) {
+               name = Z_STR_P(varname);
+       } else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) {
+               name = Z_STR_P(varname);
+               tmp_name = NULL;
+       } else {
                if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
                        varname = GET_OP1_UNDEF_CV(varname, BP_VAR_R);
                }
-               ZVAL_STR(&tmp, zval_get_string(varname));
-               varname = &tmp;
+               name = zval_get_tmp_string(varname, &tmp_name);
        }
 
        target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK EXECUTE_DATA_CC);
-       zend_hash_del_ind(target_symbol_table, Z_STR_P(varname));
+       zend_hash_del_ind(target_symbol_table, name);
 
-       if (IS_CONST != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
-               zend_string_release(Z_STR(tmp));
+       if (IS_CONST != IS_CONST) {
+               zend_tmp_string_release(tmp_name);
        }
 
        ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -7746,7 +7760,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_CONST_UNUSED_HA
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
-       zval tmp, *varname;
+       zval *varname;
+       zend_string *name, *tmp_name;
        zend_class_entry *ce;
 
 
@@ -7754,13 +7769,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_CONST_U
 
        varname = RT_CONSTANT(opline, opline->op1);
 
-       ZVAL_UNDEF(&tmp);
-       if (IS_CONST != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
+       if (IS_CONST == IS_CONST) {
+               name = Z_STR_P(varname);
+       } else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) {
+               name = Z_STR_P(varname);
+               tmp_name = NULL;
+       } else {
                if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
                        varname = GET_OP1_UNDEF_CV(varname, BP_VAR_R);
                }
-               ZVAL_STR(&tmp, zval_get_string(varname));
-               varname = &tmp;
+               name = zval_get_tmp_string(varname, &tmp_name);
        }
 
        if (IS_UNUSED == IS_CONST) {
@@ -7769,8 +7787,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_CONST_U
                        ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), RT_CONSTANT(opline, opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
                        if (UNEXPECTED(ce == NULL)) {
                                ZEND_ASSERT(EG(exception));
-                               if (IS_CONST != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
-                                       zend_string_release(Z_STR(tmp));
+                               if (IS_CONST != IS_CONST) {
+                                       zend_tmp_string_release(tmp_name);
                                }
 
                                HANDLE_EXCEPTION();
@@ -7781,8 +7799,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_CONST_U
                ce = zend_fetch_class(NULL, opline->op2.num);
                if (UNEXPECTED(ce == NULL)) {
                        ZEND_ASSERT(EG(exception));
-                       if (IS_CONST != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
-                               zend_string_release(Z_STR(tmp));
+                       if (IS_CONST != IS_CONST) {
+                               zend_tmp_string_release(tmp_name);
                        }
 
                        HANDLE_EXCEPTION();
@@ -7790,10 +7808,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_CONST_U
        } else {
                ce = Z_CE_P(EX_VAR(opline->op2.var));
        }
-       zend_std_unset_static_property(ce, Z_STR_P(varname));
+       zend_std_unset_static_property(ce, name);
 
-       if (IS_CONST != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
-               zend_string_release(Z_STR(tmp));
+       if (IS_CONST != IS_CONST) {
+               zend_tmp_string_release(tmp_name);
        }
 
        ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -7805,22 +7823,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_U
        zval *value;
        int result;
 
-       zval tmp, *varname;
+       zval *varname;
+       zend_string *name, *tmp_name;
        HashTable *target_symbol_table;
 
        SAVE_OPLINE();
        varname = RT_CONSTANT(opline, opline->op1);
-       ZVAL_UNDEF(&tmp);
-       if (IS_CONST != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
-               ZVAL_STR(&tmp, zval_get_string(varname));
-               varname = &tmp;
+       if (IS_CONST == IS_CONST) {
+               name = Z_STR_P(varname);
+       } else {
+               name = zval_get_tmp_string(varname, &tmp_name);
        }
 
        target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK EXECUTE_DATA_CC);
-       value = zend_hash_find_ind(target_symbol_table, Z_STR_P(varname));
+       value = zend_hash_find_ind(target_symbol_table, name);
 
-       if (IS_CONST != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
-               zend_string_release(Z_STR(tmp));
+       if (IS_CONST != IS_CONST) {
+               zend_tmp_string_release(tmp_name);
        }
 
        if (opline->extended_value & ZEND_ISSET) {
@@ -7841,15 +7860,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
        zval *value;
        int result;
 
-       zval tmp, *varname;
+       zval *varname;
+       zend_string *name, *tmp_name;
        zend_class_entry *ce;
 
        SAVE_OPLINE();
        varname = RT_CONSTANT(opline, opline->op1);
-       ZVAL_UNDEF(&tmp);
-       if (IS_CONST != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
-               ZVAL_STR(&tmp, zval_get_string(varname));
-               varname = &tmp;
+       if (IS_CONST == IS_CONST) {
+               name = Z_STR_P(varname);
+       } else {
+               name = zval_get_tmp_string(varname, &tmp_name);
        }
 
        if (IS_UNUSED == IS_CONST) {
@@ -7876,8 +7896,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
                        ce = zend_fetch_class(NULL, opline->op2.num);
                        if (UNEXPECTED(ce == NULL)) {
                                ZEND_ASSERT(EG(exception));
-                               if (IS_CONST != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
-                                       zend_string_release(Z_STR(tmp));
+                               if (IS_CONST != IS_CONST) {
+                                       zend_tmp_string_release(tmp_name);
                                }
 
                                ZVAL_UNDEF(EX_VAR(opline->result.var));
@@ -7900,14 +7920,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
                }
        }
 
-       value = zend_std_get_static_property(ce, Z_STR_P(varname), 1);
+       value = zend_std_get_static_property(ce, name, 1);
 
        if (IS_CONST == IS_CONST && value) {
                CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(RT_CONSTANT(opline, opline->op1)), ce, value);
        }
 
-       if (IS_CONST != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
-               zend_string_release(Z_STR(tmp));
+       if (IS_CONST != IS_CONST) {
+               zend_tmp_string_release(tmp_name);
        }
 
 is_static_prop_return:
@@ -37983,7 +38003,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_ARRAY_SPEC_CV_CONST_HANDL
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
-       zval tmp, *varname;
+       zval *varname;
+       zend_string *name, *tmp_name;
        zend_class_entry *ce;
 
 
@@ -37991,13 +38012,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_CV_CONS
 
        varname = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
 
-       ZVAL_UNDEF(&tmp);
-       if (IS_CV != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
+       if (IS_CV == IS_CONST) {
+               name = Z_STR_P(varname);
+       } else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) {
+               name = Z_STR_P(varname);
+               tmp_name = NULL;
+       } else {
                if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
                        varname = GET_OP1_UNDEF_CV(varname, BP_VAR_R);
                }
-               ZVAL_STR(&tmp, zval_get_string(varname));
-               varname = &tmp;
+               name = zval_get_tmp_string(varname, &tmp_name);
        }
 
        if (IS_CONST == IS_CONST) {
@@ -38006,8 +38030,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_CV_CONS
                        ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), RT_CONSTANT(opline, opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
                        if (UNEXPECTED(ce == NULL)) {
                                ZEND_ASSERT(EG(exception));
-                               if (IS_CV != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
-                                       zend_string_release(Z_STR(tmp));
+                               if (IS_CV != IS_CONST) {
+                                       zend_tmp_string_release(tmp_name);
                                }
 
                                HANDLE_EXCEPTION();
@@ -38018,8 +38042,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_CV_CONS
                ce = zend_fetch_class(NULL, opline->op2.num);
                if (UNEXPECTED(ce == NULL)) {
                        ZEND_ASSERT(EG(exception));
-                       if (IS_CV != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
-                               zend_string_release(Z_STR(tmp));
+                       if (IS_CV != IS_CONST) {
+                               zend_tmp_string_release(tmp_name);
                        }
 
                        HANDLE_EXCEPTION();
@@ -38027,10 +38051,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_CV_CONS
        } else {
                ce = Z_CE_P(EX_VAR(opline->op2.var));
        }
-       zend_std_unset_static_property(ce, Z_STR_P(varname));
+       zend_std_unset_static_property(ce, name);
 
-       if (IS_CV != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
-               zend_string_release(Z_STR(tmp));
+       if (IS_CV != IS_CONST) {
+               zend_tmp_string_release(tmp_name);
        }
 
        ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -38171,15 +38195,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
        zval *value;
        int result;
 
-       zval tmp, *varname;
+       zval *varname;
+       zend_string *name, *tmp_name;
        zend_class_entry *ce;
 
        SAVE_OPLINE();
        varname = _get_zval_ptr_cv_BP_VAR_IS(opline->op1.var EXECUTE_DATA_CC);
-       ZVAL_UNDEF(&tmp);
-       if (IS_CV != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
-               ZVAL_STR(&tmp, zval_get_string(varname));
-               varname = &tmp;
+       if (IS_CV == IS_CONST) {
+               name = Z_STR_P(varname);
+       } else {
+               name = zval_get_tmp_string(varname, &tmp_name);
        }
 
        if (IS_CONST == IS_CONST) {
@@ -38206,8 +38231,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
                        ce = zend_fetch_class(NULL, opline->op2.num);
                        if (UNEXPECTED(ce == NULL)) {
                                ZEND_ASSERT(EG(exception));
-                               if (IS_CV != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
-                                       zend_string_release(Z_STR(tmp));
+                               if (IS_CV != IS_CONST) {
+                                       zend_tmp_string_release(tmp_name);
                                }
 
                                ZVAL_UNDEF(EX_VAR(opline->result.var));
@@ -38230,14 +38255,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
                }
        }
 
-       value = zend_std_get_static_property(ce, Z_STR_P(varname), 1);
+       value = zend_std_get_static_property(ce, name, 1);
 
        if (IS_CV == IS_CONST && value) {
                CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(RT_CONSTANT(opline, opline->op1)), ce, value);
        }
 
-       if (IS_CV != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
-               zend_string_release(Z_STR(tmp));
+       if (IS_CV != IS_CONST) {
+               zend_tmp_string_release(tmp_name);
        }
 
 is_static_prop_return:
@@ -39348,7 +39373,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_CV_VAR_HANDLER
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
-       zval tmp, *varname;
+       zval *varname;
+       zend_string *name, *tmp_name;
        zend_class_entry *ce;
 
 
@@ -39356,13 +39382,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_CV_VAR_
 
        varname = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
 
-       ZVAL_UNDEF(&tmp);
-       if (IS_CV != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
+       if (IS_CV == IS_CONST) {
+               name = Z_STR_P(varname);
+       } else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) {
+               name = Z_STR_P(varname);
+               tmp_name = NULL;
+       } else {
                if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
                        varname = GET_OP1_UNDEF_CV(varname, BP_VAR_R);
                }
-               ZVAL_STR(&tmp, zval_get_string(varname));
-               varname = &tmp;
+               name = zval_get_tmp_string(varname, &tmp_name);
        }
 
        if (IS_VAR == IS_CONST) {
@@ -39371,8 +39400,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_CV_VAR_
                        ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), RT_CONSTANT(opline, opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
                        if (UNEXPECTED(ce == NULL)) {
                                ZEND_ASSERT(EG(exception));
-                               if (IS_CV != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
-                                       zend_string_release(Z_STR(tmp));
+                               if (IS_CV != IS_CONST) {
+                                       zend_tmp_string_release(tmp_name);
                                }
 
                                HANDLE_EXCEPTION();
@@ -39383,8 +39412,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_CV_VAR_
                ce = zend_fetch_class(NULL, opline->op2.num);
                if (UNEXPECTED(ce == NULL)) {
                        ZEND_ASSERT(EG(exception));
-                       if (IS_CV != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
-                               zend_string_release(Z_STR(tmp));
+                       if (IS_CV != IS_CONST) {
+                               zend_tmp_string_release(tmp_name);
                        }
 
                        HANDLE_EXCEPTION();
@@ -39392,10 +39421,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_CV_VAR_
        } else {
                ce = Z_CE_P(EX_VAR(opline->op2.var));
        }
-       zend_std_unset_static_property(ce, Z_STR_P(varname));
+       zend_std_unset_static_property(ce, name);
 
-       if (IS_CV != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
-               zend_string_release(Z_STR(tmp));
+       if (IS_CV != IS_CONST) {
+               zend_tmp_string_release(tmp_name);
        }
 
        ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -39407,15 +39436,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
        zval *value;
        int result;
 
-       zval tmp, *varname;
+       zval *varname;
+       zend_string *name, *tmp_name;
        zend_class_entry *ce;
 
        SAVE_OPLINE();
        varname = _get_zval_ptr_cv_BP_VAR_IS(opline->op1.var EXECUTE_DATA_CC);
-       ZVAL_UNDEF(&tmp);
-       if (IS_CV != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
-               ZVAL_STR(&tmp, zval_get_string(varname));
-               varname = &tmp;
+       if (IS_CV == IS_CONST) {
+               name = Z_STR_P(varname);
+       } else {
+               name = zval_get_tmp_string(varname, &tmp_name);
        }
 
        if (IS_VAR == IS_CONST) {
@@ -39442,8 +39472,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
                        ce = zend_fetch_class(NULL, opline->op2.num);
                        if (UNEXPECTED(ce == NULL)) {
                                ZEND_ASSERT(EG(exception));
-                               if (IS_CV != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
-                                       zend_string_release(Z_STR(tmp));
+                               if (IS_CV != IS_CONST) {
+                                       zend_tmp_string_release(tmp_name);
                                }
 
                                ZVAL_UNDEF(EX_VAR(opline->result.var));
@@ -39466,14 +39496,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
                }
        }
 
-       value = zend_std_get_static_property(ce, Z_STR_P(varname), 1);
+       value = zend_std_get_static_property(ce, name, 1);
 
        if (IS_CV == IS_CONST && value) {
                CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(RT_CONSTANT(opline, opline->op1)), ce, value);
        }
 
-       if (IS_CV != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
-               zend_string_release(Z_STR(tmp));
+       if (IS_CV != IS_CONST) {
+               zend_tmp_string_release(tmp_name);
        }
 
 is_static_prop_return:
@@ -39848,7 +39878,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_
 
        zval *varname;
        zval *retval;
-       zend_string *name;
+       zend_string *name, *tmp_name;
        HashTable *target_symbol_table;
 
        SAVE_OPLINE();
@@ -39858,12 +39888,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_
                name = Z_STR_P(varname);
        } else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) {
                name = Z_STR_P(varname);
-               zend_string_addref(name);
+               tmp_name = NULL;
        } else {
                if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
                        GET_OP1_UNDEF_CV(varname, BP_VAR_R);
                }
-               name = zval_get_string(varname);
+               name = zval_get_tmp_string(varname, &tmp_name);
        }
 
        target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK EXECUTE_DATA_CC);
@@ -39904,7 +39934,7 @@ fetch_this:
                                EMPTY_SWITCH_DEFAULT_CASE()
                        }
                        if (IS_CV != IS_CONST) {
-                               zend_string_release(name);
+                               zend_tmp_string_release(tmp_name);
                        }
                        ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
                }
@@ -39956,7 +39986,7 @@ fetch_this:
        }
 
        if (IS_CV != IS_CONST) {
-               zend_string_release(name);
+               zend_tmp_string_release(tmp_name);
        }
 
        ZEND_ASSERT(retval != NULL);
@@ -40699,7 +40729,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_CV_SPEC_CV_UNUSED_HANDLE
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
-       zval tmp, *varname;
+       zval *varname;
+       zend_string *name, *tmp_name;
        HashTable *target_symbol_table;
 
 
@@ -40707,20 +40738,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_CV_UNUSED_HANDL
 
        varname = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
 
-       ZVAL_UNDEF(&tmp);
-       if (IS_CV != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
+       if (IS_CV == IS_CONST) {
+               name = Z_STR_P(varname);
+       } else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) {
+               name = Z_STR_P(varname);
+               tmp_name = NULL;
+       } else {
                if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
                        varname = GET_OP1_UNDEF_CV(varname, BP_VAR_R);
                }
-               ZVAL_STR(&tmp, zval_get_string(varname));
-               varname = &tmp;
+               name = zval_get_tmp_string(varname, &tmp_name);
        }
 
        target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK EXECUTE_DATA_CC);
-       zend_hash_del_ind(target_symbol_table, Z_STR_P(varname));
+       zend_hash_del_ind(target_symbol_table, name);
 
-       if (IS_CV != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
-               zend_string_release(Z_STR(tmp));
+       if (IS_CV != IS_CONST) {
+               zend_tmp_string_release(tmp_name);
        }
 
        ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -40729,7 +40763,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_CV_UNUSED_HANDL
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
-       zval tmp, *varname;
+       zval *varname;
+       zend_string *name, *tmp_name;
        zend_class_entry *ce;
 
 
@@ -40737,13 +40772,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_CV_UNUS
 
        varname = _get_zval_ptr_cv_undef(opline->op1.var EXECUTE_DATA_CC);
 
-       ZVAL_UNDEF(&tmp);
-       if (IS_CV != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
+       if (IS_CV == IS_CONST) {
+               name = Z_STR_P(varname);
+       } else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) {
+               name = Z_STR_P(varname);
+               tmp_name = NULL;
+       } else {
                if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
                        varname = GET_OP1_UNDEF_CV(varname, BP_VAR_R);
                }
-               ZVAL_STR(&tmp, zval_get_string(varname));
-               varname = &tmp;
+               name = zval_get_tmp_string(varname, &tmp_name);
        }
 
        if (IS_UNUSED == IS_CONST) {
@@ -40752,8 +40790,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_CV_UNUS
                        ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), RT_CONSTANT(opline, opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
                        if (UNEXPECTED(ce == NULL)) {
                                ZEND_ASSERT(EG(exception));
-                               if (IS_CV != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
-                                       zend_string_release(Z_STR(tmp));
+                               if (IS_CV != IS_CONST) {
+                                       zend_tmp_string_release(tmp_name);
                                }
 
                                HANDLE_EXCEPTION();
@@ -40764,8 +40802,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_CV_UNUS
                ce = zend_fetch_class(NULL, opline->op2.num);
                if (UNEXPECTED(ce == NULL)) {
                        ZEND_ASSERT(EG(exception));
-                       if (IS_CV != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
-                               zend_string_release(Z_STR(tmp));
+                       if (IS_CV != IS_CONST) {
+                               zend_tmp_string_release(tmp_name);
                        }
 
                        HANDLE_EXCEPTION();
@@ -40773,10 +40811,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_CV_UNUS
        } else {
                ce = Z_CE_P(EX_VAR(opline->op2.var));
        }
-       zend_std_unset_static_property(ce, Z_STR_P(varname));
+       zend_std_unset_static_property(ce, name);
 
-       if (IS_CV != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
-               zend_string_release(Z_STR(tmp));
+       if (IS_CV != IS_CONST) {
+               zend_tmp_string_release(tmp_name);
        }
 
        ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -40813,22 +40851,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_UNUS
        zval *value;
        int result;
 
-       zval tmp, *varname;
+       zval *varname;
+       zend_string *name, *tmp_name;
        HashTable *target_symbol_table;
 
        SAVE_OPLINE();
        varname = _get_zval_ptr_cv_BP_VAR_IS(opline->op1.var EXECUTE_DATA_CC);
-       ZVAL_UNDEF(&tmp);
-       if (IS_CV != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
-               ZVAL_STR(&tmp, zval_get_string(varname));
-               varname = &tmp;
+       if (IS_CV == IS_CONST) {
+               name = Z_STR_P(varname);
+       } else {
+               name = zval_get_tmp_string(varname, &tmp_name);
        }
 
        target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK EXECUTE_DATA_CC);
-       value = zend_hash_find_ind(target_symbol_table, Z_STR_P(varname));
+       value = zend_hash_find_ind(target_symbol_table, name);
 
-       if (IS_CV != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
-               zend_string_release(Z_STR(tmp));
+       if (IS_CV != IS_CONST) {
+               zend_tmp_string_release(tmp_name);
        }
 
        if (opline->extended_value & ZEND_ISSET) {
@@ -40849,15 +40888,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
        zval *value;
        int result;
 
-       zval tmp, *varname;
+       zval *varname;
+       zend_string *name, *tmp_name;
        zend_class_entry *ce;
 
        SAVE_OPLINE();
        varname = _get_zval_ptr_cv_BP_VAR_IS(opline->op1.var EXECUTE_DATA_CC);
-       ZVAL_UNDEF(&tmp);
-       if (IS_CV != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
-               ZVAL_STR(&tmp, zval_get_string(varname));
-               varname = &tmp;
+       if (IS_CV == IS_CONST) {
+               name = Z_STR_P(varname);
+       } else {
+               name = zval_get_tmp_string(varname, &tmp_name);
        }
 
        if (IS_UNUSED == IS_CONST) {
@@ -40884,8 +40924,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
                        ce = zend_fetch_class(NULL, opline->op2.num);
                        if (UNEXPECTED(ce == NULL)) {
                                ZEND_ASSERT(EG(exception));
-                               if (IS_CV != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
-                                       zend_string_release(Z_STR(tmp));
+                               if (IS_CV != IS_CONST) {
+                                       zend_tmp_string_release(tmp_name);
                                }
 
                                ZVAL_UNDEF(EX_VAR(opline->result.var));
@@ -40908,14 +40948,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
                }
        }
 
-       value = zend_std_get_static_property(ce, Z_STR_P(varname), 1);
+       value = zend_std_get_static_property(ce, name, 1);
 
        if (IS_CV == IS_CONST && value) {
                CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(RT_CONSTANT(opline, opline->op1)), ce, value);
        }
 
-       if (IS_CV != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
-               zend_string_release(Z_STR(tmp));
+       if (IS_CV != IS_CONST) {
+               zend_tmp_string_release(tmp_name);
        }
 
 is_static_prop_return:
@@ -50161,7 +50201,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CASE_SPEC_TMPVAR_CONST_HANDLER
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
-       zval tmp, *varname;
+       zval *varname;
+       zend_string *name, *tmp_name;
        zend_class_entry *ce;
        zend_free_op free_op1;
 
@@ -50169,13 +50210,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_
 
        varname = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
 
-       ZVAL_UNDEF(&tmp);
-       if ((IS_TMP_VAR|IS_VAR) != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
+       if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+               name = Z_STR_P(varname);
+       } else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) {
+               name = Z_STR_P(varname);
+               tmp_name = NULL;
+       } else {
                if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
                        varname = GET_OP1_UNDEF_CV(varname, BP_VAR_R);
                }
-               ZVAL_STR(&tmp, zval_get_string(varname));
-               varname = &tmp;
+               name = zval_get_tmp_string(varname, &tmp_name);
        }
 
        if (IS_CONST == IS_CONST) {
@@ -50184,8 +50228,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_
                        ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), RT_CONSTANT(opline, opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
                        if (UNEXPECTED(ce == NULL)) {
                                ZEND_ASSERT(EG(exception));
-                               if ((IS_TMP_VAR|IS_VAR) != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
-                                       zend_string_release(Z_STR(tmp));
+                               if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
+                                       zend_tmp_string_release(tmp_name);
                                }
                                zval_ptr_dtor_nogc(free_op1);
                                HANDLE_EXCEPTION();
@@ -50196,8 +50240,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_
                ce = zend_fetch_class(NULL, opline->op2.num);
                if (UNEXPECTED(ce == NULL)) {
                        ZEND_ASSERT(EG(exception));
-                       if ((IS_TMP_VAR|IS_VAR) != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
-                               zend_string_release(Z_STR(tmp));
+                       if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
+                               zend_tmp_string_release(tmp_name);
                        }
                        zval_ptr_dtor_nogc(free_op1);
                        HANDLE_EXCEPTION();
@@ -50205,10 +50249,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_
        } else {
                ce = Z_CE_P(EX_VAR(opline->op2.var));
        }
-       zend_std_unset_static_property(ce, Z_STR_P(varname));
+       zend_std_unset_static_property(ce, name);
 
-       if ((IS_TMP_VAR|IS_VAR) != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
-               zend_string_release(Z_STR(tmp));
+       if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
+               zend_tmp_string_release(tmp_name);
        }
        zval_ptr_dtor_nogc(free_op1);
        ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -50220,15 +50264,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
        zval *value;
        int result;
        zend_free_op free_op1;
-       zval tmp, *varname;
+       zval *varname;
+       zend_string *name, *tmp_name;
        zend_class_entry *ce;
 
        SAVE_OPLINE();
        varname = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
-       ZVAL_UNDEF(&tmp);
-       if ((IS_TMP_VAR|IS_VAR) != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
-               ZVAL_STR(&tmp, zval_get_string(varname));
-               varname = &tmp;
+       if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+               name = Z_STR_P(varname);
+       } else {
+               name = zval_get_tmp_string(varname, &tmp_name);
        }
 
        if (IS_CONST == IS_CONST) {
@@ -50255,8 +50300,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
                        ce = zend_fetch_class(NULL, opline->op2.num);
                        if (UNEXPECTED(ce == NULL)) {
                                ZEND_ASSERT(EG(exception));
-                               if ((IS_TMP_VAR|IS_VAR) != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
-                                       zend_string_release(Z_STR(tmp));
+                               if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
+                                       zend_tmp_string_release(tmp_name);
                                }
                                zval_ptr_dtor_nogc(free_op1);
                                ZVAL_UNDEF(EX_VAR(opline->result.var));
@@ -50279,14 +50324,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
                }
        }
 
-       value = zend_std_get_static_property(ce, Z_STR_P(varname), 1);
+       value = zend_std_get_static_property(ce, name, 1);
 
        if ((IS_TMP_VAR|IS_VAR) == IS_CONST && value) {
                CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(RT_CONSTANT(opline, opline->op1)), ce, value);
        }
 
-       if ((IS_TMP_VAR|IS_VAR) != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
-               zend_string_release(Z_STR(tmp));
+       if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
+               zend_tmp_string_release(tmp_name);
        }
        zval_ptr_dtor_nogc(free_op1);
 
@@ -50708,7 +50753,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_IS_SPEC_TMPV
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
-       zval tmp, *varname;
+       zval *varname;
+       zend_string *name, *tmp_name;
        zend_class_entry *ce;
        zend_free_op free_op1;
 
@@ -50716,13 +50762,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_
 
        varname = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
 
-       ZVAL_UNDEF(&tmp);
-       if ((IS_TMP_VAR|IS_VAR) != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
+       if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+               name = Z_STR_P(varname);
+       } else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) {
+               name = Z_STR_P(varname);
+               tmp_name = NULL;
+       } else {
                if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
                        varname = GET_OP1_UNDEF_CV(varname, BP_VAR_R);
                }
-               ZVAL_STR(&tmp, zval_get_string(varname));
-               varname = &tmp;
+               name = zval_get_tmp_string(varname, &tmp_name);
        }
 
        if (IS_VAR == IS_CONST) {
@@ -50731,8 +50780,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_
                        ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), RT_CONSTANT(opline, opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
                        if (UNEXPECTED(ce == NULL)) {
                                ZEND_ASSERT(EG(exception));
-                               if ((IS_TMP_VAR|IS_VAR) != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
-                                       zend_string_release(Z_STR(tmp));
+                               if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
+                                       zend_tmp_string_release(tmp_name);
                                }
                                zval_ptr_dtor_nogc(free_op1);
                                HANDLE_EXCEPTION();
@@ -50743,8 +50792,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_
                ce = zend_fetch_class(NULL, opline->op2.num);
                if (UNEXPECTED(ce == NULL)) {
                        ZEND_ASSERT(EG(exception));
-                       if ((IS_TMP_VAR|IS_VAR) != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
-                               zend_string_release(Z_STR(tmp));
+                       if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
+                               zend_tmp_string_release(tmp_name);
                        }
                        zval_ptr_dtor_nogc(free_op1);
                        HANDLE_EXCEPTION();
@@ -50752,10 +50801,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_
        } else {
                ce = Z_CE_P(EX_VAR(opline->op2.var));
        }
-       zend_std_unset_static_property(ce, Z_STR_P(varname));
+       zend_std_unset_static_property(ce, name);
 
-       if ((IS_TMP_VAR|IS_VAR) != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
-               zend_string_release(Z_STR(tmp));
+       if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
+               zend_tmp_string_release(tmp_name);
        }
        zval_ptr_dtor_nogc(free_op1);
        ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -50767,15 +50816,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
        zval *value;
        int result;
        zend_free_op free_op1;
-       zval tmp, *varname;
+       zval *varname;
+       zend_string *name, *tmp_name;
        zend_class_entry *ce;
 
        SAVE_OPLINE();
        varname = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
-       ZVAL_UNDEF(&tmp);
-       if ((IS_TMP_VAR|IS_VAR) != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
-               ZVAL_STR(&tmp, zval_get_string(varname));
-               varname = &tmp;
+       if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+               name = Z_STR_P(varname);
+       } else {
+               name = zval_get_tmp_string(varname, &tmp_name);
        }
 
        if (IS_VAR == IS_CONST) {
@@ -50802,8 +50852,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
                        ce = zend_fetch_class(NULL, opline->op2.num);
                        if (UNEXPECTED(ce == NULL)) {
                                ZEND_ASSERT(EG(exception));
-                               if ((IS_TMP_VAR|IS_VAR) != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
-                                       zend_string_release(Z_STR(tmp));
+                               if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
+                                       zend_tmp_string_release(tmp_name);
                                }
                                zval_ptr_dtor_nogc(free_op1);
                                ZVAL_UNDEF(EX_VAR(opline->result.var));
@@ -50826,14 +50876,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
                }
        }
 
-       value = zend_std_get_static_property(ce, Z_STR_P(varname), 1);
+       value = zend_std_get_static_property(ce, name, 1);
 
        if ((IS_TMP_VAR|IS_VAR) == IS_CONST && value) {
                CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(RT_CONSTANT(opline, opline->op1)), ce, value);
        }
 
-       if ((IS_TMP_VAR|IS_VAR) != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
-               zend_string_release(Z_STR(tmp));
+       if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
+               zend_tmp_string_release(tmp_name);
        }
        zval_ptr_dtor_nogc(free_op1);
 
@@ -50905,7 +50955,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_
        zend_free_op free_op1;
        zval *varname;
        zval *retval;
-       zend_string *name;
+       zend_string *name, *tmp_name;
        HashTable *target_symbol_table;
 
        SAVE_OPLINE();
@@ -50915,12 +50965,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_
                name = Z_STR_P(varname);
        } else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) {
                name = Z_STR_P(varname);
-               zend_string_addref(name);
+               tmp_name = NULL;
        } else {
                if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
                        GET_OP1_UNDEF_CV(varname, BP_VAR_R);
                }
-               name = zval_get_string(varname);
+               name = zval_get_tmp_string(varname, &tmp_name);
        }
 
        target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK EXECUTE_DATA_CC);
@@ -50961,7 +51011,7 @@ fetch_this:
                                EMPTY_SWITCH_DEFAULT_CASE()
                        }
                        if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
-                               zend_string_release(name);
+                               zend_tmp_string_release(tmp_name);
                        }
                        ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
                }
@@ -51013,7 +51063,7 @@ fetch_this:
        }
 
        if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
-               zend_string_release(name);
+               zend_tmp_string_release(tmp_name);
        }
 
        ZEND_ASSERT(retval != NULL);
@@ -51133,7 +51183,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_IS_SPEC_TMPV
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
-       zval tmp, *varname;
+       zval *varname;
+       zend_string *name, *tmp_name;
        HashTable *target_symbol_table;
        zend_free_op free_op1;
 
@@ -51141,20 +51192,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_TMPVAR_UNUSED_H
 
        varname = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
 
-       ZVAL_UNDEF(&tmp);
-       if ((IS_TMP_VAR|IS_VAR) != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
+       if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+               name = Z_STR_P(varname);
+       } else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) {
+               name = Z_STR_P(varname);
+               tmp_name = NULL;
+       } else {
                if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
                        varname = GET_OP1_UNDEF_CV(varname, BP_VAR_R);
                }
-               ZVAL_STR(&tmp, zval_get_string(varname));
-               varname = &tmp;
+               name = zval_get_tmp_string(varname, &tmp_name);
        }
 
        target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK EXECUTE_DATA_CC);
-       zend_hash_del_ind(target_symbol_table, Z_STR_P(varname));
+       zend_hash_del_ind(target_symbol_table, name);
 
-       if ((IS_TMP_VAR|IS_VAR) != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
-               zend_string_release(Z_STR(tmp));
+       if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
+               zend_tmp_string_release(tmp_name);
        }
        zval_ptr_dtor_nogc(free_op1);
        ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -51163,7 +51217,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_TMPVAR_UNUSED_H
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
        USE_OPLINE
-       zval tmp, *varname;
+       zval *varname;
+       zend_string *name, *tmp_name;
        zend_class_entry *ce;
        zend_free_op free_op1;
 
@@ -51171,13 +51226,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_
 
        varname = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
 
-       ZVAL_UNDEF(&tmp);
-       if ((IS_TMP_VAR|IS_VAR) != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
+       if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+               name = Z_STR_P(varname);
+       } else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) {
+               name = Z_STR_P(varname);
+               tmp_name = NULL;
+       } else {
                if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) {
                        varname = GET_OP1_UNDEF_CV(varname, BP_VAR_R);
                }
-               ZVAL_STR(&tmp, zval_get_string(varname));
-               varname = &tmp;
+               name = zval_get_tmp_string(varname, &tmp_name);
        }
 
        if (IS_UNUSED == IS_CONST) {
@@ -51186,8 +51244,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_
                        ce = zend_fetch_class_by_name(Z_STR_P(RT_CONSTANT(opline, opline->op2)), RT_CONSTANT(opline, opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION);
                        if (UNEXPECTED(ce == NULL)) {
                                ZEND_ASSERT(EG(exception));
-                               if ((IS_TMP_VAR|IS_VAR) != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
-                                       zend_string_release(Z_STR(tmp));
+                               if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
+                                       zend_tmp_string_release(tmp_name);
                                }
                                zval_ptr_dtor_nogc(free_op1);
                                HANDLE_EXCEPTION();
@@ -51198,8 +51256,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_
                ce = zend_fetch_class(NULL, opline->op2.num);
                if (UNEXPECTED(ce == NULL)) {
                        ZEND_ASSERT(EG(exception));
-                       if ((IS_TMP_VAR|IS_VAR) != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
-                               zend_string_release(Z_STR(tmp));
+                       if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
+                               zend_tmp_string_release(tmp_name);
                        }
                        zval_ptr_dtor_nogc(free_op1);
                        HANDLE_EXCEPTION();
@@ -51207,10 +51265,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_
        } else {
                ce = Z_CE_P(EX_VAR(opline->op2.var));
        }
-       zend_std_unset_static_property(ce, Z_STR_P(varname));
+       zend_std_unset_static_property(ce, name);
 
-       if ((IS_TMP_VAR|IS_VAR) != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
-               zend_string_release(Z_STR(tmp));
+       if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
+               zend_tmp_string_release(tmp_name);
        }
        zval_ptr_dtor_nogc(free_op1);
        ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -51222,22 +51280,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_TMPVAR_
        zval *value;
        int result;
        zend_free_op free_op1;
-       zval tmp, *varname;
+       zval *varname;
+       zend_string *name, *tmp_name;
        HashTable *target_symbol_table;
 
        SAVE_OPLINE();
        varname = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
-       ZVAL_UNDEF(&tmp);
-       if ((IS_TMP_VAR|IS_VAR) != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
-               ZVAL_STR(&tmp, zval_get_string(varname));
-               varname = &tmp;
+       if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+               name = Z_STR_P(varname);
+       } else {
+               name = zval_get_tmp_string(varname, &tmp_name);
        }
 
        target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK EXECUTE_DATA_CC);
-       value = zend_hash_find_ind(target_symbol_table, Z_STR_P(varname));
+       value = zend_hash_find_ind(target_symbol_table, name);
 
-       if ((IS_TMP_VAR|IS_VAR) != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
-               zend_string_release(Z_STR(tmp));
+       if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
+               zend_tmp_string_release(tmp_name);
        }
        zval_ptr_dtor_nogc(free_op1);
 
@@ -51259,15 +51318,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
        zval *value;
        int result;
        zend_free_op free_op1;
-       zval tmp, *varname;
+       zval *varname;
+       zend_string *name, *tmp_name;
        zend_class_entry *ce;
 
        SAVE_OPLINE();
        varname = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
-       ZVAL_UNDEF(&tmp);
-       if ((IS_TMP_VAR|IS_VAR) != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
-               ZVAL_STR(&tmp, zval_get_string(varname));
-               varname = &tmp;
+       if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+               name = Z_STR_P(varname);
+       } else {
+               name = zval_get_tmp_string(varname, &tmp_name);
        }
 
        if (IS_UNUSED == IS_CONST) {
@@ -51294,8 +51354,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
                        ce = zend_fetch_class(NULL, opline->op2.num);
                        if (UNEXPECTED(ce == NULL)) {
                                ZEND_ASSERT(EG(exception));
-                               if ((IS_TMP_VAR|IS_VAR) != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
-                                       zend_string_release(Z_STR(tmp));
+                               if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
+                                       zend_tmp_string_release(tmp_name);
                                }
                                zval_ptr_dtor_nogc(free_op1);
                                ZVAL_UNDEF(EX_VAR(opline->result.var));
@@ -51318,14 +51378,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC
                }
        }
 
-       value = zend_std_get_static_property(ce, Z_STR_P(varname), 1);
+       value = zend_std_get_static_property(ce, name, 1);
 
        if ((IS_TMP_VAR|IS_VAR) == IS_CONST && value) {
                CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(RT_CONSTANT(opline, opline->op1)), ce, value);
        }
 
-       if ((IS_TMP_VAR|IS_VAR) != IS_CONST && Z_TYPE(tmp) != IS_UNDEF) {
-               zend_string_release(Z_STR(tmp));
+       if ((IS_TMP_VAR|IS_VAR) != IS_CONST) {
+               zend_tmp_string_release(tmp_name);
        }
        zval_ptr_dtor_nogc(free_op1);
 
index fa30e45e048e0bff89bc14c59186ba37e6fb2596..87295122a2b6e0f04f2e2cdf01e992ef679e9f24 100644 (file)
@@ -2393,9 +2393,10 @@ static int _php_curl_setopt(php_curl *ch, zend_long option, zval *zvalue) /* {{{
                case CURLOPT_DEFAULT_PROTOCOL:
 #endif
                {
-                       zend_string *str = zval_get_string(zvalue);
+                       zend_string *tmp_str;
+                       zend_string *str = zval_get_tmp_string(zvalue, &tmp_str);
                        int ret = php_curl_option_str(ch, option, ZSTR_VAL(str), ZSTR_LEN(str), 0);
-                       zend_string_release(str);
+                       zend_tmp_string_release(tmp_str);
                        return ret;
                }
 
@@ -2427,9 +2428,10 @@ static int _php_curl_setopt(php_curl *ch, zend_long option, zval *zvalue) /* {{{
                        if (Z_ISNULL_P(zvalue)) {
                                error = curl_easy_setopt(ch->cp, option, NULL);
                        } else {
-                               zend_string *str = zval_get_string(zvalue);
+                               zend_string *tmp_str;
+                               zend_string *str = zval_get_tmp_string(zvalue, &tmp_str);
                                int ret = php_curl_option_str(ch, option, ZSTR_VAL(str), ZSTR_LEN(str), 0);
-                               zend_string_release(str);
+                               zend_tmp_string_release(tmp_str);
                                return ret;
                        }
                        break;
@@ -2438,18 +2440,20 @@ static int _php_curl_setopt(php_curl *ch, zend_long option, zval *zvalue) /* {{{
                /* Curl private option */
                case CURLOPT_PRIVATE:
                {
-                       zend_string *str = zval_get_string(zvalue);
+                       zend_string *tmp_str;
+                       zend_string *str = zval_get_tmp_string(zvalue, &tmp_str);
                        int ret = php_curl_option_str(ch, option, ZSTR_VAL(str), ZSTR_LEN(str), 1);
-                       zend_string_release(str);
+                       zend_tmp_string_release(tmp_str);
                        return ret;
                }
 
                /* Curl url option */
                case CURLOPT_URL:
                {
-                       zend_string *str = zval_get_string(zvalue);
+                       zend_string *tmp_str;
+                       zend_string *str = zval_get_tmp_string(zvalue, &tmp_str);
                        int ret = php_curl_option_url(ch, ZSTR_VAL(str), ZSTR_LEN(str));
-                       zend_string_release(str);
+                       zend_tmp_string_release(tmp_str);
                        return ret;
                }
 
@@ -2572,7 +2576,7 @@ static int _php_curl_setopt(php_curl *ch, zend_long option, zval *zvalue) /* {{{
                {
                        zval *current;
                        HashTable *ph;
-                       zend_string *val;
+                       zend_string *val, *tmp_val;
                        struct curl_slist *slist = NULL;
 
                        ph = HASH_OF(zvalue);
@@ -2624,9 +2628,9 @@ static int _php_curl_setopt(php_curl *ch, zend_long option, zval *zvalue) /* {{{
 
                        ZEND_HASH_FOREACH_VAL(ph, current) {
                                ZVAL_DEREF(current);
-                               val = zval_get_string(current);
+                               val = zval_get_tmp_string(current, &tmp_val);
                                slist = curl_slist_append(slist, ZSTR_VAL(val));
-                               zend_string_release(val);
+                               zend_tmp_string_release(tmp_val);
                                if (!slist) {
                                        php_error_docref(NULL, E_WARNING, "Could not build curl_slist");
                                        return 1;
@@ -2687,7 +2691,7 @@ static int _php_curl_setopt(php_curl *ch, zend_long option, zval *zvalue) /* {{{
                                }
 
                                ZEND_HASH_FOREACH_KEY_VAL(postfields, num_key, string_key, current) {
-                                       zend_string *postval;
+                                       zend_string *postval, *tmp_postval;
                                        /* Pretend we have a string_key here */
                                        if (!string_key) {
                                                string_key = zend_long_to_str(num_key);
@@ -2737,7 +2741,7 @@ static int _php_curl_setopt(php_curl *ch, zend_long option, zval *zvalue) /* {{{
                                                continue;
                                        }
 
-                                       postval = zval_get_string(current);
+                                       postval = zval_get_tmp_string(current, &tmp_postval);
 
                                        /* The arguments after _NAMELENGTH and _CONTENTSLENGTH
                                         * must be explicitly cast to long in curl_formadd
@@ -2753,7 +2757,7 @@ static int _php_curl_setopt(php_curl *ch, zend_long option, zval *zvalue) /* {{{
                                                /* Not nice to convert between enums but we only have place for one error type */
                                                error = (CURLcode)form_error;
                                        }
-                                       zend_string_release(postval);
+                                       zend_tmp_string_release(tmp_postval);
                                        zend_string_release(string_key);
                                } ZEND_HASH_FOREACH_END();
 
@@ -2769,21 +2773,23 @@ static int _php_curl_setopt(php_curl *ch, zend_long option, zval *zvalue) /* {{{
                                error = curl_easy_setopt(ch->cp, CURLOPT_HTTPPOST, first);
                        } else {
 #if LIBCURL_VERSION_NUM >= 0x071101
-                               zend_string *str = zval_get_string(zvalue);
+                               zend_string *tmp_str;
+                               zend_string *str = zval_get_tmp_string(zvalue, &tmp_str);
                                /* with curl 7.17.0 and later, we can use COPYPOSTFIELDS, but we have to provide size before */
                                error = curl_easy_setopt(ch->cp, CURLOPT_POSTFIELDSIZE, ZSTR_LEN(str));
                                error = curl_easy_setopt(ch->cp, CURLOPT_COPYPOSTFIELDS, ZSTR_VAL(str));
-                               zend_string_release(str);
+                               zend_tmp_string_release(tmp_str);
 #else
                                char *post = NULL;
-                               zend_string *str = zval_get_string(zvalue);
+                               zend_string *tmp_str;
+                               zend_string *str = zval_get_tmp_string(zvalue, &tmp_str);
 
                                post = estrndup(ZSTR_VAL(str), ZSTR_LEN(str));
                                zend_llist_add_element(&ch->to_free->str, &post);
 
                                curl_easy_setopt(ch->cp, CURLOPT_POSTFIELDS, post);
                                error = curl_easy_setopt(ch->cp, CURLOPT_POSTFIELDSIZE, ZSTR_LEN(str));
-                               zend_string_release(str);
+                               zend_tmp_string_release(tmp_str);
 #endif
                        }
                        break;
@@ -2873,16 +2879,17 @@ static int _php_curl_setopt(php_curl *ch, zend_long option, zval *zvalue) /* {{{
                case CURLOPT_SSH_KNOWNHOSTS:
 #endif
                {
-                       zend_string *str = zval_get_string(zvalue);
+                   zend_string *tmp_str;
+                       zend_string *str = zval_get_tmp_string(zvalue, &tmp_str);
                        int ret;
 
                        if (ZSTR_LEN(str) && php_check_open_basedir(ZSTR_VAL(str))) {
-                               zend_string_release(str);
+                               zend_tmp_string_release(tmp_str);
                                return FAILURE;
                        }
 
                        ret = php_curl_option_str(ch, option, ZSTR_VAL(str), ZSTR_LEN(str), 0);
-                       zend_string_release(str);
+                       zend_tmp_string_release(tmp_str);
                        return ret;
                }
 
index e6e7ef1c5b4919115f732d7e068ca911e49c1b86..000199ca810fb4d18a3a7019b3881835559c7c3d 100644 (file)
@@ -4353,9 +4353,10 @@ static int php_date_interval_initialize_from_hash(zval **return_value, php_inter
        do { \
                zval *z_arg = zend_hash_str_find(myht, element, sizeof(element) - 1); \
                if (z_arg && Z_TYPE_P(z_arg) <= IS_STRING) { \
-                       zend_string *str = zval_get_string(z_arg); \
+                       zend_string *tmp_str; \
+                       zend_string *str = zval_get_tmp_string(z_arg, &tmp_str); \
                        DATE_A64I((*intobj)->diff->member, ZSTR_VAL(str)); \
-                       zend_string_release(str); \
+                       zend_tmp_string_release(tmp_str); \
                } else { \
                        (*intobj)->diff->member = -1LL; \
                } \
index 5386077f8cbf15ab211ed2738067a29f18accd22..82c0323f1cea0d7e369921798042145a5c27970b 100644 (file)
@@ -1415,8 +1415,12 @@ static zend_string *preg_do_repl_func(zend_fcall_info *fci, zend_fcall_info_cach
        fci->no_separation = 0;
 
        if (zend_call_function(fci, fcc) == SUCCESS && Z_TYPE(retval) != IS_UNDEF) {
-               result_str = zval_get_string(&retval);
-               zval_ptr_dtor(&retval);
+               if (EXPECTED(Z_TYPE(retval) == IS_STRING)) {
+                       result_str = Z_STR(retval);
+               } else {
+                       result_str = zval_get_string_func(&retval);
+                       zval_ptr_dtor(&retval);
+               }
        } else {
                if (!EG(exception)) {
                        php_error_docref(NULL, E_WARNING, "Unable to call custom replacement function");
@@ -1933,7 +1937,7 @@ static zend_string *php_pcre_replace_array(HashTable *regex, zval *replace, zend
 {
        zval            *regex_entry;
        zend_string *result;
-       zend_string *replace_str;
+       zend_string *replace_str, *tmp_replace_str;
 
        if (Z_TYPE_P(replace) == IS_ARRAY) {
                uint32_t replace_idx = 0;
@@ -1942,19 +1946,21 @@ static zend_string *php_pcre_replace_array(HashTable *regex, zval *replace, zend
                /* For each entry in the regex array, get the entry */
                ZEND_HASH_FOREACH_VAL(regex, regex_entry) {
                        /* Make sure we're dealing with strings. */
-                       zend_string *regex_str = zval_get_string(regex_entry);
+                       zend_string *tmp_regex_str;
+                       zend_string *regex_str = zval_get_tmp_string(regex_entry, &tmp_regex_str);
                        zval *zv;
 
                        /* Get current entry */
                        while (1) {
                                if (replace_idx == replace_ht->nNumUsed) {
                                        replace_str = ZSTR_EMPTY_ALLOC();
+                                       tmp_replace_str = NULL;
                                        break;
                                }
                                zv = &replace_ht->arData[replace_idx].val;
                                replace_idx++;
                                if (Z_TYPE_P(zv) != IS_UNDEF) {
-                                       replace_str = zval_get_string(zv);
+                                       replace_str = zval_get_tmp_string(zv, &tmp_replace_str);
                                        break;
                                }
                        }
@@ -1968,8 +1974,8 @@ static zend_string *php_pcre_replace_array(HashTable *regex, zval *replace, zend
                                                                          replace_str,
                                                                          limit,
                                                                          replace_count);
-                       zend_string_release(replace_str);
-                       zend_string_release(regex_str);
+                       zend_tmp_string_release(tmp_replace_str);
+                       zend_tmp_string_release(tmp_regex_str);
                        zend_string_release(subject_str);
                        subject_str = result;
                        if (UNEXPECTED(result == NULL)) {
@@ -1983,7 +1989,8 @@ static zend_string *php_pcre_replace_array(HashTable *regex, zval *replace, zend
                /* For each entry in the regex array, get the entry */
                ZEND_HASH_FOREACH_VAL(regex, regex_entry) {
                        /* Make sure we're dealing with strings. */
-                       zend_string *regex_str = zval_get_string(regex_entry);
+                       zend_string *tmp_regex_str;
+                       zend_string *regex_str = zval_get_tmp_string(regex_entry, &tmp_regex_str);
 
                        /* Do the actual replacement and put the result back into subject_str
                           for further replacements. */
@@ -1994,7 +2001,7 @@ static zend_string *php_pcre_replace_array(HashTable *regex, zval *replace, zend
                                                                          replace_str,
                                                                          limit,
                                                                          replace_count);
-                       zend_string_release(regex_str);
+                       zend_tmp_string_release(tmp_regex_str);
                        zend_string_release(subject_str);
                        subject_str = result;
 
@@ -2057,7 +2064,8 @@ static zend_string *php_replace_in_subject_func(zval *regex, zend_fcall_info *fc
                /* For each entry in the regex array, get the entry */
                ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(regex), regex_entry) {
                        /* Make sure we're dealing with strings. */
-                       zend_string *regex_str = zval_get_string(regex_entry);
+                       zend_string *tmp_regex_str;
+                       zend_string *regex_str = zval_get_tmp_string(regex_entry, &tmp_regex_str);
 
                        /* Do the actual replacement and put the result back into subject_str
                           for further replacements. */
@@ -2066,7 +2074,7 @@ static zend_string *php_replace_in_subject_func(zval *regex, zend_fcall_info *fc
                                                                                   fci, fcc,
                                                                                   limit,
                                                                                   replace_count);
-                       zend_string_release(regex_str);
+                       zend_tmp_string_release(tmp_regex_str);
                        zend_string_release(subject_str);
                        subject_str = result;
                        if (UNEXPECTED(result == NULL)) {
index 4291883ce95225b09a7a274b4f95ecb626ec0ec4..749c7e7656d01ccad07d47cba2ed1bd89b1d5eab 100644 (file)
@@ -547,10 +547,11 @@ static void _const_string(smart_str *str, char *name, zval *value, char *indent)
                smart_str_append_printf(str, "%s    Constant [ %s %s ] { %s }\n",
                                                indent, type, name, Z_STRVAL_P(value));
        } else {
-               zend_string *value_str = zval_get_string(value);
+               zend_string *tmp_value_str;
+               zend_string *value_str = zval_get_tmp_string(value, &tmp_value_str);
                smart_str_append_printf(str, "%s    Constant [ %s %s ] { %s }\n",
                                                indent, type, name, ZSTR_VAL(value_str));
-               zend_string_release(value_str);
+               zend_tmp_string_release(tmp_value_str);
        }
 }
 /* }}} */
@@ -568,12 +569,13 @@ static void _class_const_string(smart_str *str, char *name, zend_class_constant
                smart_str_append_printf(str, "%sConstant [ %s %s %s ] { Array }\n",
                                                indent, visibility, type, name);
        } else {
-               zend_string *value_str = zval_get_string(&c->value);
+               zend_string *tmp_value_str;
+               zend_string *value_str = zval_get_tmp_string(&c->value, &tmp_value_str);
 
                smart_str_append_printf(str, "%sConstant [ %s %s %s ] { %s }\n",
                                                indent, visibility, type, name, ZSTR_VAL(value_str));
 
-               zend_string_release(value_str);
+               zend_tmp_string_release(tmp_value_str);
        }
 }
 /* }}} */
@@ -660,9 +662,10 @@ static void _parameter_string(smart_str *str, zend_function *fptr, struct _zend_
                        } else if (Z_TYPE(zv) == IS_ARRAY) {
                                smart_str_appends(str, "Array");
                        } else {
-                               zend_string *zv_str = zval_get_string(&zv);
+                               zend_string *tmp_zv_str;
+                               zend_string *zv_str = zval_get_tmp_string(&zv, &tmp_zv_str);
                                smart_str_append(str, zv_str);
-                               zend_string_release(zv_str);
+                               zend_tmp_string_release(tmp_zv_str);
                        }
                        zval_ptr_dtor(&zv);
                }
index bfd1c9b566d41a4f98d8b0cde6dcc2fc3e4eb38b..3fa1b7a0265998ba08ab23d1868abbd2a7183e24 100644 (file)
@@ -2383,11 +2383,12 @@ static PHP_FUNCTION(session_start)
                                                if (zend_string_equals_literal(str_idx, "read_and_close")) {
                                                        read_and_close = zval_get_long(value);
                                                } else {
-                                                       zend_string *val = zval_get_string(value);
+                                                       zend_string *tmp_val;
+                                                       zend_string *val = zval_get_tmp_string(value, &tmp_val);
                                                        if (php_session_start_set_ini(str_idx, val) == FAILURE) {
                                                                php_error_docref(NULL, E_WARNING, "Setting option '%s' failed", ZSTR_VAL(str_idx));
                                                        }
-                                                       zend_string_release(val);
+                                                       zend_tmp_string_release(tmp_val);
                                                }
                                                break;
                                        default:
index 748c5c5453a7debf2a2e9b70e19f6c5108c461a4..a3defee4db414afe2901fcbb13508071b0407b7a 100644 (file)
@@ -260,7 +260,7 @@ long_dim:
                        name = NULL;
                } else {
                        if (Z_TYPE_P(member) != IS_STRING) {
-                               ZVAL_STR(&tmp_zv, zval_get_string(member));
+                               ZVAL_STR(&tmp_zv, zval_get_string_func(member));
                                member = &tmp_zv;
                        }
                        name = Z_STRVAL_P(member);
@@ -468,7 +468,7 @@ long_dim:
                        }
                } else {
                        if (Z_TYPE_P(member) != IS_STRING) {
-                               trim_str = zval_get_string(member);
+                               trim_str = zval_get_string_func(member);
                                ZVAL_STR(&tmp_zv, php_trim(trim_str, NULL, 0, 3));
                                zend_string_release(trim_str);
                                member = &tmp_zv;
@@ -726,7 +726,7 @@ static int sxe_prop_dim_exists(zval *object, zval *member, int check_empty, zend
        zval            tmp_zv;
 
        if (Z_TYPE_P(member) != IS_STRING && Z_TYPE_P(member) != IS_LONG) {
-               ZVAL_STR(&tmp_zv, zval_get_string(member));
+               ZVAL_STR(&tmp_zv, zval_get_string_func(member));
                member = &tmp_zv;
        }
 
@@ -845,7 +845,7 @@ static void sxe_prop_dim_delete(zval *object, zval *member, zend_bool elements,
        int             test = 0;
 
        if (Z_TYPE_P(member) != IS_STRING && Z_TYPE_P(member) != IS_LONG) {
-               ZVAL_STR(&tmp_zv, zval_get_string(member));
+               ZVAL_STR(&tmp_zv, zval_get_string_func(member));
                member = &tmp_zv;
        }
 
index 057a367655d08ba2714592cae6fcba6680780e5b..1096636a4f689cf429cccec0be7ef9473d0a67ce 100644 (file)
@@ -845,7 +845,7 @@ static xmlNodePtr to_xml_string(encodeTypePtr type, zval *data, int style, xmlNo
                str = estrndup(Z_STRVAL_P(data), Z_STRLEN_P(data));
                new_len = Z_STRLEN_P(data);
        } else {
-               zend_string *tmp = zval_get_string(data);
+               zend_string *tmp = zval_get_string_func(data);
                str = estrndup(ZSTR_VAL(tmp), ZSTR_LEN(tmp));
                new_len = ZSTR_LEN(tmp);
                zend_string_release(tmp);
@@ -928,7 +928,7 @@ static xmlNodePtr to_xml_base64(encodeTypePtr type, zval *data, int style, xmlNo
        if (Z_TYPE_P(data) == IS_STRING) {
                str = php_base64_encode((unsigned char*)Z_STRVAL_P(data), Z_STRLEN_P(data));
        } else {
-               zend_string *tmp = zval_get_string(data);
+               zend_string *tmp = zval_get_string_func(data);
                str = php_base64_encode((unsigned char*) ZSTR_VAL(tmp), ZSTR_LEN(tmp));
                zend_string_release(tmp);
        }
@@ -956,7 +956,7 @@ static xmlNodePtr to_xml_hexbin(encodeTypePtr type, zval *data, int style, xmlNo
        FIND_ZVAL_NULL(data, ret, style);
 
        if (Z_TYPE_P(data) != IS_STRING) {
-               ZVAL_STR(&tmp, zval_get_string(data));
+               ZVAL_STR(&tmp, zval_get_string_func(data));
                data = &tmp;
        }
        str = (unsigned char *) safe_emalloc(Z_STRLEN_P(data) * 2, sizeof(char), 1);
@@ -3029,7 +3029,7 @@ static xmlNodePtr to_xml_list(encodeTypePtr enc, zval *data, int style, xmlNodeP
                smart_str list = {0};
 
                if (Z_TYPE_P(data) != IS_STRING) {
-                       ZVAL_STR(&tmp, zval_get_string(data));
+                       ZVAL_STR(&tmp, zval_get_string_func(data));
                        data = &tmp;
                }
                str = estrndup(Z_STRVAL_P(data), Z_STRLEN_P(data));
@@ -3139,7 +3139,7 @@ static xmlNodePtr to_xml_any(encodeTypePtr type, zval *data, int style, xmlNodeP
        if (Z_TYPE_P(data) == IS_STRING) {
                ret = xmlNewTextLen(BAD_CAST(Z_STRVAL_P(data)), Z_STRLEN_P(data));
        } else {
-               zend_string *tmp = zval_get_string(data);
+               zend_string *tmp = zval_get_string_func(data);
                ret = xmlNewTextLen(BAD_CAST(ZSTR_VAL(tmp)), ZSTR_LEN(tmp));
                zend_string_release(tmp);
        }
index 4a1705bcee8f4e2cbb7e807e2c9cddc33a303f24..196649d553aee2e819ba4c2807fc0a2fc9af7885 100644 (file)
@@ -541,9 +541,9 @@ static void from_zval_write_sin_addr(const zval *zaddr_str, char *inaddr, ser_co
 {
        int                                     res;
        struct sockaddr_in      saddr = {0};
-       zend_string                     *addr_str;
+       zend_string                     *addr_str, *tmp_addr_str;
 
-       addr_str = zval_get_string((zval *) zaddr_str);
+       addr_str = zval_get_tmp_string((zval *) zaddr_str, &tmp_addr_str);
        res = php_set_inet_addr(&saddr, ZSTR_VAL(addr_str), ctx->sock);
        if (res) {
                memcpy(inaddr, &saddr.sin_addr, sizeof saddr.sin_addr);
@@ -553,7 +553,7 @@ static void from_zval_write_sin_addr(const zval *zaddr_str, char *inaddr, ser_co
                                "address", ZSTR_VAL(addr_str));
        }
 
-       zend_string_release(addr_str);
+       zend_tmp_string_release(tmp_addr_str);
 }
 static void to_zval_read_sin_addr(const char *data, zval *zv, res_context *ctx)
 {
@@ -591,9 +591,9 @@ static void from_zval_write_sin6_addr(const zval *zaddr_str, char *addr6, ser_co
 {
        int                                     res;
        struct sockaddr_in6     saddr6 = {0};
-       zend_string                     *addr_str;
+       zend_string                     *addr_str, *tmp_addr_str;
 
-       addr_str = zval_get_string((zval *) zaddr_str);
+       addr_str = zval_get_tmp_string((zval *) zaddr_str, &tmp_addr_str);
        res = php_set_inet6_addr(&saddr6, ZSTR_VAL(addr_str), ctx->sock);
        if (res) {
                memcpy(addr6, &saddr6.sin6_addr, sizeof saddr6.sin6_addr);
@@ -603,7 +603,7 @@ static void from_zval_write_sin6_addr(const zval *zaddr_str, char *addr6, ser_co
                                "address", Z_STRVAL_P(zaddr_str));
        }
 
-       zend_string_release(addr_str);
+       zend_tmp_string_release(tmp_addr_str);
 }
 static void to_zval_read_sin6_addr(const char *data, zval *zv, res_context *ctx)
 {
@@ -642,28 +642,30 @@ static void to_zval_read_sockaddr_in6(const char *data, zval *zv, res_context *c
 #endif /* HAVE_IPV6 */
 static void from_zval_write_sun_path(const zval *path, char *sockaddr_un_c, ser_context *ctx)
 {
-       zend_string                     *path_str;
+       zend_string                     *path_str, *tmp_path_str;
        struct sockaddr_un      *saddr = (struct sockaddr_un*)sockaddr_un_c;
 
-       path_str = zval_get_string((zval *) path);
+       path_str = zval_get_tmp_string((zval *) path, &tmp_path_str);
 
        /* code in this file relies on the path being nul terminated, even though
         * this is not required, at least on linux for abstract paths. It also
         * assumes that the path is not empty */
        if (ZSTR_LEN(path_str) == 0) {
                do_from_zval_err(ctx, "%s", "the path is cannot be empty");
+               zend_tmp_string_release(tmp_path_str);
                return;
        }
        if (ZSTR_LEN(path_str) >= sizeof(saddr->sun_path)) {
                do_from_zval_err(ctx, "the path is too long, the maximum permitted "
                                "length is %zd", sizeof(saddr->sun_path) - 1);
+               zend_tmp_string_release(tmp_path_str);
                return;
        }
 
        memcpy(&saddr->sun_path, ZSTR_VAL(path_str), ZSTR_LEN(path_str));
        saddr->sun_path[ZSTR_LEN(path_str)] = '\0';
 
-       zend_string_release(path_str);
+       zend_tmp_string_release(tmp_path_str);
 }
 static void to_zval_read_sun_path(const char *data, zval *zv, res_context *ctx) {
        struct sockaddr_un      *saddr = (struct sockaddr_un*)data;
@@ -1076,15 +1078,15 @@ static void from_zval_write_iov_array_aux(zval *elem, unsigned i, void **args, s
 {
        struct msghdr   *msg = args[0];
        size_t                  len;
-       zend_string     *str;
+       zend_string     *str, *tmp_str;
 
-       str = zval_get_string(elem);
+       str = zval_get_tmp_string(elem, &tmp_str);
 
        msg->msg_iov[i - 1].iov_base = accounted_emalloc(ZSTR_LEN(str), ctx);
        msg->msg_iov[i - 1].iov_len = ZSTR_LEN(str);
        memcpy(msg->msg_iov[i - 1].iov_base, ZSTR_VAL(str), ZSTR_LEN(str));
 
-       zend_string_release(str);
+       zend_tmp_string_release(tmp_str);
 }
 static void from_zval_write_iov_array(const zval *arr, char *msghdr_c, ser_context *ctx)
 {
@@ -1240,9 +1242,9 @@ static void from_zval_write_ifindex(const zval *zv, char *uinteger, ser_context
                        ret = (unsigned)Z_LVAL_P(zv);
                }
        } else {
-               zend_string *str;
+               zend_string *str, *tmp_str;
 
-               str = zval_get_string((zval *) zv);
+               str = zval_get_tmp_string((zval *) zv, &tmp_str);
 
 #if HAVE_IF_NAMETOINDEX
                ret = if_nametoindex(ZSTR_VAL(str));
@@ -1274,7 +1276,7 @@ static void from_zval_write_ifindex(const zval *zv, char *uinteger, ser_context
                                "name, an integer interface index must be supplied instead");
 #endif
 
-               zend_string_release(str);
+               zend_tmp_string_release(tmp_str);
        }
 
        if (!ctx->err.has_error) {
index 9857be398269d3647a34abeefd4ade0df2e40647..9a10fd81189b0b52b1cfd6154338b83d5c38f728 100644 (file)
@@ -100,9 +100,10 @@ static int php_get_if_index_from_zval(zval *val, unsigned *out)
                        ret = SUCCESS;
                }
        } else {
-               zend_string *str = zval_get_string(val);
+               zend_string *tmp_str;
+               zend_string *str = zval_get_tmp_string(val, &tmp_str);
                ret = php_string_to_if_index(ZSTR_VAL(str), out);
-               zend_string_release(str);
+               zend_tmp_string_release(tmp_str);
        }
 
        return ret;
@@ -127,18 +128,18 @@ static int php_get_address_from_array(const HashTable *ht, const char *key,
        php_socket *sock, php_sockaddr_storage *ss, socklen_t *ss_len)
 {
        zval *val;
-       zend_string *str;
+       zend_string *str, *tmp_str;
 
        if ((val = zend_hash_str_find(ht, key, strlen(key))) == NULL) {
                php_error_docref(NULL, E_WARNING, "no key \"%s\" passed in optval", key);
                return FAILURE;
        }
-       str = zval_get_string(val);
+       str = zval_get_tmp_string(val, &tmp_str);
        if (!php_set_inet46_addr(ss, ss_len, ZSTR_VAL(str), sock)) {
-               zend_string_release(str);
+               zend_tmp_string_release(tmp_str);
                return FAILURE;
        }
-       zend_string_release(str);
+       zend_tmp_string_release(tmp_str);
        return SUCCESS;
 }
 
index f40160d3bd482f6cb3b2a91a69f9fdb942dc0983..ce4c4d59396a0c0a16888678ed05808b50aeaac1 100644 (file)
@@ -498,13 +498,14 @@ static int php_array_natural_general_compare(const void *a, const void *b, int f
 {
        Bucket *f = (Bucket *) a;
        Bucket *s = (Bucket *) b;
-       zend_string *str1 = zval_get_string(&f->val);
-       zend_string *str2 = zval_get_string(&s->val);
+       zend_string *tmp_str1, *tmp_str2;
+       zend_string *str1 = zval_get_tmp_string(&f->val, &tmp_str1);
+       zend_string *str2 = zval_get_tmp_string(&s->val, &tmp_str2);
 
        int result = strnatcmp_ex(ZSTR_VAL(str1), ZSTR_LEN(str1), ZSTR_VAL(str2), ZSTR_LEN(str2), fold_case);
 
-       zend_string_release(str1);
-       zend_string_release(str2);
+       zend_tmp_string_release(tmp_str1);
+       zend_tmp_string_release(tmp_str2);
        return result;
 }
 /* }}} */
@@ -2713,9 +2714,10 @@ PHP_FUNCTION(array_fill_keys)
                if (Z_TYPE_P(entry) == IS_LONG) {
                        zend_hash_index_update(Z_ARRVAL_P(return_value), Z_LVAL_P(entry), val);
                } else {
-                       zend_string *key = zval_get_string(entry);
+                       zend_string *tmp_key;
+                       zend_string *key = zval_get_tmp_string(entry, &tmp_key);
                        zend_symtable_update(Z_ARRVAL_P(return_value), key, val);
-                       zend_string_release(key);
+                       zend_tmp_string_release(tmp_key);
                }
        } ZEND_HASH_FOREACH_END();
 }
@@ -4203,9 +4205,10 @@ PHP_FUNCTION(array_column)
                                } else if (Z_TYPE_P(zkeyval) == IS_LONG) {
                                        add_index_zval(return_value, Z_LVAL_P(zkeyval), zcolval);
                                } else if (Z_TYPE_P(zkeyval) == IS_OBJECT) {
-                                       zend_string *key = zval_get_string(zkeyval);
+                                       zend_string *tmp_key;
+                                       zend_string *key = zval_get_tmp_string(zkeyval, &tmp_key);
                                        zend_symtable_update(Z_ARRVAL_P(return_value), key, zcolval);
-                                       zend_string_release(key);
+                                       zend_tmp_string_release(tmp_key);
                                } else {
                                        add_next_index_zval(return_value, zcolval);
                                }
@@ -4483,9 +4486,10 @@ PHP_FUNCTION(array_unique)
                        if (Z_TYPE_P(val) == IS_STRING) {
                                retval = zend_hash_add_empty_element(&seen, Z_STR_P(val));
                        } else {
-                               zend_string *str_val = zval_get_string(val);
+                               zend_string *tmp_str_val;
+                               zend_string *str_val = zval_get_tmp_string(val, &tmp_str_val);
                                retval = zend_hash_add_empty_element(&seen, str_val);
-                               zend_string_release(str_val);
+                               zend_tmp_string_release(tmp_str_val);
                        }
 
                        if (retval) {
@@ -5367,7 +5371,7 @@ PHP_FUNCTION(array_diff)
        uint32_t num;
        HashTable exclude;
        zval *value;
-       zend_string *str, *key;
+       zend_string *str, *tmp_str, *key;
        zend_long idx;
        zval dummy;
 
@@ -5405,16 +5409,16 @@ PHP_FUNCTION(array_diff)
        zend_hash_init(&exclude, num, NULL, NULL, 0);
        for (i = 1; i < argc; i++) {
                ZEND_HASH_FOREACH_VAL_IND(Z_ARRVAL(args[i]), value) {
-                       str = zval_get_string(value);
+                       str = zval_get_tmp_string(value, &tmp_str);
                        zend_hash_add(&exclude, str, &dummy);
-                       zend_string_release(str);
+                       zend_tmp_string_release(tmp_str);
                } ZEND_HASH_FOREACH_END();
        }
 
        /* copy all elements of first array that are not in exclude set */
        array_init_size(return_value, zend_hash_num_elements(Z_ARRVAL(args[0])));
        ZEND_HASH_FOREACH_KEY_VAL_IND(Z_ARRVAL(args[0]), idx, key, value) {
-               str = zval_get_string(value);
+               str = zval_get_tmp_string(value, &tmp_str);
                if (!zend_hash_exists(&exclude, str)) {
                        if (key) {
                                value = zend_hash_add_new(Z_ARRVAL_P(return_value), key, value);
@@ -5423,7 +5427,7 @@ PHP_FUNCTION(array_diff)
                        }
                        zval_add_ref(value);
                }
-               zend_string_release(str);
+               zend_tmp_string_release(tmp_str);
        } ZEND_HASH_FOREACH_END();
 
        zend_hash_destroy(&exclude);
@@ -6316,10 +6320,11 @@ PHP_FUNCTION(array_combine)
                                        entry_values = zend_hash_index_update(Z_ARRVAL_P(return_value),
                                                Z_LVAL_P(entry_keys), entry_values);
                                } else {
-                                       zend_string *key = zval_get_string(entry_keys);
+                                       zend_string *tmp_key;
+                                       zend_string *key = zval_get_tmp_string(entry_keys, &tmp_key);
                                        entry_values = zend_symtable_update(Z_ARRVAL_P(return_value),
                                                key, entry_values);
-                                       zend_string_release(key);
+                                       zend_tmp_string_release(tmp_key);
                                }
                                zval_add_ref(entry_values);
                                pos_values++;
index 6b1dbbd2a11907357bb5011c7baa0dba1eec3b5d..a823ac9f819cdbc341cd4425ae53e3701cb28f35 100644 (file)
@@ -4336,11 +4336,12 @@ PHP_FUNCTION(getopt)
 
                /* Iterate over the hash to construct the argv array. */
                ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(args), entry) {
-                       zend_string *arg_str = zval_get_string(entry);
+                       zend_string *tmp_arg_str;
+                       zend_string *arg_str = zval_get_tmp_string(entry, &tmp_arg_str);
 
                        argv[pos++] = estrdup(ZSTR_VAL(arg_str));
 
-                       zend_string_release(arg_str);
+                       zend_tmp_string_release(tmp_arg_str);
                } ZEND_HASH_FOREACH_END();
 
                /* The C Standard requires argv[argc] to be NULL - this might
@@ -4369,7 +4370,8 @@ PHP_FUNCTION(getopt)
 
                /* Iterate over the hash to construct the argv array. */
                ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(p_longopts), entry) {
-                       zend_string *arg_str = zval_get_string(entry);
+                       zend_string *tmp_arg_str;
+                       zend_string *arg_str = zval_get_tmp_string(entry, &tmp_arg_str);
 
                        opts->need_param = 0;
                        opts->opt_name = estrdup(ZSTR_VAL(arg_str));
@@ -4385,7 +4387,7 @@ PHP_FUNCTION(getopt)
                        opts->opt_char = 0;
                        opts++;
 
-                       zend_string_release(arg_str);
+                       zend_tmp_string_release(tmp_arg_str);
                } ZEND_HASH_FOREACH_END();
        } else {
                opts = (opt_struct*) erealloc(opts, sizeof(opt_struct) * (len + 1));
index 5a2f9ccadc954e3e809657fa0b0d33c69b439394..ccd6cc03ba12ab2ecf121f200e30250eb2447cf4 100644 (file)
@@ -669,18 +669,19 @@ PHP_FUNCTION(file_put_contents)
                                zval *tmp;
 
                                ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(data), tmp) {
-                                       zend_string *str = zval_get_string(tmp);
+                                       zend_string *t;
+                                       zend_string *str = zval_get_tmp_string(tmp, &t);
                                        if (ZSTR_LEN(str)) {
                                                numbytes += ZSTR_LEN(str);
                                                bytes_written = php_stream_write(stream, ZSTR_VAL(str), ZSTR_LEN(str));
                                                if (bytes_written != ZSTR_LEN(str)) {
                                                        php_error_docref(NULL, E_WARNING, "Failed to write %zd bytes to %s", ZSTR_LEN(str), filename);
-                                                       zend_string_release(str);
+                                                       zend_tmp_string_release(t);
                                                        numbytes = -1;
                                                        break;
                                                }
                                        }
-                                       zend_string_release(str);
+                                       zend_tmp_string_release(t);
                                } ZEND_HASH_FOREACH_END();
                        }
                        break;
@@ -1936,7 +1937,8 @@ PHPAPI size_t php_fputcsv(php_stream *stream, zval *fields, char delimiter, char
 
        count = zend_hash_num_elements(Z_ARRVAL_P(fields));
        ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(fields), field_tmp) {
-               zend_string *field_str = zval_get_string(field_tmp);
+               zend_string *tmp_field_str;
+               zend_string *field_str = zval_get_tmp_string(field_tmp, &tmp_field_str);
 
                /* enclose a field that contains a delimiter, an enclosure character, or a newline */
                if (FPUTCSV_FLD_CHK(delimiter) ||
@@ -1971,7 +1973,7 @@ PHPAPI size_t php_fputcsv(php_stream *stream, zval *fields, char delimiter, char
                if (++i != count) {
                        smart_str_appendl(&csvline, &delimiter, 1);
                }
-               zend_string_release(field_str);
+               zend_tmp_string_release(tmp_field_str);
        } ZEND_HASH_FOREACH_END();
 
        smart_str_appendc(&csvline, '\n');
index ff955ae3303a5cb991de972c6e8dbe2c35180aee..afdf74380b0ce231df9409dc5ae10b6d55281e36 100644 (file)
@@ -1210,12 +1210,13 @@ static php_conv_err_t php_conv_get_string_prop_ex(const HashTable *ht, char **pr
        *pretval_len = 0;
 
        if ((tmpval = zend_hash_str_find((HashTable *)ht, field_name, field_name_len-1)) != NULL) {
-               zend_string *str = zval_get_string(tmpval);
+               zend_string *tmp;
+               zend_string *str = zval_get_tmp_string(tmpval, &tmp);
 
                *pretval = pemalloc(ZSTR_LEN(str) + 1, persistent);
                *pretval_len = ZSTR_LEN(str);
                memcpy(*pretval, ZSTR_VAL(str), ZSTR_LEN(str) + 1);
-               zend_string_release(str);
+               zend_tmp_string_release(tmp);
        } else {
                return PHP_CONV_ERR_NOT_FOUND;
        }
index 1d58947ab847b60e2b16a229677122eb976df1f9..596a98045e62f1d9e851fb4f142cb366c5d333ca 100644 (file)
@@ -564,14 +564,15 @@ php_formatted_print(zend_execute_data *execute_data, int use_array, int format_o
                        tmp = &args[argnum];
                        switch (format[inpos]) {
                                case 's': {
-                                       zend_string *str = zval_get_string(tmp);
+                                       zend_string *t;
+                                       zend_string *str = zval_get_tmp_string(tmp, &t);
                                        php_sprintf_appendstring(&result, &outpos,
                                                                                         ZSTR_VAL(str),
                                                                                         width, precision, padding,
                                                                                         alignment,
                                                                                         ZSTR_LEN(str),
                                                                                         0, expprec, 0);
-                                       zend_string_release(str);
+                                       zend_tmp_string_release(t);
                                        break;
                                }
 
index afbb77d1fa5b542b2f03dff0af3faabaaad9dbcb..f675db4ffc61f176b8934cff68e2d5da88f2c2b0 100644 (file)
@@ -204,14 +204,15 @@ PHPAPI int php_url_encode_hash_ex(HashTable *ht, smart_str *formstr,
                                default:
                                        {
                                                zend_string *ekey;
-                                               zend_string *tmp = zval_get_string(zdata);
+                                               zend_string *tmp;
+                                               zend_string *str= zval_get_tmp_string(zdata, &tmp);
                                                if (enc_type == PHP_QUERY_RFC3986) {
-                                                       ekey = php_raw_url_encode(ZSTR_VAL(tmp), ZSTR_LEN(tmp));
+                                                       ekey = php_raw_url_encode(ZSTR_VAL(str), ZSTR_LEN(str));
                                                } else {
-                                                       ekey = php_url_encode(ZSTR_VAL(tmp), ZSTR_LEN(tmp));
+                                                       ekey = php_url_encode(ZSTR_VAL(str), ZSTR_LEN(str));
                                                }
                                                smart_str_append(formstr, ekey);
-                                               zend_string_release(tmp);
+                                               zend_tmp_string_release(tmp);
                                                zend_string_free(ekey);
                                        }
                        }
index c9c118751bc483c6b6c0387f9ebac58b627d446d..86ff031dbb1cb0b55a35787d869d69a8dee44c59 100644 (file)
@@ -462,15 +462,15 @@ PHP_FUNCTION(pack)
                        case 'A':
                        case 'Z': {
                                size_t arg_cp = (code != 'Z') ? arg : MAX(0, arg - 1);
-
-                               zend_string *str = zval_get_string(&argv[currentarg++]);
+                               zend_string *tmp_str;
+                               zend_string *str = zval_get_tmp_string(&argv[currentarg++], &tmp_str);
 
                                memset(&ZSTR_VAL(output)[outputpos], (code == 'a' || code == 'Z') ? '\0' : ' ', arg);
                                memcpy(&ZSTR_VAL(output)[outputpos], ZSTR_VAL(str),
                                           (ZSTR_LEN(str) < arg_cp) ? ZSTR_LEN(str) : arg_cp);
 
                                outputpos += arg;
-                               zend_string_release(str);
+                               zend_tmp_string_release(tmp_str);
                                break;
                        }
 
@@ -478,8 +478,8 @@ PHP_FUNCTION(pack)
                        case 'H': {
                                int nibbleshift = (code == 'h') ? 0 : 4;
                                int first = 1;
-
-                               zend_string *str = zval_get_string(&argv[currentarg++]);
+                               zend_string *tmp_str;
+                               zend_string *str = zval_get_tmp_string(&argv[currentarg++], &tmp_str);
                                char *v = ZSTR_VAL(str);
 
                                outputpos--;
@@ -513,7 +513,7 @@ PHP_FUNCTION(pack)
                                }
 
                                outputpos++;
-                               zend_string_release(str);
+                               zend_tmp_string_release(tmp_str);
                                break;
                        }
 
index 55bcca14dbac85bdd1003b38a6dd5f028a974b83..f6c5ea67d17cdd6dde0c80afe507d18d9c2f0093 100644 (file)
@@ -1289,7 +1289,7 @@ PHPAPI void php_implode(const zend_string *glue, zval *pieces, zval *return_valu
 PHP_FUNCTION(implode)
 {
        zval *arg1, *arg2 = NULL, *pieces;
-       zend_string *glue;
+       zend_string *glue, *tmp_glue;
 
        ZEND_PARSE_PARAMETERS_START(1, 2)
                Z_PARAM_ZVAL(arg1)
@@ -1304,13 +1304,14 @@ PHP_FUNCTION(implode)
                }
 
                glue = ZSTR_EMPTY_ALLOC();
+               tmp_glue = NULL;
                pieces = arg1;
        } else {
                if (Z_TYPE_P(arg1) == IS_ARRAY) {
-                       glue = zval_get_string(arg2);
+                       glue = zval_get_tmp_string(arg2, &tmp_glue);
                        pieces = arg1;
                } else if (Z_TYPE_P(arg2) == IS_ARRAY) {
-                       glue = zval_get_string(arg1);
+                       glue = zval_get_tmp_string(arg1, &tmp_glue);
                        pieces = arg2;
                } else {
                        php_error_docref(NULL, E_WARNING, "Invalid arguments passed");
@@ -1319,7 +1320,7 @@ PHP_FUNCTION(implode)
        }
 
        php_implode(glue, pieces, return_value);
-       zend_string_release(glue);
+       zend_tmp_string_release(tmp_glue);
 }
 /* }}} */
 
@@ -2504,7 +2505,7 @@ PHP_FUNCTION(substr_replace)
        if (Z_TYPE_P(str) != IS_ARRAY) {
                if (Z_TYPE_P(from) != IS_ARRAY) {
                        zend_string *repl_str;
-                       zend_bool repl_release = 0;
+                       zend_string *tmp_repl_str = NULL;
                        f = Z_LVAL_P(from);
 
                        /* if "from" position is negative, count start position from the end
@@ -2545,8 +2546,7 @@ PHP_FUNCTION(substr_replace)
                                        repl_idx++;
                                }
                                if (repl_idx < Z_ARRVAL_P(repl)->nNumUsed) {
-                                       repl_str = zval_get_string(tmp_repl);
-                                       repl_release = 1;
+                                       repl_str = zval_get_tmp_string(tmp_repl, &tmp_repl_str);
                                } else {
                                        repl_str = STR_EMPTY_ALLOC();
                                }
@@ -2562,9 +2562,7 @@ PHP_FUNCTION(substr_replace)
                        }
                        memcpy((ZSTR_VAL(result) + f + ZSTR_LEN(repl_str)), Z_STRVAL_P(str) + f + l, Z_STRLEN_P(str) - f - l);
                        ZSTR_VAL(result)[ZSTR_LEN(result)] = '\0';
-                       if (repl_release) {
-                               zend_string_release(repl_str);
-                       }
+                       zend_tmp_string_release(tmp_repl_str);
                        RETURN_NEW_STR(result);
                } else {
                        php_error_docref(NULL, E_WARNING, "Functionality of 'start' and 'length' as arrays is not implemented");
@@ -2580,7 +2578,8 @@ PHP_FUNCTION(substr_replace)
                from_idx = len_idx = repl_idx = 0;
 
                ZEND_HASH_FOREACH_KEY_VAL(Z_ARRVAL_P(str), num_index, str_index, tmp_str) {
-                       zend_string *orig_str = zval_get_string(tmp_str);
+                       zend_string *tmp_orig_str;
+                       zend_string *orig_str = zval_get_tmp_string(tmp_str, &tmp_orig_str);
 
                        if (Z_TYPE_P(from) == IS_ARRAY) {
                                while (from_idx < Z_ARRVAL_P(from)->nNumUsed) {
@@ -2659,7 +2658,8 @@ PHP_FUNCTION(substr_replace)
                                        repl_idx++;
                                }
                                if (repl_idx < Z_ARRVAL_P(repl)->nNumUsed) {
-                                       zend_string *repl_str = zval_get_string(tmp_repl);
+                                       zend_string *tmp_repl_str;
+                                       zend_string *repl_str = zval_get_tmp_string(tmp_repl, &tmp_repl_str);
 
                                        result_len += ZSTR_LEN(repl_str);
                                        repl_idx++;
@@ -2668,7 +2668,7 @@ PHP_FUNCTION(substr_replace)
                                        memcpy(ZSTR_VAL(result), ZSTR_VAL(orig_str), f);
                                        memcpy((ZSTR_VAL(result) + f), ZSTR_VAL(repl_str), ZSTR_LEN(repl_str));
                                        memcpy((ZSTR_VAL(result) + f + ZSTR_LEN(repl_str)), ZSTR_VAL(orig_str) + f + l, ZSTR_LEN(orig_str) - f - l);
-                                       zend_string_release(repl_str);
+                                       zend_tmp_string_release(tmp_repl_str);
                                } else {
                                        result = zend_string_safe_alloc(1, result_len, 0, 0);
 
@@ -2696,7 +2696,7 @@ PHP_FUNCTION(substr_replace)
                                add_index_str(return_value, num_index, result);
                        }
 
-                       zend_string_release(orig_str);
+                       zend_tmp_string_release(tmp_orig_str);
                } ZEND_HASH_FOREACH_END();
        } /* if */
 }
@@ -3083,12 +3083,13 @@ static void php_strtr_array(zval *return_value, zend_string *input, HashTable *p
                                if ((num_bitset[len / sizeof(zend_ulong)] & (Z_UL(1) << (len % sizeof(zend_ulong))))) {
                                        entry = zend_hash_str_find(pats, key, len);
                                        if (entry != NULL) {
-                                               zend_string *s = zval_get_string(entry);
+                                               zend_string *tmp;
+                                               zend_string *s = zval_get_tmp_string(entry, &tmp);
                                                smart_str_appendl(&result, str + old_pos, pos - old_pos);
                                                smart_str_append(&result, s);
                                                old_pos = pos + len;
                                                pos = old_pos - 1;
-                                               zend_string_release(s);
+                                               zend_tmp_string_release(tmp);
                                                break;
                                        }
                                }
@@ -3466,7 +3467,7 @@ PHP_FUNCTION(strtr)
                        RETURN_STR_COPY(str);
                } else if (zend_hash_num_elements(pats) == 1) {
                        zend_long num_key;
-                       zend_string *str_key, *replace;
+                       zend_string *str_key, *replace, *tmp_replace;
                        zval *entry, tmp;
 
                        ZEND_HASH_FOREACH_KEY_VAL(pats, num_key, str_key, entry) {
@@ -3476,7 +3477,7 @@ PHP_FUNCTION(strtr)
                                        convert_to_string(&tmp);
                                        str_key = Z_STR(tmp);
                                }
-                               replace = zval_get_string(entry);
+                               replace = zval_get_tmp_string(entry, &tmp_replace);
                                if (ZSTR_LEN(str_key) < 1) {
                                        RETVAL_STR_COPY(str);
                                } else if (ZSTR_LEN(str_key) == 1) {
@@ -3492,7 +3493,7 @@ PHP_FUNCTION(strtr)
                                                                ZSTR_VAL(str_key), ZSTR_LEN(str_key),
                                                                ZSTR_VAL(replace), ZSTR_LEN(replace), &dummy));
                                }
-                               zend_string_release(replace);
+                               zend_tmp_string_release(tmp_replace);
                                zval_dtor(&tmp);
                                return;
                        } ZEND_HASH_FOREACH_END();
@@ -3945,7 +3946,9 @@ static zend_long php_str_replace_in_subject(zval *search, zval *replace, zval *s
        zval            *search_entry,
                                *replace_entry = NULL;
        zend_string     *tmp_result,
-                               *replace_entry_str = NULL;
+                   *tmp_subject_str,
+                   *tmp_replace_entry_str = NULL,
+                               *replace_entry_str;
        char            *replace_value = NULL;
        size_t           replace_len = 0;
        zend_long        replace_count = 0;
@@ -3954,9 +3957,9 @@ static zend_long php_str_replace_in_subject(zval *search, zval *replace, zval *s
        uint32_t     replace_idx;
 
        /* Make sure we're dealing with strings. */
-       subject_str = zval_get_string(subject);
+       subject_str = zval_get_tmp_string(subject, &tmp_subject_str);
        if (ZSTR_LEN(subject_str) == 0) {
-               zend_string_release(subject_str);
+               zend_tmp_string_release(tmp_subject_str);
                ZVAL_EMPTY_STRING(result);
                return 0;
        }
@@ -3977,12 +3980,14 @@ static zend_long php_str_replace_in_subject(zval *search, zval *replace, zval *s
                /* For each entry in the search array, get the entry */
                ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(search), search_entry) {
                        /* Make sure we're dealing with strings. */
-                       zend_string *search_str = zval_get_string(search_entry);
+                       zend_string *tmp_search_str;
+                       zend_string *search_str = zval_get_tmp_string(search_entry, &tmp_search_str);
+
                        if (ZSTR_LEN(search_str) == 0) {
                                if (Z_TYPE_P(replace) == IS_ARRAY) {
                                        replace_idx++;
                                }
-                               zend_string_release(search_str);
+                               zend_tmp_string_release(tmp_search_str);
                                continue;
                        }
 
@@ -3998,7 +4003,7 @@ static zend_long php_str_replace_in_subject(zval *search, zval *replace, zval *s
                                }
                                if (replace_idx < Z_ARRVAL_P(replace)->nNumUsed) {
                                        /* Make sure we're dealing with strings. */
-                                       replace_entry_str = zval_get_string(replace_entry);
+                                       replace_entry_str = zval_get_tmp_string(replace_entry, &tmp_replace_entry_str);
 
                                        /* Set replacement value to the one we got from array */
                                        replace_value = ZSTR_VAL(replace_entry_str);
@@ -4045,11 +4050,11 @@ static zend_long php_str_replace_in_subject(zval *search, zval *replace, zval *s
                                }
                        }
 
-                       zend_string_release(search_str);
+                       zend_tmp_string_release(tmp_search_str);
 
-                       if (replace_entry_str) {
-                               zend_string_release(replace_entry_str);
-                               replace_entry_str = NULL;
+                       if (tmp_replace_entry_str) {
+                               zend_string_release(tmp_replace_entry_str);
+                               tmp_replace_entry_str = NULL;
                        }
                        zend_string_release(Z_STR_P(result));
                        ZVAL_STR(result, tmp_result);
@@ -4058,7 +4063,7 @@ static zend_long php_str_replace_in_subject(zval *search, zval *replace, zval *s
                                if (lc_subject_str) {
                                        zend_string_release(lc_subject_str);
                                }
-                               zend_string_release(subject_str);
+                               zend_tmp_string_release(tmp_subject_str);
                                return replace_count;
                        }
                } ZEND_HASH_FOREACH_END();
@@ -4091,7 +4096,7 @@ static zend_long php_str_replace_in_subject(zval *search, zval *replace, zval *s
                        ZVAL_STR_COPY(result, subject_str);
                }
        }
-       zend_string_release(subject_str);
+       zend_tmp_string_release(tmp_subject_str);
        return replace_count;
 }
 /* }}} */
@@ -4479,7 +4484,7 @@ PHP_FUNCTION(setlocale)
 {
        zval *args = NULL;
        zval *plocale;
-       zend_string *loc;
+       zend_string *loc, *tmp_loc;
        char *retval;
        zend_long cat;
        int num_args, i = 0;
@@ -4508,15 +4513,15 @@ PHP_FUNCTION(setlocale)
                        plocale = &args[i];
                }
 
-               loc = zval_get_string(plocale);
+               loc = zval_get_tmp_string(plocale, &tmp_loc);
 
                if (!strcmp("0", ZSTR_VAL(loc))) {
-                       zend_string_release(loc);
-                       loc = NULL;
+                       zend_tmp_string_release(tmp_loc);
+                       tmp_loc = loc = NULL;
                } else {
                        if (ZSTR_LEN(loc) >= 255) {
                                php_error_docref(NULL, E_WARNING, "Specified locale name is too long");
-                               zend_string_release(loc);
+                               zend_tmp_string_release(tmp_loc);
                                break;
                        }
                }
@@ -4538,19 +4543,17 @@ PHP_FUNCTION(setlocale)
                                                RETURN_STR(BG(locale_string));
                                        } else {
                                                BG(locale_string) = zend_string_init(retval, len, 0);
-                                               zend_string_release(loc);
+                                               zend_tmp_string_release(tmp_loc);
                                                RETURN_STR_COPY(BG(locale_string));
                                        }
                                } else if (len == ZSTR_LEN(loc) && !memcmp(ZSTR_VAL(loc), retval, len)) {
                                        RETURN_STR(loc);
                                }
-                               zend_string_release(loc);
+                               zend_tmp_string_release(tmp_loc);
                        }
                        RETURN_STRING(retval);
                }
-               if (loc) {
-                       zend_string_release(loc);
-               }
+               zend_tmp_string_release(tmp_loc);
 
                if (Z_TYPE(args[0]) == IS_ARRAY) {
                        idx++;
@@ -5141,13 +5144,14 @@ static void php_strnatcmp(INTERNAL_FUNCTION_PARAMETERS, int fold_case)
 
 PHPAPI int string_natural_compare_function_ex(zval *result, zval *op1, zval *op2, zend_bool case_insensitive) /* {{{ */
 {
-       zend_string *str1 = zval_get_string(op1);
-       zend_string *str2 = zval_get_string(op2);
+       zend_string *tmp_str1, *tmp_str2;
+       zend_string *str1 = zval_get_tmp_string(op1, &tmp_str1);
+       zend_string *str2 = zval_get_tmp_string(op2, &tmp_str2);
 
        ZVAL_LONG(result, strnatcmp_ex(ZSTR_VAL(str1), ZSTR_LEN(str1), ZSTR_VAL(str2), ZSTR_LEN(str2), case_insensitive));
 
-       zend_string_release(str1);
-       zend_string_release(str2);
+       zend_tmp_string_release(tmp_str1);
+       zend_tmp_string_release(tmp_str2);
        return SUCCESS;
 }
 /* }}} */
index 3f5d2ffe402e26cd1d561c2247414b3f528553f6..88c06608b40bea8d5212021dfa42493e1e5a4787 100644 (file)
@@ -705,7 +705,7 @@ static int php_var_serialize_call_sleep(zval *retval, zval *struc) /* {{{ */
 static void php_var_serialize_collect_names(HashTable *ht, HashTable *src) /* {{{ */
 {
        zval *val;
-       zend_string *name;
+       zend_string *name, *tmp_name;
 
        zend_hash_init(ht, zend_hash_num_elements(src), NULL, NULL, 0);
        ZEND_HASH_FOREACH_VAL(src, val) {
@@ -714,7 +714,7 @@ static void php_var_serialize_collect_names(HashTable *ht, HashTable *src) /* {{
                                        "__sleep should return an array only containing the names of instance-variables to serialize.");
                }
 
-               name = zval_get_string(val);
+               name = zval_get_tmp_string(val, &tmp_name);
                if (zend_hash_exists(ht, name)) {
                        php_error_docref(NULL, E_NOTICE,
                                        "\"%s\" is returned from __sleep multiple times", ZSTR_VAL(name));
@@ -722,7 +722,7 @@ static void php_var_serialize_collect_names(HashTable *ht, HashTable *src) /* {{
                        continue;
                }
                zend_hash_add_empty_element(ht, name);
-               zend_string_release(name);
+               zend_tmp_string_release(tmp_name);
        } ZEND_HASH_FOREACH_END();
 }
 /* }}} */
index 3b69d999df9ee0c63de516a4fd315a54a87c4a88..6dce13346e45c1ed020fb2d0e2074a7a85d2b2f0 100644 (file)
@@ -421,7 +421,7 @@ static void php_wddx_serialize_string(wddx_packet *packet, zval *var)
 static void php_wddx_serialize_number(wddx_packet *packet, zval *var)
 {
        char tmp_buf[WDDX_BUF_LEN], *dec_point;
-       zend_string *str = zval_get_string(var);
+       zend_string *str = zval_get_string_func(var);
        snprintf(tmp_buf, sizeof(tmp_buf), WDDX_NUMBER, ZSTR_VAL(str));
        zend_string_release(str);