summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2017-11-16 17:09:32 +0300
committerDmitry Stogov <dmitry@zend.com>2017-11-16 17:09:32 +0300
commitccc12b82da5dd10b44ab067b68b762298a9eb4eb (patch)
tree9b17d9d3f99f518fe44532c55ac255c3e0134a13
parentce18738a30b3d7f20b392c9167aa251c009a0c21 (diff)
downloadphp-git-ccc12b82da5dd10b44ab067b68b762298a9eb4eb.tar.gz
Avoid unnecessary reference-counting on strings.
-rw-r--r--Zend/zend.c10
-rw-r--r--Zend/zend_closures.c5
-rw-r--r--Zend/zend_execute.c14
-rw-r--r--Zend/zend_inheritance.c5
-rw-r--r--Zend/zend_ini_parser.y7
-rw-r--r--Zend/zend_object_handlers.c16
-rw-r--r--Zend/zend_operators.c36
-rw-r--r--Zend/zend_operators.h14
-rw-r--r--Zend/zend_vm_def.h96
-rw-r--r--Zend/zend_vm_execute.h582
-rw-r--r--ext/curl/interface.c49
-rw-r--r--ext/date/php_date.c5
-rw-r--r--ext/pcre/php_pcre.c30
-rw-r--r--ext/reflection/php_reflection.c15
-rw-r--r--ext/session/session.c5
-rw-r--r--ext/simplexml/simplexml.c8
-rw-r--r--ext/soap/php_encoding.c10
-rw-r--r--ext/sockets/conversions.c32
-rw-r--r--ext/sockets/multicast.c13
-rw-r--r--ext/standard/array.c39
-rw-r--r--ext/standard/basic_functions.c10
-rw-r--r--ext/standard/file.c12
-rw-r--r--ext/standard/filters.c5
-rw-r--r--ext/standard/formatted_print.c5
-rw-r--r--ext/standard/http.c9
-rw-r--r--ext/standard/pack.c12
-rw-r--r--ext/standard/string.c94
-rw-r--r--ext/standard/var.c6
-rw-r--r--ext/wddx/wddx.c2
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);