summaryrefslogtreecommitdiff
path: root/Zend/zend_vm_def.h
diff options
context:
space:
mode:
Diffstat (limited to 'Zend/zend_vm_def.h')
-rw-r--r--Zend/zend_vm_def.h96
1 files changed, 53 insertions, 43 deletions
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();