zval tmp, *varname;
HashTable *target_symbol_table;
- zend_bool tmp_is_dup = 0;
SAVE_OPLINE();
if (IS_CONST == IS_CV &&
IS_CONST == IS_UNUSED &&
(opline->extended_value & ZEND_QUICK_SET)) {
- ZVAL_COPY_VALUE(&tmp, EX_VAR(opline->op1.var));
- ZVAL_UNDEF(EX_VAR(opline->op1.var));
- zval_ptr_dtor(&tmp);
+ zval *var = EX_VAR(opline->op1.var);
+
+ if (Z_REFCOUNTED_P(var)) {
+ zend_refcounted *garbage = Z_COUNTED_P(var);
+
+ if (!--GC_REFCOUNT(garbage)) {
+ ZVAL_UNDEF(var);
+ _zval_dtor_func_for_ptr(garbage ZEND_FILE_LINE_CC);
+ } else {
+ GC_ZVAL_CHECK_POSSIBLE_ROOT(var);
+ ZVAL_UNDEF(var);
+ }
+ } else {
+ ZVAL_UNDEF(var);
+ }
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
varname = opline->op1.zv;
+ ZVAL_UNDEF(&tmp);
if (IS_CONST != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
ZVAL_DUP(&tmp, varname);
convert_to_string(&tmp);
varname = &tmp;
- tmp_is_dup = 1;
- } else if (IS_CONST == IS_VAR || IS_CONST == IS_CV) {
- ZVAL_COPY(&tmp, varname);
- varname = &tmp;
}
if (IS_CONST != IS_UNUSED) {
} else {
ce = zend_fetch_class_by_name(Z_STR_P(opline->op2.zv), opline->op2.zv + 1, 0 TSRMLS_CC);
if (UNEXPECTED(EG(exception) != NULL)) {
- if (IS_CONST != IS_CONST && tmp_is_dup) {
+ if (IS_CONST != IS_CONST) {
zval_dtor(&tmp);
- } else if (IS_CONST == IS_VAR || IS_CONST == IS_CV) {
- zval_ptr_dtor(&tmp);
}
HANDLE_EXCEPTION();
zend_hash_del_ind(target_symbol_table, Z_STR_P(varname));
}
- if (IS_CONST != IS_CONST && tmp_is_dup) {
+ if (IS_CONST != IS_CONST) {
zval_dtor(&tmp);
- } else if (IS_CONST == IS_VAR || IS_CONST == IS_CV) {
- zval_ptr_dtor(&tmp);
}
CHECK_EXCEPTION();
zval tmp, *varname;
HashTable *target_symbol_table;
- zend_bool tmp_is_dup = 0;
SAVE_OPLINE();
if (IS_CONST == IS_CV &&
IS_VAR == IS_UNUSED &&
(opline->extended_value & ZEND_QUICK_SET)) {
- ZVAL_COPY_VALUE(&tmp, EX_VAR(opline->op1.var));
- ZVAL_UNDEF(EX_VAR(opline->op1.var));
- zval_ptr_dtor(&tmp);
+ zval *var = EX_VAR(opline->op1.var);
+
+ if (Z_REFCOUNTED_P(var)) {
+ zend_refcounted *garbage = Z_COUNTED_P(var);
+
+ if (!--GC_REFCOUNT(garbage)) {
+ ZVAL_UNDEF(var);
+ _zval_dtor_func_for_ptr(garbage ZEND_FILE_LINE_CC);
+ } else {
+ GC_ZVAL_CHECK_POSSIBLE_ROOT(var);
+ ZVAL_UNDEF(var);
+ }
+ } else {
+ ZVAL_UNDEF(var);
+ }
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
varname = opline->op1.zv;
+ ZVAL_UNDEF(&tmp);
if (IS_CONST != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
ZVAL_DUP(&tmp, varname);
convert_to_string(&tmp);
varname = &tmp;
- tmp_is_dup = 1;
- } else if (IS_CONST == IS_VAR || IS_CONST == IS_CV) {
- ZVAL_COPY(&tmp, varname);
- varname = &tmp;
}
if (IS_VAR != IS_UNUSED) {
} else {
ce = zend_fetch_class_by_name(Z_STR_P(opline->op2.zv), opline->op2.zv + 1, 0 TSRMLS_CC);
if (UNEXPECTED(EG(exception) != NULL)) {
- if (IS_CONST != IS_CONST && tmp_is_dup) {
+ if (IS_CONST != IS_CONST) {
zval_dtor(&tmp);
- } else if (IS_CONST == IS_VAR || IS_CONST == IS_CV) {
- zval_ptr_dtor(&tmp);
}
HANDLE_EXCEPTION();
zend_hash_del_ind(target_symbol_table, Z_STR_P(varname));
}
- if (IS_CONST != IS_CONST && tmp_is_dup) {
+ if (IS_CONST != IS_CONST) {
zval_dtor(&tmp);
- } else if (IS_CONST == IS_VAR || IS_CONST == IS_CV) {
- zval_ptr_dtor(&tmp);
}
CHECK_EXCEPTION();
zval tmp, *varname;
HashTable *target_symbol_table;
- zend_bool tmp_is_dup = 0;
SAVE_OPLINE();
if (IS_CONST == IS_CV &&
IS_UNUSED == IS_UNUSED &&
(opline->extended_value & ZEND_QUICK_SET)) {
- ZVAL_COPY_VALUE(&tmp, EX_VAR(opline->op1.var));
- ZVAL_UNDEF(EX_VAR(opline->op1.var));
- zval_ptr_dtor(&tmp);
+ zval *var = EX_VAR(opline->op1.var);
+
+ if (Z_REFCOUNTED_P(var)) {
+ zend_refcounted *garbage = Z_COUNTED_P(var);
+
+ if (!--GC_REFCOUNT(garbage)) {
+ ZVAL_UNDEF(var);
+ _zval_dtor_func_for_ptr(garbage ZEND_FILE_LINE_CC);
+ } else {
+ GC_ZVAL_CHECK_POSSIBLE_ROOT(var);
+ ZVAL_UNDEF(var);
+ }
+ } else {
+ ZVAL_UNDEF(var);
+ }
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
varname = opline->op1.zv;
+ ZVAL_UNDEF(&tmp);
if (IS_CONST != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
ZVAL_DUP(&tmp, varname);
convert_to_string(&tmp);
varname = &tmp;
- tmp_is_dup = 1;
- } else if (IS_CONST == IS_VAR || IS_CONST == IS_CV) {
- ZVAL_COPY(&tmp, varname);
- varname = &tmp;
}
if (IS_UNUSED != IS_UNUSED) {
} else {
ce = zend_fetch_class_by_name(Z_STR_P(opline->op2.zv), opline->op2.zv + 1, 0 TSRMLS_CC);
if (UNEXPECTED(EG(exception) != NULL)) {
- if (IS_CONST != IS_CONST && tmp_is_dup) {
+ if (IS_CONST != IS_CONST) {
zval_dtor(&tmp);
- } else if (IS_CONST == IS_VAR || IS_CONST == IS_CV) {
- zval_ptr_dtor(&tmp);
}
HANDLE_EXCEPTION();
zend_hash_del_ind(target_symbol_table, Z_STR_P(varname));
}
- if (IS_CONST != IS_CONST && tmp_is_dup) {
+ if (IS_CONST != IS_CONST) {
zval_dtor(&tmp);
- } else if (IS_CONST == IS_VAR || IS_CONST == IS_CV) {
- zval_ptr_dtor(&tmp);
}
CHECK_EXCEPTION();
zval tmp, *varname;
HashTable *target_symbol_table;
zend_free_op free_op1;
- zend_bool tmp_is_dup = 0;
SAVE_OPLINE();
if (IS_TMP_VAR == IS_CV &&
IS_CONST == IS_UNUSED &&
(opline->extended_value & ZEND_QUICK_SET)) {
- ZVAL_COPY_VALUE(&tmp, EX_VAR(opline->op1.var));
- ZVAL_UNDEF(EX_VAR(opline->op1.var));
- zval_ptr_dtor(&tmp);
+ zval *var = EX_VAR(opline->op1.var);
+
+ if (Z_REFCOUNTED_P(var)) {
+ zend_refcounted *garbage = Z_COUNTED_P(var);
+
+ if (!--GC_REFCOUNT(garbage)) {
+ ZVAL_UNDEF(var);
+ _zval_dtor_func_for_ptr(garbage ZEND_FILE_LINE_CC);
+ } else {
+ GC_ZVAL_CHECK_POSSIBLE_ROOT(var);
+ ZVAL_UNDEF(var);
+ }
+ } else {
+ ZVAL_UNDEF(var);
+ }
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
varname = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
+ ZVAL_UNDEF(&tmp);
if (IS_TMP_VAR != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
ZVAL_DUP(&tmp, varname);
convert_to_string(&tmp);
varname = &tmp;
- tmp_is_dup = 1;
- } else if (IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) {
- ZVAL_COPY(&tmp, varname);
- varname = &tmp;
}
if (IS_CONST != IS_UNUSED) {
} else {
ce = zend_fetch_class_by_name(Z_STR_P(opline->op2.zv), opline->op2.zv + 1, 0 TSRMLS_CC);
if (UNEXPECTED(EG(exception) != NULL)) {
- if (IS_TMP_VAR != IS_CONST && tmp_is_dup) {
+ if (IS_TMP_VAR != IS_CONST) {
zval_dtor(&tmp);
- } else if (IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) {
- zval_ptr_dtor(&tmp);
}
zval_dtor(free_op1.var);
HANDLE_EXCEPTION();
zend_hash_del_ind(target_symbol_table, Z_STR_P(varname));
}
- if (IS_TMP_VAR != IS_CONST && tmp_is_dup) {
+ if (IS_TMP_VAR != IS_CONST) {
zval_dtor(&tmp);
- } else if (IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) {
- zval_ptr_dtor(&tmp);
}
zval_dtor(free_op1.var);
CHECK_EXCEPTION();
zval tmp, *varname;
HashTable *target_symbol_table;
zend_free_op free_op1;
- zend_bool tmp_is_dup = 0;
SAVE_OPLINE();
if (IS_TMP_VAR == IS_CV &&
IS_VAR == IS_UNUSED &&
(opline->extended_value & ZEND_QUICK_SET)) {
- ZVAL_COPY_VALUE(&tmp, EX_VAR(opline->op1.var));
- ZVAL_UNDEF(EX_VAR(opline->op1.var));
- zval_ptr_dtor(&tmp);
+ zval *var = EX_VAR(opline->op1.var);
+
+ if (Z_REFCOUNTED_P(var)) {
+ zend_refcounted *garbage = Z_COUNTED_P(var);
+
+ if (!--GC_REFCOUNT(garbage)) {
+ ZVAL_UNDEF(var);
+ _zval_dtor_func_for_ptr(garbage ZEND_FILE_LINE_CC);
+ } else {
+ GC_ZVAL_CHECK_POSSIBLE_ROOT(var);
+ ZVAL_UNDEF(var);
+ }
+ } else {
+ ZVAL_UNDEF(var);
+ }
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
varname = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
+ ZVAL_UNDEF(&tmp);
if (IS_TMP_VAR != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
ZVAL_DUP(&tmp, varname);
convert_to_string(&tmp);
varname = &tmp;
- tmp_is_dup = 1;
- } else if (IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) {
- ZVAL_COPY(&tmp, varname);
- varname = &tmp;
}
if (IS_VAR != IS_UNUSED) {
} else {
ce = zend_fetch_class_by_name(Z_STR_P(opline->op2.zv), opline->op2.zv + 1, 0 TSRMLS_CC);
if (UNEXPECTED(EG(exception) != NULL)) {
- if (IS_TMP_VAR != IS_CONST && tmp_is_dup) {
+ if (IS_TMP_VAR != IS_CONST) {
zval_dtor(&tmp);
- } else if (IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) {
- zval_ptr_dtor(&tmp);
}
zval_dtor(free_op1.var);
HANDLE_EXCEPTION();
zend_hash_del_ind(target_symbol_table, Z_STR_P(varname));
}
- if (IS_TMP_VAR != IS_CONST && tmp_is_dup) {
+ if (IS_TMP_VAR != IS_CONST) {
zval_dtor(&tmp);
- } else if (IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) {
- zval_ptr_dtor(&tmp);
}
zval_dtor(free_op1.var);
CHECK_EXCEPTION();
zval tmp, *varname;
HashTable *target_symbol_table;
zend_free_op free_op1;
- zend_bool tmp_is_dup = 0;
SAVE_OPLINE();
if (IS_TMP_VAR == IS_CV &&
IS_UNUSED == IS_UNUSED &&
(opline->extended_value & ZEND_QUICK_SET)) {
- ZVAL_COPY_VALUE(&tmp, EX_VAR(opline->op1.var));
- ZVAL_UNDEF(EX_VAR(opline->op1.var));
- zval_ptr_dtor(&tmp);
+ zval *var = EX_VAR(opline->op1.var);
+
+ if (Z_REFCOUNTED_P(var)) {
+ zend_refcounted *garbage = Z_COUNTED_P(var);
+
+ if (!--GC_REFCOUNT(garbage)) {
+ ZVAL_UNDEF(var);
+ _zval_dtor_func_for_ptr(garbage ZEND_FILE_LINE_CC);
+ } else {
+ GC_ZVAL_CHECK_POSSIBLE_ROOT(var);
+ ZVAL_UNDEF(var);
+ }
+ } else {
+ ZVAL_UNDEF(var);
+ }
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
varname = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
+ ZVAL_UNDEF(&tmp);
if (IS_TMP_VAR != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
ZVAL_DUP(&tmp, varname);
convert_to_string(&tmp);
varname = &tmp;
- tmp_is_dup = 1;
- } else if (IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) {
- ZVAL_COPY(&tmp, varname);
- varname = &tmp;
}
if (IS_UNUSED != IS_UNUSED) {
} else {
ce = zend_fetch_class_by_name(Z_STR_P(opline->op2.zv), opline->op2.zv + 1, 0 TSRMLS_CC);
if (UNEXPECTED(EG(exception) != NULL)) {
- if (IS_TMP_VAR != IS_CONST && tmp_is_dup) {
+ if (IS_TMP_VAR != IS_CONST) {
zval_dtor(&tmp);
- } else if (IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) {
- zval_ptr_dtor(&tmp);
}
zval_dtor(free_op1.var);
HANDLE_EXCEPTION();
zend_hash_del_ind(target_symbol_table, Z_STR_P(varname));
}
- if (IS_TMP_VAR != IS_CONST && tmp_is_dup) {
+ if (IS_TMP_VAR != IS_CONST) {
zval_dtor(&tmp);
- } else if (IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) {
- zval_ptr_dtor(&tmp);
}
zval_dtor(free_op1.var);
CHECK_EXCEPTION();
zval tmp, *varname;
HashTable *target_symbol_table;
zend_free_op free_op1;
- zend_bool tmp_is_dup = 0;
SAVE_OPLINE();
if (IS_VAR == IS_CV &&
IS_CONST == IS_UNUSED &&
(opline->extended_value & ZEND_QUICK_SET)) {
- ZVAL_COPY_VALUE(&tmp, EX_VAR(opline->op1.var));
- ZVAL_UNDEF(EX_VAR(opline->op1.var));
- zval_ptr_dtor(&tmp);
+ zval *var = EX_VAR(opline->op1.var);
+
+ if (Z_REFCOUNTED_P(var)) {
+ zend_refcounted *garbage = Z_COUNTED_P(var);
+
+ if (!--GC_REFCOUNT(garbage)) {
+ ZVAL_UNDEF(var);
+ _zval_dtor_func_for_ptr(garbage ZEND_FILE_LINE_CC);
+ } else {
+ GC_ZVAL_CHECK_POSSIBLE_ROOT(var);
+ ZVAL_UNDEF(var);
+ }
+ } else {
+ ZVAL_UNDEF(var);
+ }
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
varname = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
+ ZVAL_UNDEF(&tmp);
if (IS_VAR != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
ZVAL_DUP(&tmp, varname);
convert_to_string(&tmp);
varname = &tmp;
- tmp_is_dup = 1;
- } else if (IS_VAR == IS_VAR || IS_VAR == IS_CV) {
- ZVAL_COPY(&tmp, varname);
- varname = &tmp;
}
if (IS_CONST != IS_UNUSED) {
} else {
ce = zend_fetch_class_by_name(Z_STR_P(opline->op2.zv), opline->op2.zv + 1, 0 TSRMLS_CC);
if (UNEXPECTED(EG(exception) != NULL)) {
- if (IS_VAR != IS_CONST && tmp_is_dup) {
+ if (IS_VAR != IS_CONST) {
zval_dtor(&tmp);
- } else if (IS_VAR == IS_VAR || IS_VAR == IS_CV) {
- zval_ptr_dtor(&tmp);
}
zval_ptr_dtor_nogc(free_op1.var);
HANDLE_EXCEPTION();
zend_hash_del_ind(target_symbol_table, Z_STR_P(varname));
}
- if (IS_VAR != IS_CONST && tmp_is_dup) {
+ if (IS_VAR != IS_CONST) {
zval_dtor(&tmp);
- } else if (IS_VAR == IS_VAR || IS_VAR == IS_CV) {
- zval_ptr_dtor(&tmp);
}
zval_ptr_dtor_nogc(free_op1.var);
CHECK_EXCEPTION();
zend_hash_index_del(ht, hval);
break;
case IS_STRING:
- if (IS_CONST == IS_CV || IS_CONST == IS_VAR) {
- if (Z_REFCOUNTED_P(offset)) Z_ADDREF_P(offset);
- }
if (IS_CONST != IS_CONST) {
if (ZEND_HANDLE_NUMERIC(Z_STR_P(offset), hval)) {
- goto numeric_index_dim;
+ goto num_index_dim;
}
}
if (ht == &EG(symbol_table).ht) {
} else {
zend_hash_del(ht, Z_STR_P(offset));
}
- if (IS_CONST == IS_CV || IS_CONST == IS_VAR) {
- zval_ptr_dtor(offset);
- }
- break;
-numeric_index_dim:
- zend_hash_index_del(ht, hval);
- if (IS_CONST == IS_CV || IS_CONST == IS_VAR) {
- zval_ptr_dtor(offset);
- }
break;
case IS_NULL:
zend_hash_del(ht, STR_EMPTY_ALLOC());
zend_hash_index_del(ht, hval);
break;
case IS_STRING:
- if (IS_TMP_VAR == IS_CV || IS_TMP_VAR == IS_VAR) {
- if (Z_REFCOUNTED_P(offset)) Z_ADDREF_P(offset);
- }
if (IS_TMP_VAR != IS_CONST) {
if (ZEND_HANDLE_NUMERIC(Z_STR_P(offset), hval)) {
- goto numeric_index_dim;
+ goto num_index_dim;
}
}
if (ht == &EG(symbol_table).ht) {
} else {
zend_hash_del(ht, Z_STR_P(offset));
}
- if (IS_TMP_VAR == IS_CV || IS_TMP_VAR == IS_VAR) {
- zval_ptr_dtor(offset);
- }
- break;
-numeric_index_dim:
- zend_hash_index_del(ht, hval);
- if (IS_TMP_VAR == IS_CV || IS_TMP_VAR == IS_VAR) {
- zval_ptr_dtor(offset);
- }
break;
case IS_NULL:
zend_hash_del(ht, STR_EMPTY_ALLOC());
zval tmp, *varname;
HashTable *target_symbol_table;
zend_free_op free_op1;
- zend_bool tmp_is_dup = 0;
SAVE_OPLINE();
if (IS_VAR == IS_CV &&
IS_VAR == IS_UNUSED &&
(opline->extended_value & ZEND_QUICK_SET)) {
- ZVAL_COPY_VALUE(&tmp, EX_VAR(opline->op1.var));
- ZVAL_UNDEF(EX_VAR(opline->op1.var));
- zval_ptr_dtor(&tmp);
+ zval *var = EX_VAR(opline->op1.var);
+
+ if (Z_REFCOUNTED_P(var)) {
+ zend_refcounted *garbage = Z_COUNTED_P(var);
+
+ if (!--GC_REFCOUNT(garbage)) {
+ ZVAL_UNDEF(var);
+ _zval_dtor_func_for_ptr(garbage ZEND_FILE_LINE_CC);
+ } else {
+ GC_ZVAL_CHECK_POSSIBLE_ROOT(var);
+ ZVAL_UNDEF(var);
+ }
+ } else {
+ ZVAL_UNDEF(var);
+ }
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
varname = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
+ ZVAL_UNDEF(&tmp);
if (IS_VAR != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
ZVAL_DUP(&tmp, varname);
convert_to_string(&tmp);
varname = &tmp;
- tmp_is_dup = 1;
- } else if (IS_VAR == IS_VAR || IS_VAR == IS_CV) {
- ZVAL_COPY(&tmp, varname);
- varname = &tmp;
}
if (IS_VAR != IS_UNUSED) {
} else {
ce = zend_fetch_class_by_name(Z_STR_P(opline->op2.zv), opline->op2.zv + 1, 0 TSRMLS_CC);
if (UNEXPECTED(EG(exception) != NULL)) {
- if (IS_VAR != IS_CONST && tmp_is_dup) {
+ if (IS_VAR != IS_CONST) {
zval_dtor(&tmp);
- } else if (IS_VAR == IS_VAR || IS_VAR == IS_CV) {
- zval_ptr_dtor(&tmp);
}
zval_ptr_dtor_nogc(free_op1.var);
HANDLE_EXCEPTION();
zend_hash_del_ind(target_symbol_table, Z_STR_P(varname));
}
- if (IS_VAR != IS_CONST && tmp_is_dup) {
+ if (IS_VAR != IS_CONST) {
zval_dtor(&tmp);
- } else if (IS_VAR == IS_VAR || IS_VAR == IS_CV) {
- zval_ptr_dtor(&tmp);
}
zval_ptr_dtor_nogc(free_op1.var);
CHECK_EXCEPTION();
zend_hash_index_del(ht, hval);
break;
case IS_STRING:
- if (IS_VAR == IS_CV || IS_VAR == IS_VAR) {
- if (Z_REFCOUNTED_P(offset)) Z_ADDREF_P(offset);
- }
if (IS_VAR != IS_CONST) {
if (ZEND_HANDLE_NUMERIC(Z_STR_P(offset), hval)) {
- goto numeric_index_dim;
+ goto num_index_dim;
}
}
if (ht == &EG(symbol_table).ht) {
} else {
zend_hash_del(ht, Z_STR_P(offset));
}
- if (IS_VAR == IS_CV || IS_VAR == IS_VAR) {
- zval_ptr_dtor(offset);
- }
- break;
-numeric_index_dim:
- zend_hash_index_del(ht, hval);
- if (IS_VAR == IS_CV || IS_VAR == IS_VAR) {
- zval_ptr_dtor(offset);
- }
break;
case IS_NULL:
zend_hash_del(ht, STR_EMPTY_ALLOC());
zval tmp, *varname;
HashTable *target_symbol_table;
zend_free_op free_op1;
- zend_bool tmp_is_dup = 0;
SAVE_OPLINE();
if (IS_VAR == IS_CV &&
IS_UNUSED == IS_UNUSED &&
(opline->extended_value & ZEND_QUICK_SET)) {
- ZVAL_COPY_VALUE(&tmp, EX_VAR(opline->op1.var));
- ZVAL_UNDEF(EX_VAR(opline->op1.var));
- zval_ptr_dtor(&tmp);
+ zval *var = EX_VAR(opline->op1.var);
+
+ if (Z_REFCOUNTED_P(var)) {
+ zend_refcounted *garbage = Z_COUNTED_P(var);
+
+ if (!--GC_REFCOUNT(garbage)) {
+ ZVAL_UNDEF(var);
+ _zval_dtor_func_for_ptr(garbage ZEND_FILE_LINE_CC);
+ } else {
+ GC_ZVAL_CHECK_POSSIBLE_ROOT(var);
+ ZVAL_UNDEF(var);
+ }
+ } else {
+ ZVAL_UNDEF(var);
+ }
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
varname = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
+ ZVAL_UNDEF(&tmp);
if (IS_VAR != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
ZVAL_DUP(&tmp, varname);
convert_to_string(&tmp);
varname = &tmp;
- tmp_is_dup = 1;
- } else if (IS_VAR == IS_VAR || IS_VAR == IS_CV) {
- ZVAL_COPY(&tmp, varname);
- varname = &tmp;
}
if (IS_UNUSED != IS_UNUSED) {
} else {
ce = zend_fetch_class_by_name(Z_STR_P(opline->op2.zv), opline->op2.zv + 1, 0 TSRMLS_CC);
if (UNEXPECTED(EG(exception) != NULL)) {
- if (IS_VAR != IS_CONST && tmp_is_dup) {
+ if (IS_VAR != IS_CONST) {
zval_dtor(&tmp);
- } else if (IS_VAR == IS_VAR || IS_VAR == IS_CV) {
- zval_ptr_dtor(&tmp);
}
zval_ptr_dtor_nogc(free_op1.var);
HANDLE_EXCEPTION();
zend_hash_del_ind(target_symbol_table, Z_STR_P(varname));
}
- if (IS_VAR != IS_CONST && tmp_is_dup) {
+ if (IS_VAR != IS_CONST) {
zval_dtor(&tmp);
- } else if (IS_VAR == IS_VAR || IS_VAR == IS_CV) {
- zval_ptr_dtor(&tmp);
}
zval_ptr_dtor_nogc(free_op1.var);
CHECK_EXCEPTION();
zend_hash_index_del(ht, hval);
break;
case IS_STRING:
- if (IS_CV == IS_CV || IS_CV == IS_VAR) {
- if (Z_REFCOUNTED_P(offset)) Z_ADDREF_P(offset);
- }
if (IS_CV != IS_CONST) {
if (ZEND_HANDLE_NUMERIC(Z_STR_P(offset), hval)) {
- goto numeric_index_dim;
+ goto num_index_dim;
}
}
if (ht == &EG(symbol_table).ht) {
} else {
zend_hash_del(ht, Z_STR_P(offset));
}
- if (IS_CV == IS_CV || IS_CV == IS_VAR) {
- zval_ptr_dtor(offset);
- }
- break;
-numeric_index_dim:
- zend_hash_index_del(ht, hval);
- if (IS_CV == IS_CV || IS_CV == IS_VAR) {
- zval_ptr_dtor(offset);
- }
break;
case IS_NULL:
zend_hash_del(ht, STR_EMPTY_ALLOC());
zend_hash_index_del(ht, hval);
break;
case IS_STRING:
- if (IS_CONST == IS_CV || IS_CONST == IS_VAR) {
- if (Z_REFCOUNTED_P(offset)) Z_ADDREF_P(offset);
- }
if (IS_CONST != IS_CONST) {
if (ZEND_HANDLE_NUMERIC(Z_STR_P(offset), hval)) {
- goto numeric_index_dim;
+ goto num_index_dim;
}
}
if (ht == &EG(symbol_table).ht) {
} else {
zend_hash_del(ht, Z_STR_P(offset));
}
- if (IS_CONST == IS_CV || IS_CONST == IS_VAR) {
- zval_ptr_dtor(offset);
- }
- break;
-numeric_index_dim:
- zend_hash_index_del(ht, hval);
- if (IS_CONST == IS_CV || IS_CONST == IS_VAR) {
- zval_ptr_dtor(offset);
- }
break;
case IS_NULL:
zend_hash_del(ht, STR_EMPTY_ALLOC());
zend_hash_index_del(ht, hval);
break;
case IS_STRING:
- if (IS_TMP_VAR == IS_CV || IS_TMP_VAR == IS_VAR) {
- if (Z_REFCOUNTED_P(offset)) Z_ADDREF_P(offset);
- }
if (IS_TMP_VAR != IS_CONST) {
if (ZEND_HANDLE_NUMERIC(Z_STR_P(offset), hval)) {
- goto numeric_index_dim;
+ goto num_index_dim;
}
}
if (ht == &EG(symbol_table).ht) {
} else {
zend_hash_del(ht, Z_STR_P(offset));
}
- if (IS_TMP_VAR == IS_CV || IS_TMP_VAR == IS_VAR) {
- zval_ptr_dtor(offset);
- }
- break;
-numeric_index_dim:
- zend_hash_index_del(ht, hval);
- if (IS_TMP_VAR == IS_CV || IS_TMP_VAR == IS_VAR) {
- zval_ptr_dtor(offset);
- }
break;
case IS_NULL:
zend_hash_del(ht, STR_EMPTY_ALLOC());
zend_hash_index_del(ht, hval);
break;
case IS_STRING:
- if (IS_VAR == IS_CV || IS_VAR == IS_VAR) {
- if (Z_REFCOUNTED_P(offset)) Z_ADDREF_P(offset);
- }
if (IS_VAR != IS_CONST) {
if (ZEND_HANDLE_NUMERIC(Z_STR_P(offset), hval)) {
- goto numeric_index_dim;
+ goto num_index_dim;
}
}
if (ht == &EG(symbol_table).ht) {
} else {
zend_hash_del(ht, Z_STR_P(offset));
}
- if (IS_VAR == IS_CV || IS_VAR == IS_VAR) {
- zval_ptr_dtor(offset);
- }
- break;
-numeric_index_dim:
- zend_hash_index_del(ht, hval);
- if (IS_VAR == IS_CV || IS_VAR == IS_VAR) {
- zval_ptr_dtor(offset);
- }
break;
case IS_NULL:
zend_hash_del(ht, STR_EMPTY_ALLOC());
zend_hash_index_del(ht, hval);
break;
case IS_STRING:
- if (IS_CV == IS_CV || IS_CV == IS_VAR) {
- if (Z_REFCOUNTED_P(offset)) Z_ADDREF_P(offset);
- }
if (IS_CV != IS_CONST) {
if (ZEND_HANDLE_NUMERIC(Z_STR_P(offset), hval)) {
- goto numeric_index_dim;
+ goto num_index_dim;
}
}
if (ht == &EG(symbol_table).ht) {
} else {
zend_hash_del(ht, Z_STR_P(offset));
}
- if (IS_CV == IS_CV || IS_CV == IS_VAR) {
- zval_ptr_dtor(offset);
- }
- break;
-numeric_index_dim:
- zend_hash_index_del(ht, hval);
- if (IS_CV == IS_CV || IS_CV == IS_VAR) {
- zval_ptr_dtor(offset);
- }
break;
case IS_NULL:
zend_hash_del(ht, STR_EMPTY_ALLOC());
zval tmp, *varname;
HashTable *target_symbol_table;
- zend_bool tmp_is_dup = 0;
SAVE_OPLINE();
if (IS_CV == IS_CV &&
IS_CONST == IS_UNUSED &&
(opline->extended_value & ZEND_QUICK_SET)) {
- ZVAL_COPY_VALUE(&tmp, EX_VAR(opline->op1.var));
- ZVAL_UNDEF(EX_VAR(opline->op1.var));
- zval_ptr_dtor(&tmp);
+ zval *var = EX_VAR(opline->op1.var);
+
+ if (Z_REFCOUNTED_P(var)) {
+ zend_refcounted *garbage = Z_COUNTED_P(var);
+
+ if (!--GC_REFCOUNT(garbage)) {
+ ZVAL_UNDEF(var);
+ _zval_dtor_func_for_ptr(garbage ZEND_FILE_LINE_CC);
+ } else {
+ GC_ZVAL_CHECK_POSSIBLE_ROOT(var);
+ ZVAL_UNDEF(var);
+ }
+ } else {
+ ZVAL_UNDEF(var);
+ }
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
varname = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
+ ZVAL_UNDEF(&tmp);
if (IS_CV != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
ZVAL_DUP(&tmp, varname);
convert_to_string(&tmp);
varname = &tmp;
- tmp_is_dup = 1;
- } else if (IS_CV == IS_VAR || IS_CV == IS_CV) {
- ZVAL_COPY(&tmp, varname);
- varname = &tmp;
}
if (IS_CONST != IS_UNUSED) {
} else {
ce = zend_fetch_class_by_name(Z_STR_P(opline->op2.zv), opline->op2.zv + 1, 0 TSRMLS_CC);
if (UNEXPECTED(EG(exception) != NULL)) {
- if (IS_CV != IS_CONST && tmp_is_dup) {
+ if (IS_CV != IS_CONST) {
zval_dtor(&tmp);
- } else if (IS_CV == IS_VAR || IS_CV == IS_CV) {
- zval_ptr_dtor(&tmp);
}
HANDLE_EXCEPTION();
zend_hash_del_ind(target_symbol_table, Z_STR_P(varname));
}
- if (IS_CV != IS_CONST && tmp_is_dup) {
+ if (IS_CV != IS_CONST) {
zval_dtor(&tmp);
- } else if (IS_CV == IS_VAR || IS_CV == IS_CV) {
- zval_ptr_dtor(&tmp);
}
CHECK_EXCEPTION();
zend_hash_index_del(ht, hval);
break;
case IS_STRING:
- if (IS_CONST == IS_CV || IS_CONST == IS_VAR) {
- if (Z_REFCOUNTED_P(offset)) Z_ADDREF_P(offset);
- }
if (IS_CONST != IS_CONST) {
if (ZEND_HANDLE_NUMERIC(Z_STR_P(offset), hval)) {
- goto numeric_index_dim;
+ goto num_index_dim;
}
}
if (ht == &EG(symbol_table).ht) {
} else {
zend_hash_del(ht, Z_STR_P(offset));
}
- if (IS_CONST == IS_CV || IS_CONST == IS_VAR) {
- zval_ptr_dtor(offset);
- }
- break;
-numeric_index_dim:
- zend_hash_index_del(ht, hval);
- if (IS_CONST == IS_CV || IS_CONST == IS_VAR) {
- zval_ptr_dtor(offset);
- }
break;
case IS_NULL:
zend_hash_del(ht, STR_EMPTY_ALLOC());
zend_hash_index_del(ht, hval);
break;
case IS_STRING:
- if (IS_TMP_VAR == IS_CV || IS_TMP_VAR == IS_VAR) {
- if (Z_REFCOUNTED_P(offset)) Z_ADDREF_P(offset);
- }
if (IS_TMP_VAR != IS_CONST) {
if (ZEND_HANDLE_NUMERIC(Z_STR_P(offset), hval)) {
- goto numeric_index_dim;
+ goto num_index_dim;
}
}
if (ht == &EG(symbol_table).ht) {
} else {
zend_hash_del(ht, Z_STR_P(offset));
}
- if (IS_TMP_VAR == IS_CV || IS_TMP_VAR == IS_VAR) {
- zval_ptr_dtor(offset);
- }
- break;
-numeric_index_dim:
- zend_hash_index_del(ht, hval);
- if (IS_TMP_VAR == IS_CV || IS_TMP_VAR == IS_VAR) {
- zval_ptr_dtor(offset);
- }
break;
case IS_NULL:
zend_hash_del(ht, STR_EMPTY_ALLOC());
zval tmp, *varname;
HashTable *target_symbol_table;
- zend_bool tmp_is_dup = 0;
SAVE_OPLINE();
if (IS_CV == IS_CV &&
IS_VAR == IS_UNUSED &&
(opline->extended_value & ZEND_QUICK_SET)) {
- ZVAL_COPY_VALUE(&tmp, EX_VAR(opline->op1.var));
- ZVAL_UNDEF(EX_VAR(opline->op1.var));
- zval_ptr_dtor(&tmp);
+ zval *var = EX_VAR(opline->op1.var);
+
+ if (Z_REFCOUNTED_P(var)) {
+ zend_refcounted *garbage = Z_COUNTED_P(var);
+
+ if (!--GC_REFCOUNT(garbage)) {
+ ZVAL_UNDEF(var);
+ _zval_dtor_func_for_ptr(garbage ZEND_FILE_LINE_CC);
+ } else {
+ GC_ZVAL_CHECK_POSSIBLE_ROOT(var);
+ ZVAL_UNDEF(var);
+ }
+ } else {
+ ZVAL_UNDEF(var);
+ }
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
varname = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
+ ZVAL_UNDEF(&tmp);
if (IS_CV != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
ZVAL_DUP(&tmp, varname);
convert_to_string(&tmp);
varname = &tmp;
- tmp_is_dup = 1;
- } else if (IS_CV == IS_VAR || IS_CV == IS_CV) {
- ZVAL_COPY(&tmp, varname);
- varname = &tmp;
}
if (IS_VAR != IS_UNUSED) {
} else {
ce = zend_fetch_class_by_name(Z_STR_P(opline->op2.zv), opline->op2.zv + 1, 0 TSRMLS_CC);
if (UNEXPECTED(EG(exception) != NULL)) {
- if (IS_CV != IS_CONST && tmp_is_dup) {
+ if (IS_CV != IS_CONST) {
zval_dtor(&tmp);
- } else if (IS_CV == IS_VAR || IS_CV == IS_CV) {
- zval_ptr_dtor(&tmp);
}
HANDLE_EXCEPTION();
zend_hash_del_ind(target_symbol_table, Z_STR_P(varname));
}
- if (IS_CV != IS_CONST && tmp_is_dup) {
+ if (IS_CV != IS_CONST) {
zval_dtor(&tmp);
- } else if (IS_CV == IS_VAR || IS_CV == IS_CV) {
- zval_ptr_dtor(&tmp);
}
CHECK_EXCEPTION();
zend_hash_index_del(ht, hval);
break;
case IS_STRING:
- if (IS_VAR == IS_CV || IS_VAR == IS_VAR) {
- if (Z_REFCOUNTED_P(offset)) Z_ADDREF_P(offset);
- }
if (IS_VAR != IS_CONST) {
if (ZEND_HANDLE_NUMERIC(Z_STR_P(offset), hval)) {
- goto numeric_index_dim;
+ goto num_index_dim;
}
}
if (ht == &EG(symbol_table).ht) {
} else {
zend_hash_del(ht, Z_STR_P(offset));
}
- if (IS_VAR == IS_CV || IS_VAR == IS_VAR) {
- zval_ptr_dtor(offset);
- }
- break;
-numeric_index_dim:
- zend_hash_index_del(ht, hval);
- if (IS_VAR == IS_CV || IS_VAR == IS_VAR) {
- zval_ptr_dtor(offset);
- }
break;
case IS_NULL:
zend_hash_del(ht, STR_EMPTY_ALLOC());
zval tmp, *varname;
HashTable *target_symbol_table;
- zend_bool tmp_is_dup = 0;
SAVE_OPLINE();
if (IS_CV == IS_CV &&
IS_UNUSED == IS_UNUSED &&
(opline->extended_value & ZEND_QUICK_SET)) {
- ZVAL_COPY_VALUE(&tmp, EX_VAR(opline->op1.var));
- ZVAL_UNDEF(EX_VAR(opline->op1.var));
- zval_ptr_dtor(&tmp);
+ zval *var = EX_VAR(opline->op1.var);
+
+ if (Z_REFCOUNTED_P(var)) {
+ zend_refcounted *garbage = Z_COUNTED_P(var);
+
+ if (!--GC_REFCOUNT(garbage)) {
+ ZVAL_UNDEF(var);
+ _zval_dtor_func_for_ptr(garbage ZEND_FILE_LINE_CC);
+ } else {
+ GC_ZVAL_CHECK_POSSIBLE_ROOT(var);
+ ZVAL_UNDEF(var);
+ }
+ } else {
+ ZVAL_UNDEF(var);
+ }
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
varname = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
+ ZVAL_UNDEF(&tmp);
if (IS_CV != IS_CONST && Z_TYPE_P(varname) != IS_STRING) {
ZVAL_DUP(&tmp, varname);
convert_to_string(&tmp);
varname = &tmp;
- tmp_is_dup = 1;
- } else if (IS_CV == IS_VAR || IS_CV == IS_CV) {
- ZVAL_COPY(&tmp, varname);
- varname = &tmp;
}
if (IS_UNUSED != IS_UNUSED) {
} else {
ce = zend_fetch_class_by_name(Z_STR_P(opline->op2.zv), opline->op2.zv + 1, 0 TSRMLS_CC);
if (UNEXPECTED(EG(exception) != NULL)) {
- if (IS_CV != IS_CONST && tmp_is_dup) {
+ if (IS_CV != IS_CONST) {
zval_dtor(&tmp);
- } else if (IS_CV == IS_VAR || IS_CV == IS_CV) {
- zval_ptr_dtor(&tmp);
}
HANDLE_EXCEPTION();
zend_hash_del_ind(target_symbol_table, Z_STR_P(varname));
}
- if (IS_CV != IS_CONST && tmp_is_dup) {
+ if (IS_CV != IS_CONST) {
zval_dtor(&tmp);
- } else if (IS_CV == IS_VAR || IS_CV == IS_CV) {
- zval_ptr_dtor(&tmp);
}
CHECK_EXCEPTION();
zend_hash_index_del(ht, hval);
break;
case IS_STRING:
- if (IS_CV == IS_CV || IS_CV == IS_VAR) {
- if (Z_REFCOUNTED_P(offset)) Z_ADDREF_P(offset);
- }
if (IS_CV != IS_CONST) {
if (ZEND_HANDLE_NUMERIC(Z_STR_P(offset), hval)) {
- goto numeric_index_dim;
+ goto num_index_dim;
}
}
if (ht == &EG(symbol_table).ht) {
} else {
zend_hash_del(ht, Z_STR_P(offset));
}
- if (IS_CV == IS_CV || IS_CV == IS_VAR) {
- zval_ptr_dtor(offset);
- }
- break;
-numeric_index_dim:
- zend_hash_index_del(ht, hval);
- if (IS_CV == IS_CV || IS_CV == IS_VAR) {
- zval_ptr_dtor(offset);
- }
break;
case IS_NULL:
zend_hash_del(ht, STR_EMPTY_ALLOC());