diff options
Diffstat (limited to 'Zend/zend_vm_def.h')
-rw-r--r-- | Zend/zend_vm_def.h | 96 |
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(); |