diff options
author | Dmitry Stogov <dmitry@zend.com> | 2017-11-16 17:09:32 +0300 |
---|---|---|
committer | Dmitry Stogov <dmitry@zend.com> | 2017-11-16 17:09:32 +0300 |
commit | ccc12b82da5dd10b44ab067b68b762298a9eb4eb (patch) | |
tree | 9b17d9d3f99f518fe44532c55ac255c3e0134a13 | |
parent | ce18738a30b3d7f20b392c9167aa251c009a0c21 (diff) | |
download | php-git-ccc12b82da5dd10b44ab067b68b762298a9eb4eb.tar.gz |
Avoid unnecessary reference-counting on strings.
-rw-r--r-- | Zend/zend.c | 10 | ||||
-rw-r--r-- | Zend/zend_closures.c | 5 | ||||
-rw-r--r-- | Zend/zend_execute.c | 14 | ||||
-rw-r--r-- | Zend/zend_inheritance.c | 5 | ||||
-rw-r--r-- | Zend/zend_ini_parser.y | 7 | ||||
-rw-r--r-- | Zend/zend_object_handlers.c | 16 | ||||
-rw-r--r-- | Zend/zend_operators.c | 36 | ||||
-rw-r--r-- | Zend/zend_operators.h | 14 | ||||
-rw-r--r-- | Zend/zend_vm_def.h | 96 | ||||
-rw-r--r-- | Zend/zend_vm_execute.h | 582 | ||||
-rw-r--r-- | ext/curl/interface.c | 49 | ||||
-rw-r--r-- | ext/date/php_date.c | 5 | ||||
-rw-r--r-- | ext/pcre/php_pcre.c | 30 | ||||
-rw-r--r-- | ext/reflection/php_reflection.c | 15 | ||||
-rw-r--r-- | ext/session/session.c | 5 | ||||
-rw-r--r-- | ext/simplexml/simplexml.c | 8 | ||||
-rw-r--r-- | ext/soap/php_encoding.c | 10 | ||||
-rw-r--r-- | ext/sockets/conversions.c | 32 | ||||
-rw-r--r-- | ext/sockets/multicast.c | 13 | ||||
-rw-r--r-- | ext/standard/array.c | 39 | ||||
-rw-r--r-- | ext/standard/basic_functions.c | 10 | ||||
-rw-r--r-- | ext/standard/file.c | 12 | ||||
-rw-r--r-- | ext/standard/filters.c | 5 | ||||
-rw-r--r-- | ext/standard/formatted_print.c | 5 | ||||
-rw-r--r-- | ext/standard/http.c | 9 | ||||
-rw-r--r-- | ext/standard/pack.c | 12 | ||||
-rw-r--r-- | ext/standard/string.c | 94 | ||||
-rw-r--r-- | ext/standard/var.c | 6 | ||||
-rw-r--r-- | ext/wddx/wddx.c | 2 |
29 files changed, 636 insertions, 510 deletions
diff --git a/Zend/zend.c b/Zend/zend.c index 290807e67a..70def493cd 100644 --- a/Zend/zend.c +++ b/Zend/zend.c @@ -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); } diff --git a/Zend/zend_closures.c b/Zend/zend_closures.c index ee7b38224e..5aee27b02f 100644 --- a/Zend/zend_closures.c +++ b/Zend/zend_closures.c @@ -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; diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index f44537b818..959c36a5b3 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -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)) { diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c index b9794b0d62..288f9d1670 100644 --- a/Zend/zend_inheritance.c +++ b/Zend/zend_inheritance.c @@ -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 { diff --git a/Zend/zend_ini_parser.y b/Zend/zend_ini_parser.y index 82997e7f02..afca5538de 100644 --- a/Zend/zend_ini_parser.y +++ b/Zend/zend_ini_parser.y @@ -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); diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index 37336cd214..6764e1f3e3 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -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; } /* }}} */ diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c index dcbe40f92c..f3d78c19bc 100644 --- a/Zend/zend_operators.c +++ b/Zend/zend_operators.c @@ -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; } /* }}} */ diff --git a/Zend/zend_operators.h b/Zend/zend_operators.h index 9ded26db9b..9d9e2055a5 100644 --- a/Zend/zend_operators.h +++ b/Zend/zend_operators.h @@ -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) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 3277a79617..7e557e4c9e 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -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(); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 460c21466d..9cf533c814 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -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); diff --git a/ext/curl/interface.c b/ext/curl/interface.c index fa30e45e04..87295122a2 100644 --- a/ext/curl/interface.c +++ b/ext/curl/interface.c @@ -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; } diff --git a/ext/date/php_date.c b/ext/date/php_date.c index e6e7ef1c5b..000199ca81 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -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; \ } \ diff --git a/ext/pcre/php_pcre.c b/ext/pcre/php_pcre.c index 5386077f8c..82c0323f1c 100644 --- a/ext/pcre/php_pcre.c +++ b/ext/pcre/php_pcre.c @@ -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)) { diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index 4291883ce9..749c7e7656 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -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); } diff --git a/ext/session/session.c b/ext/session/session.c index bfd1c9b566..3fa1b7a026 100644 --- a/ext/session/session.c +++ b/ext/session/session.c @@ -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: diff --git a/ext/simplexml/simplexml.c b/ext/simplexml/simplexml.c index 748c5c5453..a3defee4db 100644 --- a/ext/simplexml/simplexml.c +++ b/ext/simplexml/simplexml.c @@ -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; } diff --git a/ext/soap/php_encoding.c b/ext/soap/php_encoding.c index 057a367655..1096636a4f 100644 --- a/ext/soap/php_encoding.c +++ b/ext/soap/php_encoding.c @@ -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); } diff --git a/ext/sockets/conversions.c b/ext/sockets/conversions.c index 4a1705bcee..196649d553 100644 --- a/ext/sockets/conversions.c +++ b/ext/sockets/conversions.c @@ -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) { diff --git a/ext/sockets/multicast.c b/ext/sockets/multicast.c index 9857be3982..9a10fd8118 100644 --- a/ext/sockets/multicast.c +++ b/ext/sockets/multicast.c @@ -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; } diff --git a/ext/standard/array.c b/ext/standard/array.c index f40160d3bd..ce4c4d5939 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -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++; diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c index 6b1dbbd2a1..a823ac9f81 100644 --- a/ext/standard/basic_functions.c +++ b/ext/standard/basic_functions.c @@ -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)); diff --git a/ext/standard/file.c b/ext/standard/file.c index 5a2f9ccadc..ccd6cc03ba 100644 --- a/ext/standard/file.c +++ b/ext/standard/file.c @@ -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'); diff --git a/ext/standard/filters.c b/ext/standard/filters.c index ff955ae330..afdf74380b 100644 --- a/ext/standard/filters.c +++ b/ext/standard/filters.c @@ -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; } diff --git a/ext/standard/formatted_print.c b/ext/standard/formatted_print.c index 1d58947ab8..596a98045e 100644 --- a/ext/standard/formatted_print.c +++ b/ext/standard/formatted_print.c @@ -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; } diff --git a/ext/standard/http.c b/ext/standard/http.c index afbb77d1fa..f675db4ffc 100644 --- a/ext/standard/http.c +++ b/ext/standard/http.c @@ -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); } } diff --git a/ext/standard/pack.c b/ext/standard/pack.c index c9c118751b..86ff031dbb 100644 --- a/ext/standard/pack.c +++ b/ext/standard/pack.c @@ -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; } diff --git a/ext/standard/string.c b/ext/standard/string.c index 55bcca14db..f6c5ea67d1 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -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; } /* }}} */ diff --git a/ext/standard/var.c b/ext/standard/var.c index 3f5d2ffe40..88c06608b4 100644 --- a/ext/standard/var.c +++ b/ext/standard/var.c @@ -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(); } /* }}} */ diff --git a/ext/wddx/wddx.c b/ext/wddx/wddx.c index 3b69d999df..6dce13346e 100644 --- a/ext/wddx/wddx.c +++ b/ext/wddx/wddx.c @@ -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); |