diff options
Diffstat (limited to 'Zend/zend_vm_def.h')
| -rw-r--r-- | Zend/zend_vm_def.h | 57 |
1 files changed, 35 insertions, 22 deletions
diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 6049f658f0..9d4a1f92b6 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -1069,30 +1069,16 @@ ZEND_VM_HELPER_EX(zend_fetch_var_address_helper, CONST|TMP|VAR|CV, UNUSED|CONST| case BP_VAR_RW: zend_error(E_NOTICE,"Undefined variable: %s", Z_STRVAL_P(varname)); /* break missing intentionally */ - case BP_VAR_W: - retval = zend_hash_update(target_symbol_table, Z_STR_P(varname), &EG(uninitialized_zval)); + case BP_VAR_W: { + zval zv; + ZVAL_COPY_VALUE(EX_VAR(opline->result.var), &EG(uninitialized_zval)); + ZVAL_INDIRECT(&zv, EX_VAR(opline->result.var)); + zend_hash_update(target_symbol_table, Z_STR_P(varname), &zv); + } break; EMPTY_SWITCH_DEFAULT_CASE() } } - switch (opline->extended_value & ZEND_FETCH_TYPE_MASK) { - case ZEND_FETCH_GLOBAL: - if (OP1_TYPE != IS_TMP_VAR) { - FREE_OP1(); - } - break; - case ZEND_FETCH_LOCAL: - FREE_OP1(); - break; - case ZEND_FETCH_STATIC: - zval_update_constant(retval, (void*) 1 TSRMLS_CC); - break; - case ZEND_FETCH_GLOBAL_LOCK: - if (OP1_TYPE == IS_VAR && !OP1_FREE) { - Z_ADDREF_P(EX_VAR(opline->op1.var)); - } - break; - } } @@ -1100,11 +1086,35 @@ ZEND_VM_HELPER_EX(zend_fetch_var_address_helper, CONST|TMP|VAR|CV, UNUSED|CONST| zval_dtor(&tmp_varname); } - if (opline->extended_value & ZEND_FETCH_MAKE_REF) { - SEPARATE_ZVAL_TO_MAKE_IS_REF(retval); + if (retval && UNEXPECTED(Z_TYPE_P(retval) == IS_INDIRECT)) { + retval = Z_INDIRECT_P(retval); + } + + switch (opline->extended_value & ZEND_FETCH_TYPE_MASK) { + case ZEND_FETCH_GLOBAL: + if (OP1_TYPE != IS_TMP_VAR) { + FREE_OP1(); + } + break; + case ZEND_FETCH_LOCAL: + FREE_OP1(); + break; + case ZEND_FETCH_STATIC: + if (retval) { + zval_update_constant(retval, (void*) 1 TSRMLS_CC); + } + break; + case ZEND_FETCH_GLOBAL_LOCK: + if (OP1_TYPE == IS_VAR && !OP1_FREE) { + Z_ADDREF_P(EX_VAR(opline->op1.var)); + } + break; } if (EXPECTED(retval != NULL)) { + if (opline->extended_value & ZEND_FETCH_MAKE_REF) { + SEPARATE_ZVAL_TO_MAKE_IS_REF(retval); + } if (Z_REFCOUNTED_P(retval)) Z_ADDREF_P(retval); switch (type) { case BP_VAR_R: @@ -4620,6 +4630,9 @@ ZEND_VM_HANDLER(114, ZEND_ISSET_ISEMPTY_VAR, CONST|TMP|VAR|CV, UNUSED|CONST|VAR) if ((value = zend_hash_find(target_symbol_table, Z_STR_P(varname))) == NULL) { isset = 0; } + if (UNEXPECTED(Z_TYPE_P(value) == IS_INDIRECT)) { + value = Z_INDIRECT_P(value); + } } if (OP1_TYPE != IS_CONST && varname == &tmp) { |
