} else {
target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
-/*
- if (!target_symbol_table) {
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
- }
-*/
if ((retval = zend_hash_find(target_symbol_table, Z_STR_P(varname))) == NULL) {
switch (type) {
case BP_VAR_R:
break;
EMPTY_SWITCH_DEFAULT_CASE()
}
-//??? GLOBAL or $$name variable may be an INDIRECT pointer to CV
- } else if (/*(opline->extended_value & ZEND_FETCH_TYPE_MASK) != ZEND_FETCH_STATIC &&*/
+ /* GLOBAL or $$name variable may be an INDIRECT pointer to CV */
+ } else if (/* ??? (opline->extended_value & ZEND_FETCH_TYPE_MASK) != ZEND_FETCH_STATIC &&*/
Z_TYPE_P(retval) == IS_INDIRECT) {
retval = Z_INDIRECT_P(retval);
if (Z_TYPE_P(retval) == IS_UNDEF) {
}
if (EXPECTED(retval != NULL)) {
- if (Z_REFCOUNTED_P(retval)) Z_ADDREF_P(retval);
switch (type) {
case BP_VAR_R:
case BP_VAR_IS:
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), retval);
+ ZVAL_COPY(EX_VAR(opline->result.var), retval);
break;
case BP_VAR_UNSET: {
//??? zend_free_op free_res;
} else {
target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
-/*
- if (!target_symbol_table) {
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
- }
-*/
if ((retval = zend_hash_find(target_symbol_table, Z_STR_P(varname))) == NULL) {
switch (type) {
case BP_VAR_R:
break;
EMPTY_SWITCH_DEFAULT_CASE()
}
-//??? GLOBAL or $$name variable may be an INDIRECT pointer to CV
- } else if (/*(opline->extended_value & ZEND_FETCH_TYPE_MASK) != ZEND_FETCH_STATIC &&*/
+ /* GLOBAL or $$name variable may be an INDIRECT pointer to CV */
+ } else if (/* ??? (opline->extended_value & ZEND_FETCH_TYPE_MASK) != ZEND_FETCH_STATIC &&*/
Z_TYPE_P(retval) == IS_INDIRECT) {
retval = Z_INDIRECT_P(retval);
if (Z_TYPE_P(retval) == IS_UNDEF) {
}
if (EXPECTED(retval != NULL)) {
- if (Z_REFCOUNTED_P(retval)) Z_ADDREF_P(retval);
switch (type) {
case BP_VAR_R:
case BP_VAR_IS:
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), retval);
+ ZVAL_COPY(EX_VAR(opline->result.var), retval);
break;
case BP_VAR_UNSET: {
//??? zend_free_op free_res;
} else {
target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
-/*
- if (!target_symbol_table) {
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
- }
-*/
if ((retval = zend_hash_find(target_symbol_table, Z_STR_P(varname))) == NULL) {
switch (type) {
case BP_VAR_R:
break;
EMPTY_SWITCH_DEFAULT_CASE()
}
-//??? GLOBAL or $$name variable may be an INDIRECT pointer to CV
- } else if (/*(opline->extended_value & ZEND_FETCH_TYPE_MASK) != ZEND_FETCH_STATIC &&*/
+ /* GLOBAL or $$name variable may be an INDIRECT pointer to CV */
+ } else if (/* ??? (opline->extended_value & ZEND_FETCH_TYPE_MASK) != ZEND_FETCH_STATIC &&*/
Z_TYPE_P(retval) == IS_INDIRECT) {
retval = Z_INDIRECT_P(retval);
if (Z_TYPE_P(retval) == IS_UNDEF) {
}
if (EXPECTED(retval != NULL)) {
- if (Z_REFCOUNTED_P(retval)) Z_ADDREF_P(retval);
switch (type) {
case BP_VAR_R:
case BP_VAR_IS:
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), retval);
+ ZVAL_COPY(EX_VAR(opline->result.var), retval);
break;
case BP_VAR_UNSET: {
//??? zend_free_op free_res;
zval_dtor(free_op1.var);
} else {
target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
-/*
- if (!target_symbol_table) {
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
- }
-*/
if ((retval = zend_hash_find(target_symbol_table, Z_STR_P(varname))) == NULL) {
switch (type) {
case BP_VAR_R:
break;
EMPTY_SWITCH_DEFAULT_CASE()
}
-//??? GLOBAL or $$name variable may be an INDIRECT pointer to CV
- } else if (/*(opline->extended_value & ZEND_FETCH_TYPE_MASK) != ZEND_FETCH_STATIC &&*/
+ /* GLOBAL or $$name variable may be an INDIRECT pointer to CV */
+ } else if (/* ??? (opline->extended_value & ZEND_FETCH_TYPE_MASK) != ZEND_FETCH_STATIC &&*/
Z_TYPE_P(retval) == IS_INDIRECT) {
retval = Z_INDIRECT_P(retval);
if (Z_TYPE_P(retval) == IS_UNDEF) {
}
if (EXPECTED(retval != NULL)) {
- if (Z_REFCOUNTED_P(retval)) Z_ADDREF_P(retval);
switch (type) {
case BP_VAR_R:
case BP_VAR_IS:
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), retval);
+ ZVAL_COPY(EX_VAR(opline->result.var), retval);
break;
case BP_VAR_UNSET: {
//??? zend_free_op free_res;
zval_dtor(free_op1.var);
} else {
target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
-/*
- if (!target_symbol_table) {
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
- }
-*/
if ((retval = zend_hash_find(target_symbol_table, Z_STR_P(varname))) == NULL) {
switch (type) {
case BP_VAR_R:
break;
EMPTY_SWITCH_DEFAULT_CASE()
}
-//??? GLOBAL or $$name variable may be an INDIRECT pointer to CV
- } else if (/*(opline->extended_value & ZEND_FETCH_TYPE_MASK) != ZEND_FETCH_STATIC &&*/
+ /* GLOBAL or $$name variable may be an INDIRECT pointer to CV */
+ } else if (/* ??? (opline->extended_value & ZEND_FETCH_TYPE_MASK) != ZEND_FETCH_STATIC &&*/
Z_TYPE_P(retval) == IS_INDIRECT) {
retval = Z_INDIRECT_P(retval);
if (Z_TYPE_P(retval) == IS_UNDEF) {
}
if (EXPECTED(retval != NULL)) {
- if (Z_REFCOUNTED_P(retval)) Z_ADDREF_P(retval);
switch (type) {
case BP_VAR_R:
case BP_VAR_IS:
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), retval);
+ ZVAL_COPY(EX_VAR(opline->result.var), retval);
break;
case BP_VAR_UNSET: {
//??? zend_free_op free_res;
zval_dtor(free_op1.var);
} else {
target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
-/*
- if (!target_symbol_table) {
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
- }
-*/
if ((retval = zend_hash_find(target_symbol_table, Z_STR_P(varname))) == NULL) {
switch (type) {
case BP_VAR_R:
break;
EMPTY_SWITCH_DEFAULT_CASE()
}
-//??? GLOBAL or $$name variable may be an INDIRECT pointer to CV
- } else if (/*(opline->extended_value & ZEND_FETCH_TYPE_MASK) != ZEND_FETCH_STATIC &&*/
+ /* GLOBAL or $$name variable may be an INDIRECT pointer to CV */
+ } else if (/* ??? (opline->extended_value & ZEND_FETCH_TYPE_MASK) != ZEND_FETCH_STATIC &&*/
Z_TYPE_P(retval) == IS_INDIRECT) {
retval = Z_INDIRECT_P(retval);
if (Z_TYPE_P(retval) == IS_UNDEF) {
}
if (EXPECTED(retval != NULL)) {
- if (Z_REFCOUNTED_P(retval)) Z_ADDREF_P(retval);
switch (type) {
case BP_VAR_R:
case BP_VAR_IS:
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), retval);
+ ZVAL_COPY(EX_VAR(opline->result.var), retval);
break;
case BP_VAR_UNSET: {
//??? zend_free_op free_res;
} else {
zval *dim = opline->op2.zv;
- zend_fetch_dimension_address(EX_VAR((opline+1)->op2.var), container, dim, IS_CONST, BP_VAR_RW TSRMLS_CC);
+ zend_fetch_dimension_address(EX_VAR((opline+1)->op2.var), container, dim, IS_CONST, BP_VAR_RW, 0 TSRMLS_CC);
value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, execute_data, &free_op_data1, BP_VAR_R);
var_ptr = _get_zval_ptr_ptr_var((opline+1)->op2.var, execute_data, &free_op_data2 TSRMLS_CC);
}
zval_ptr_dtor_nogc(free_op1.var);
} else {
target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
-/*
- if (!target_symbol_table) {
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
- }
-*/
if ((retval = zend_hash_find(target_symbol_table, Z_STR_P(varname))) == NULL) {
switch (type) {
case BP_VAR_R:
break;
EMPTY_SWITCH_DEFAULT_CASE()
}
-//??? GLOBAL or $$name variable may be an INDIRECT pointer to CV
- } else if (/*(opline->extended_value & ZEND_FETCH_TYPE_MASK) != ZEND_FETCH_STATIC &&*/
+ /* GLOBAL or $$name variable may be an INDIRECT pointer to CV */
+ } else if (/* ??? (opline->extended_value & ZEND_FETCH_TYPE_MASK) != ZEND_FETCH_STATIC &&*/
Z_TYPE_P(retval) == IS_INDIRECT) {
retval = Z_INDIRECT_P(retval);
if (Z_TYPE_P(retval) == IS_UNDEF) {
}
if (EXPECTED(retval != NULL)) {
- if (Z_REFCOUNTED_P(retval)) Z_ADDREF_P(retval);
switch (type) {
case BP_VAR_R:
case BP_VAR_IS:
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), retval);
+ ZVAL_COPY(EX_VAR(opline->result.var), retval);
break;
case BP_VAR_UNSET: {
//??? zend_free_op free_res;
if (IS_VAR == IS_VAR && UNEXPECTED(Z_TYPE_P(container) == IS_STR_OFFSET)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
}
- zend_fetch_dimension_address(EX_VAR(opline->result.var), container, opline->op2.zv, IS_CONST, BP_VAR_W TSRMLS_CC);
+ zend_fetch_dimension_address(EX_VAR(opline->result.var), container, opline->op2.zv, IS_CONST, BP_VAR_W, opline->extended_value != 0 TSRMLS_CC);
if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
}
-
if (free_op1.var) {zval_ptr_dtor_nogc(free_op1.var);};
-
- /* We are going to assign the result by reference */
- if (UNEXPECTED(opline->extended_value != 0)) {
- zval *retval_ptr = EX_VAR(opline->result.var);
-
- if (Z_TYPE_P(retval_ptr) != IS_STR_OFFSET) {
- zval *retval_ind = retval_ptr;
-
- if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
- retval_ptr = Z_INDIRECT_P(retval_ptr);
- if (retval_ptr == &EG(uninitialized_zval) || retval_ptr == &EG(error_zval)) {
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
- }
- }
- if (!Z_ISREF_P(retval_ptr)) {
- if (Z_REFCOUNTED_P(retval_ptr)) {
- Z_DELREF_P(retval_ptr);
- SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
- } else {
- ZVAL_NEW_REF(retval_ptr, retval_ptr);
- }
- Z_ADDREF_P(retval_ptr);
- if (retval_ind != retval_ptr) {
- ZVAL_REF(retval_ind, Z_REF_P(retval_ptr));
- }
- }
- }
- }
-
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
if (IS_VAR == IS_VAR && UNEXPECTED(Z_TYPE_P(container) == IS_STR_OFFSET)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
}
- zend_fetch_dimension_address(EX_VAR(opline->result.var), container, opline->op2.zv, IS_CONST, BP_VAR_RW TSRMLS_CC);
+ zend_fetch_dimension_address(EX_VAR(opline->result.var), container, opline->op2.zv, IS_CONST, BP_VAR_RW, 0 TSRMLS_CC);
if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
}
- zend_fetch_dimension_address(EX_VAR(opline->result.var), container, opline->op2.zv, IS_CONST, BP_VAR_W TSRMLS_CC);
+ zend_fetch_dimension_address(EX_VAR(opline->result.var), container, opline->op2.zv, IS_CONST, BP_VAR_W, 0 TSRMLS_CC);
if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
}
SAVE_OPLINE();
container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
- if (IS_VAR == IS_CV) {
- SEPARATE_ZVAL_IF_NOT_REF(container);
- }
if (IS_VAR == IS_VAR && UNEXPECTED(Z_TYPE_P(container) == IS_STR_OFFSET)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
}
- zend_fetch_dimension_address(EX_VAR(opline->result.var), container, opline->op2.zv, IS_CONST, BP_VAR_UNSET TSRMLS_CC);
+ zend_fetch_dimension_address(EX_VAR(opline->result.var), container, opline->op2.zv, IS_CONST, BP_VAR_UNSET, 0 TSRMLS_CC);
if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
}
if (free_op1.var) {zval_ptr_dtor_nogc(free_op1.var);};
- if (UNEXPECTED(Z_TYPE_P(EX_VAR(opline->result.var)) == IS_STR_OFFSET)) {
- zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
- ZEND_VM_NEXT_OPCODE();
- } else {
- zend_free_op free_res;
- zval *retval_ptr = EX_VAR(opline->result.var);
-
- if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
- retval_ptr = Z_INDIRECT_P(retval_ptr);
- }
- PZVAL_UNLOCK(retval_ptr, &free_res);
- SEPARATE_ZVAL_IF_NOT_REF(retval_ptr);
- PZVAL_LOCK(retval_ptr);
- FREE_OP_VAR_PTR(free_res);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
- }
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
}
static int ZEND_FASTCALL zend_fetch_property_address_read_helper_SPEC_VAR_CONST(ZEND_OPCODE_HANDLER_ARGS)
zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
}
- zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_W TSRMLS_CC);
+ zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_W, (opline->extended_value & ZEND_FETCH_MAKE_REF) != 0 TSRMLS_CC);
//??? if (0) {
//??? zval_ptr_dtor(property);
//??? } else {
EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
}
if (free_op1.var) {zval_ptr_dtor_nogc(free_op1.var);};
-
- /* We are going to assign the result by reference */
- if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
- zval *retval_ptr = EX_VAR(opline->result.var);
- zval *retval_ind = retval_ptr;
-
- if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
- retval_ptr = Z_INDIRECT_P(retval_ptr);
- if (retval_ptr == &EG(uninitialized_zval) || retval_ptr == &EG(error_zval)) {
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
- }
- }
- if (!Z_ISREF_P(retval_ptr)) {
- if (Z_REFCOUNTED_P(retval_ptr)) {
- Z_DELREF_P(retval_ptr);
- SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
- } else {
- ZVAL_NEW_REF(retval_ptr, retval_ptr);
- }
- Z_ADDREF_P(retval_ptr);
- if (retval_ind != retval_ptr) {
- ZVAL_REF(retval_ind, Z_REF_P(retval_ptr));
- }
- }
- }
-
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
if (IS_VAR == IS_VAR && UNEXPECTED(Z_TYPE_P(container) == IS_STR_OFFSET)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
}
- zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_RW TSRMLS_CC);
+ zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_RW, 0 TSRMLS_CC);
//??? if (0) {
//??? zval_ptr_dtor(property);
//??? } else {
if (IS_VAR == IS_VAR && UNEXPECTED(Z_TYPE_P(container) == IS_STR_OFFSET)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
}
- zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_W TSRMLS_CC);
+ zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_W, 0 TSRMLS_CC);
//??? if (0) {
//??? zval_ptr_dtor(property);
//??? } else {
static int ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1, free_res;
+ zend_free_op free_op1;
zval *container, *property, *retval_ptr;
SAVE_OPLINE();
container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
property = opline->op2.zv;
- if (IS_VAR == IS_CV) {
- SEPARATE_ZVAL_IF_NOT_REF(container);
- }
//??? if (0) {
//??? MAKE_REAL_ZVAL_PTR(property);
//??? }
if (IS_VAR == IS_VAR && UNEXPECTED(Z_TYPE_P(container) == IS_STR_OFFSET)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
}
- zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_UNSET TSRMLS_CC);
+ zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_UNSET, 0 TSRMLS_CC);
//??? if (0) {
//??? zval_ptr_dtor(property);
//??? } else {
EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
}
if (free_op1.var) {zval_ptr_dtor_nogc(free_op1.var);};
-
- retval_ptr = EX_VAR(opline->result.var);
- if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
- retval_ptr = Z_INDIRECT_P(retval_ptr);
- }
- PZVAL_UNLOCK(retval_ptr, &free_res);
- SEPARATE_ZVAL_IF_NOT_REF(retval_ptr);
- PZVAL_LOCK(retval_ptr);
- FREE_OP_VAR_PTR(free_res);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
zval *dim = opline->op2.zv;
zval *variable_ptr;
- zend_fetch_dimension_address(EX_VAR((opline+1)->op2.var), object_ptr, dim, IS_CONST, BP_VAR_W TSRMLS_CC);
+ zend_fetch_dimension_address(EX_VAR((opline+1)->op2.var), object_ptr, dim, IS_CONST, BP_VAR_W, 0 TSRMLS_CC);
value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, execute_data, &free_op_data1, BP_VAR_R);
variable_ptr = _get_zval_ptr_ptr_var((opline+1)->op2.var, execute_data, &free_op_data2 TSRMLS_CC);
SAVE_OPLINE();
container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
- if (IS_VAR == IS_CV) {
+ if (IS_VAR != IS_UNUSED) {
SEPARATE_ZVAL_IF_NOT_REF(container);
}
offset = opline->op2.zv;
- if (IS_VAR != IS_VAR || container) {
container_again:
- switch (Z_TYPE_P(container)) {
- case IS_ARRAY: {
- HashTable *ht = Z_ARRVAL_P(container);
+ switch (Z_TYPE_P(container)) {
+ case IS_ARRAY: {
+ HashTable *ht = Z_ARRVAL_P(container);
offset_again:
- switch (Z_TYPE_P(offset)) {
- case IS_DOUBLE:
- hval = zend_dval_to_lval(Z_DVAL_P(offset));
- zend_hash_index_del(ht, hval);
- break;
- case IS_RESOURCE:
- case IS_BOOL:
- case IS_LONG:
- hval = Z_LVAL_P(offset);
- 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) {
- ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_dim);
- }
- if (ht == &EG(symbol_table).ht) {
- zend_delete_global_variable(Z_STR_P(offset) TSRMLS_CC);
- } else {
- zend_hash_del(ht, Z_STR_P(offset));
- }
- if (IS_CONST == IS_CV || IS_CONST == IS_VAR) {
- zval_ptr_dtor(offset);
- }
- break;
+ switch (Z_TYPE_P(offset)) {
+ case IS_DOUBLE:
+ hval = zend_dval_to_lval(Z_DVAL_P(offset));
+ zend_hash_index_del(ht, hval);
+ break;
+ case IS_RESOURCE:
+ case IS_BOOL:
+ case IS_LONG:
+ hval = Z_LVAL_P(offset);
+ 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) {
+ ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_dim);
+ }
+ if (ht == &EG(symbol_table).ht) {
+ zend_delete_global_variable(Z_STR_P(offset) TSRMLS_CC);
+ } else {
+ zend_hash_del(ht, Z_STR_P(offset));
+ }
+ if (IS_CONST == IS_CV || IS_CONST == IS_VAR) {
+ zval_ptr_dtor(offset);
+ }
+ break;
num_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());
- break;
- case IS_REFERENCE:
- offset = Z_REFVAL_P(offset);
- goto offset_again;
- break;
- default:
- zend_error(E_WARNING, "Illegal offset type in unset");
- break;
- }
-
- break;
+ 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());
+ break;
+ case IS_REFERENCE:
+ offset = Z_REFVAL_P(offset);
+ goto offset_again;
+ break;
+ default:
+ zend_error(E_WARNING, "Illegal offset type in unset");
+ break;
}
- case IS_OBJECT:
- if (UNEXPECTED(Z_OBJ_HT_P(container)->unset_dimension == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use object as array");
- }
-//??? if (0) {
-//???? if (IS_CONST == IS_CONST) {
-//???? ZVAL_DUP(offset, offset);
-//???? } else if (IS_CONST == IS_TMP_VAR) {
-//??? MAKE_REAL_ZVAL_PTR(offset);
-//??? }
- Z_OBJ_HT_P(container)->unset_dimension(container, offset TSRMLS_CC);
-//??? if (0) {
-//???? if (IS_CONST == IS_CONST || IS_CONST == IS_TMP_VAR) {
-//??? zval_ptr_dtor(offset);
-//??? } else {
-
-//??? }
- break;
- case IS_STRING:
- zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
- ZEND_VM_CONTINUE(); /* bailed out before */
- case IS_REFERENCE:
- container = Z_REFVAL_P(container);
- goto container_again;
- break;
- default:
- break;
+ break;
}
- } else {
+ case IS_OBJECT:
+ if (UNEXPECTED(Z_OBJ_HT_P(container)->unset_dimension == NULL)) {
+ zend_error_noreturn(E_ERROR, "Cannot use object as array");
+ }
+//??? if (0) {
+//???? if (IS_CONST == IS_CONST) {
+//???? ZVAL_DUP(offset, offset);
+//???? } else if (IS_CONST == IS_TMP_VAR) {
+//??? MAKE_REAL_ZVAL_PTR(offset);
+//??? }
+ Z_OBJ_HT_P(container)->unset_dimension(container, offset TSRMLS_CC);
+//??? if (0) {
+//???? if (IS_CONST == IS_CONST || IS_CONST == IS_TMP_VAR) {
+//??? zval_ptr_dtor(offset);
+//??? } else {
+//??? }
+ break;
+ case IS_STRING:
+ case IS_STR_OFFSET:
+ zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
+ ZEND_VM_CONTINUE(); /* bailed out before */
+ case IS_REFERENCE:
+ container = Z_REFVAL_P(container);
+ goto container_again;
+ break;
+ default:
+
+ break;
}
if (free_op1.var) {zval_ptr_dtor_nogc(free_op1.var);};
-
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
SAVE_OPLINE();
container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
+ if (IS_VAR == IS_VAR && Z_TYPE_P(container) == IS_STR_OFFSET) {
+ zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
+ }
offset = opline->op2.zv;
- if (IS_VAR != IS_VAR || container) {
- if (IS_VAR == IS_CV) {
- SEPARATE_ZVAL_IF_NOT_REF(container);
- }
- if (Z_TYPE_P(container) == IS_OBJECT) {
+ ZVAL_DEREF(container);
+ if (Z_TYPE_P(container) == IS_OBJECT) {
//??? if (0) {
//??? MAKE_REAL_ZVAL_PTR(offset);
//??? }
- if (Z_OBJ_HT_P(container)->unset_property) {
- Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
- } else {
- zend_error(E_NOTICE, "Trying to unset property of non-object");
- }
-//??? if (0) {
-//??? zval_ptr_dtor(offset);
-//??? } else {
-
-//??? }
+ if (Z_OBJ_HT_P(container)->unset_property) {
+ Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
} else {
-
+ zend_error(E_NOTICE, "Trying to unset property of non-object");
}
+//??? if (0) {
+//??? zval_ptr_dtor(offset);
+//??? } else {
+
+//??? }
} else {
}
} else {
zval *dim = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
- zend_fetch_dimension_address(EX_VAR((opline+1)->op2.var), container, dim, IS_TMP_VAR, BP_VAR_RW TSRMLS_CC);
+ zend_fetch_dimension_address(EX_VAR((opline+1)->op2.var), container, dim, IS_TMP_VAR, BP_VAR_RW, 0 TSRMLS_CC);
value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, execute_data, &free_op_data1, BP_VAR_R);
var_ptr = _get_zval_ptr_ptr_var((opline+1)->op2.var, execute_data, &free_op_data2 TSRMLS_CC);
}
if (IS_VAR == IS_VAR && UNEXPECTED(Z_TYPE_P(container) == IS_STR_OFFSET)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
}
- zend_fetch_dimension_address(EX_VAR(opline->result.var), container, _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_TMP_VAR, BP_VAR_W TSRMLS_CC);
+ zend_fetch_dimension_address(EX_VAR(opline->result.var), container, _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_TMP_VAR, BP_VAR_W, opline->extended_value != 0 TSRMLS_CC);
zval_dtor(free_op2.var);
if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
}
-
if (free_op1.var) {zval_ptr_dtor_nogc(free_op1.var);};
-
- /* We are going to assign the result by reference */
- if (UNEXPECTED(opline->extended_value != 0)) {
- zval *retval_ptr = EX_VAR(opline->result.var);
-
- if (Z_TYPE_P(retval_ptr) != IS_STR_OFFSET) {
- zval *retval_ind = retval_ptr;
-
- if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
- retval_ptr = Z_INDIRECT_P(retval_ptr);
- if (retval_ptr == &EG(uninitialized_zval) || retval_ptr == &EG(error_zval)) {
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
- }
- }
- if (!Z_ISREF_P(retval_ptr)) {
- if (Z_REFCOUNTED_P(retval_ptr)) {
- Z_DELREF_P(retval_ptr);
- SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
- } else {
- ZVAL_NEW_REF(retval_ptr, retval_ptr);
- }
- Z_ADDREF_P(retval_ptr);
- if (retval_ind != retval_ptr) {
- ZVAL_REF(retval_ind, Z_REF_P(retval_ptr));
- }
- }
- }
- }
-
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
if (IS_VAR == IS_VAR && UNEXPECTED(Z_TYPE_P(container) == IS_STR_OFFSET)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
}
- zend_fetch_dimension_address(EX_VAR(opline->result.var), container, _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_TMP_VAR, BP_VAR_RW TSRMLS_CC);
+ zend_fetch_dimension_address(EX_VAR(opline->result.var), container, _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_TMP_VAR, BP_VAR_RW, 0 TSRMLS_CC);
zval_dtor(free_op2.var);
if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
}
- zend_fetch_dimension_address(EX_VAR(opline->result.var), container, _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_TMP_VAR, BP_VAR_W TSRMLS_CC);
+ zend_fetch_dimension_address(EX_VAR(opline->result.var), container, _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_TMP_VAR, BP_VAR_W, 0 TSRMLS_CC);
if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
}
SAVE_OPLINE();
container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
- if (IS_VAR == IS_CV) {
- SEPARATE_ZVAL_IF_NOT_REF(container);
- }
if (IS_VAR == IS_VAR && UNEXPECTED(Z_TYPE_P(container) == IS_STR_OFFSET)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
}
- zend_fetch_dimension_address(EX_VAR(opline->result.var), container, _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_TMP_VAR, BP_VAR_UNSET TSRMLS_CC);
+ zend_fetch_dimension_address(EX_VAR(opline->result.var), container, _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_TMP_VAR, BP_VAR_UNSET, 0 TSRMLS_CC);
zval_dtor(free_op2.var);
if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
}
if (free_op1.var) {zval_ptr_dtor_nogc(free_op1.var);};
- if (UNEXPECTED(Z_TYPE_P(EX_VAR(opline->result.var)) == IS_STR_OFFSET)) {
- zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
- ZEND_VM_NEXT_OPCODE();
- } else {
- zend_free_op free_res;
- zval *retval_ptr = EX_VAR(opline->result.var);
-
- if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
- retval_ptr = Z_INDIRECT_P(retval_ptr);
- }
- PZVAL_UNLOCK(retval_ptr, &free_res);
- SEPARATE_ZVAL_IF_NOT_REF(retval_ptr);
- PZVAL_LOCK(retval_ptr);
- FREE_OP_VAR_PTR(free_res);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
- }
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
}
static int ZEND_FASTCALL zend_fetch_property_address_read_helper_SPEC_VAR_TMP(ZEND_OPCODE_HANDLER_ARGS)
zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
}
- zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_W TSRMLS_CC);
+ zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_W, (opline->extended_value & ZEND_FETCH_MAKE_REF) != 0 TSRMLS_CC);
//??? if (1) {
//??? zval_ptr_dtor(property);
//??? } else {
EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
}
if (free_op1.var) {zval_ptr_dtor_nogc(free_op1.var);};
-
- /* We are going to assign the result by reference */
- if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
- zval *retval_ptr = EX_VAR(opline->result.var);
- zval *retval_ind = retval_ptr;
-
- if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
- retval_ptr = Z_INDIRECT_P(retval_ptr);
- if (retval_ptr == &EG(uninitialized_zval) || retval_ptr == &EG(error_zval)) {
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
- }
- }
- if (!Z_ISREF_P(retval_ptr)) {
- if (Z_REFCOUNTED_P(retval_ptr)) {
- Z_DELREF_P(retval_ptr);
- SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
- } else {
- ZVAL_NEW_REF(retval_ptr, retval_ptr);
- }
- Z_ADDREF_P(retval_ptr);
- if (retval_ind != retval_ptr) {
- ZVAL_REF(retval_ind, Z_REF_P(retval_ptr));
- }
- }
- }
-
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
if (IS_VAR == IS_VAR && UNEXPECTED(Z_TYPE_P(container) == IS_STR_OFFSET)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
}
- zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_RW TSRMLS_CC);
+ zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_RW, 0 TSRMLS_CC);
//??? if (1) {
//??? zval_ptr_dtor(property);
//??? } else {
if (IS_VAR == IS_VAR && UNEXPECTED(Z_TYPE_P(container) == IS_STR_OFFSET)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
}
- zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_W TSRMLS_CC);
+ zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_W, 0 TSRMLS_CC);
//??? if (1) {
//??? zval_ptr_dtor(property);
//??? } else {
static int ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1, free_op2, free_res;
+ zend_free_op free_op1, free_op2;
zval *container, *property, *retval_ptr;
SAVE_OPLINE();
container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
property = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
- if (IS_VAR == IS_CV) {
- SEPARATE_ZVAL_IF_NOT_REF(container);
- }
//??? if (1) {
//??? MAKE_REAL_ZVAL_PTR(property);
//??? }
if (IS_VAR == IS_VAR && UNEXPECTED(Z_TYPE_P(container) == IS_STR_OFFSET)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
}
- zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_UNSET TSRMLS_CC);
+ zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_UNSET, 0 TSRMLS_CC);
//??? if (1) {
//??? zval_ptr_dtor(property);
//??? } else {
EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
}
if (free_op1.var) {zval_ptr_dtor_nogc(free_op1.var);};
-
- retval_ptr = EX_VAR(opline->result.var);
- if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
- retval_ptr = Z_INDIRECT_P(retval_ptr);
- }
- PZVAL_UNLOCK(retval_ptr, &free_res);
- SEPARATE_ZVAL_IF_NOT_REF(retval_ptr);
- PZVAL_LOCK(retval_ptr);
- FREE_OP_VAR_PTR(free_res);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
zval *dim = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
zval *variable_ptr;
- zend_fetch_dimension_address(EX_VAR((opline+1)->op2.var), object_ptr, dim, IS_TMP_VAR, BP_VAR_W TSRMLS_CC);
+ zend_fetch_dimension_address(EX_VAR((opline+1)->op2.var), object_ptr, dim, IS_TMP_VAR, BP_VAR_W, 0 TSRMLS_CC);
zval_dtor(free_op2.var);
value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, execute_data, &free_op_data1, BP_VAR_R);
SAVE_OPLINE();
container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
- if (IS_VAR == IS_CV) {
+ if (IS_VAR != IS_UNUSED) {
SEPARATE_ZVAL_IF_NOT_REF(container);
}
offset = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
- if (IS_VAR != IS_VAR || container) {
container_again:
- switch (Z_TYPE_P(container)) {
- case IS_ARRAY: {
- HashTable *ht = Z_ARRVAL_P(container);
+ switch (Z_TYPE_P(container)) {
+ case IS_ARRAY: {
+ HashTable *ht = Z_ARRVAL_P(container);
offset_again:
- switch (Z_TYPE_P(offset)) {
- case IS_DOUBLE:
- hval = zend_dval_to_lval(Z_DVAL_P(offset));
- zend_hash_index_del(ht, hval);
- break;
- case IS_RESOURCE:
- case IS_BOOL:
- case IS_LONG:
- hval = Z_LVAL_P(offset);
- 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) {
- ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_dim);
- }
- if (ht == &EG(symbol_table).ht) {
- zend_delete_global_variable(Z_STR_P(offset) TSRMLS_CC);
- } 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;
+ switch (Z_TYPE_P(offset)) {
+ case IS_DOUBLE:
+ hval = zend_dval_to_lval(Z_DVAL_P(offset));
+ zend_hash_index_del(ht, hval);
+ break;
+ case IS_RESOURCE:
+ case IS_BOOL:
+ case IS_LONG:
+ hval = Z_LVAL_P(offset);
+ 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) {
+ ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_dim);
+ }
+ if (ht == &EG(symbol_table).ht) {
+ zend_delete_global_variable(Z_STR_P(offset) TSRMLS_CC);
+ } 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;
num_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());
- break;
- case IS_REFERENCE:
- offset = Z_REFVAL_P(offset);
- goto offset_again;
- break;
- default:
- zend_error(E_WARNING, "Illegal offset type in unset");
- break;
- }
- zval_dtor(free_op2.var);
- break;
+ 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());
+ break;
+ case IS_REFERENCE:
+ offset = Z_REFVAL_P(offset);
+ goto offset_again;
+ break;
+ default:
+ zend_error(E_WARNING, "Illegal offset type in unset");
+ break;
}
- case IS_OBJECT:
- if (UNEXPECTED(Z_OBJ_HT_P(container)->unset_dimension == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use object as array");
- }
-//??? if (1) {
-//???? if (IS_TMP_VAR == IS_CONST) {
-//???? ZVAL_DUP(offset, offset);
-//???? } else if (IS_TMP_VAR == IS_TMP_VAR) {
-//??? MAKE_REAL_ZVAL_PTR(offset);
-//??? }
- Z_OBJ_HT_P(container)->unset_dimension(container, offset TSRMLS_CC);
-//??? if (1) {
-//???? if (IS_TMP_VAR == IS_CONST || IS_TMP_VAR == IS_TMP_VAR) {
-//??? zval_ptr_dtor(offset);
-//??? } else {
- zval_dtor(free_op2.var);
-//??? }
- break;
- case IS_STRING:
- zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
- ZEND_VM_CONTINUE(); /* bailed out before */
- case IS_REFERENCE:
- container = Z_REFVAL_P(container);
- goto container_again;
- break;
- default:
- zval_dtor(free_op2.var);
- break;
+ zval_dtor(free_op2.var);
+ break;
}
- } else {
- zval_dtor(free_op2.var);
+ case IS_OBJECT:
+ if (UNEXPECTED(Z_OBJ_HT_P(container)->unset_dimension == NULL)) {
+ zend_error_noreturn(E_ERROR, "Cannot use object as array");
+ }
+//??? if (1) {
+//???? if (IS_TMP_VAR == IS_CONST) {
+//???? ZVAL_DUP(offset, offset);
+//???? } else if (IS_TMP_VAR == IS_TMP_VAR) {
+//??? MAKE_REAL_ZVAL_PTR(offset);
+//??? }
+ Z_OBJ_HT_P(container)->unset_dimension(container, offset TSRMLS_CC);
+//??? if (1) {
+//???? if (IS_TMP_VAR == IS_CONST || IS_TMP_VAR == IS_TMP_VAR) {
+//??? zval_ptr_dtor(offset);
+//??? } else {
+ zval_dtor(free_op2.var);
+//??? }
+ break;
+ case IS_STRING:
+ case IS_STR_OFFSET:
+ zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
+ ZEND_VM_CONTINUE(); /* bailed out before */
+ case IS_REFERENCE:
+ container = Z_REFVAL_P(container);
+ goto container_again;
+ break;
+ default:
+ zval_dtor(free_op2.var);
+ break;
}
if (free_op1.var) {zval_ptr_dtor_nogc(free_op1.var);};
-
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
SAVE_OPLINE();
container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
+ if (IS_VAR == IS_VAR && Z_TYPE_P(container) == IS_STR_OFFSET) {
+ zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
+ }
offset = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
- if (IS_VAR != IS_VAR || container) {
- if (IS_VAR == IS_CV) {
- SEPARATE_ZVAL_IF_NOT_REF(container);
- }
- if (Z_TYPE_P(container) == IS_OBJECT) {
+ ZVAL_DEREF(container);
+ if (Z_TYPE_P(container) == IS_OBJECT) {
//??? if (1) {
//??? MAKE_REAL_ZVAL_PTR(offset);
//??? }
- if (Z_OBJ_HT_P(container)->unset_property) {
- Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
- } else {
- zend_error(E_NOTICE, "Trying to unset property of non-object");
- }
-//??? if (1) {
-//??? zval_ptr_dtor(offset);
-//??? } else {
- zval_dtor(free_op2.var);
-//??? }
+ if (Z_OBJ_HT_P(container)->unset_property) {
+ Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
} else {
- zval_dtor(free_op2.var);
+ zend_error(E_NOTICE, "Trying to unset property of non-object");
}
+//??? if (1) {
+//??? zval_ptr_dtor(offset);
+//??? } else {
+ zval_dtor(free_op2.var);
+//??? }
} else {
zval_dtor(free_op2.var);
}
} else {
zval *dim = _get_zval_ptr_var_deref(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
- zend_fetch_dimension_address(EX_VAR((opline+1)->op2.var), container, dim, IS_VAR, BP_VAR_RW TSRMLS_CC);
+ zend_fetch_dimension_address(EX_VAR((opline+1)->op2.var), container, dim, IS_VAR, BP_VAR_RW, 0 TSRMLS_CC);
value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, execute_data, &free_op_data1, BP_VAR_R);
var_ptr = _get_zval_ptr_ptr_var((opline+1)->op2.var, execute_data, &free_op_data2 TSRMLS_CC);
}
zval_ptr_dtor_nogc(free_op1.var);
} else {
target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
-/*
- if (!target_symbol_table) {
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
- }
-*/
if ((retval = zend_hash_find(target_symbol_table, Z_STR_P(varname))) == NULL) {
switch (type) {
case BP_VAR_R:
break;
EMPTY_SWITCH_DEFAULT_CASE()
}
-//??? GLOBAL or $$name variable may be an INDIRECT pointer to CV
- } else if (/*(opline->extended_value & ZEND_FETCH_TYPE_MASK) != ZEND_FETCH_STATIC &&*/
+ /* GLOBAL or $$name variable may be an INDIRECT pointer to CV */
+ } else if (/* ??? (opline->extended_value & ZEND_FETCH_TYPE_MASK) != ZEND_FETCH_STATIC &&*/
Z_TYPE_P(retval) == IS_INDIRECT) {
retval = Z_INDIRECT_P(retval);
if (Z_TYPE_P(retval) == IS_UNDEF) {
}
if (EXPECTED(retval != NULL)) {
- if (Z_REFCOUNTED_P(retval)) Z_ADDREF_P(retval);
switch (type) {
case BP_VAR_R:
case BP_VAR_IS:
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), retval);
+ ZVAL_COPY(EX_VAR(opline->result.var), retval);
break;
case BP_VAR_UNSET: {
//??? zend_free_op free_res;
if (IS_VAR == IS_VAR && UNEXPECTED(Z_TYPE_P(container) == IS_STR_OFFSET)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
}
- zend_fetch_dimension_address(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_W TSRMLS_CC);
+ zend_fetch_dimension_address(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_W, opline->extended_value != 0 TSRMLS_CC);
zval_ptr_dtor_nogc(free_op2.var);
if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
}
-
if (free_op1.var) {zval_ptr_dtor_nogc(free_op1.var);};
-
- /* We are going to assign the result by reference */
- if (UNEXPECTED(opline->extended_value != 0)) {
- zval *retval_ptr = EX_VAR(opline->result.var);
-
- if (Z_TYPE_P(retval_ptr) != IS_STR_OFFSET) {
- zval *retval_ind = retval_ptr;
-
- if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
- retval_ptr = Z_INDIRECT_P(retval_ptr);
- if (retval_ptr == &EG(uninitialized_zval) || retval_ptr == &EG(error_zval)) {
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
- }
- }
- if (!Z_ISREF_P(retval_ptr)) {
- if (Z_REFCOUNTED_P(retval_ptr)) {
- Z_DELREF_P(retval_ptr);
- SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
- } else {
- ZVAL_NEW_REF(retval_ptr, retval_ptr);
- }
- Z_ADDREF_P(retval_ptr);
- if (retval_ind != retval_ptr) {
- ZVAL_REF(retval_ind, Z_REF_P(retval_ptr));
- }
- }
- }
- }
-
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
if (IS_VAR == IS_VAR && UNEXPECTED(Z_TYPE_P(container) == IS_STR_OFFSET)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
}
- zend_fetch_dimension_address(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_RW TSRMLS_CC);
+ zend_fetch_dimension_address(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_RW, 0 TSRMLS_CC);
zval_ptr_dtor_nogc(free_op2.var);
if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
}
- zend_fetch_dimension_address(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_W TSRMLS_CC);
+ zend_fetch_dimension_address(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_W, 0 TSRMLS_CC);
if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
}
SAVE_OPLINE();
container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
- if (IS_VAR == IS_CV) {
- SEPARATE_ZVAL_IF_NOT_REF(container);
- }
if (IS_VAR == IS_VAR && UNEXPECTED(Z_TYPE_P(container) == IS_STR_OFFSET)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
}
- zend_fetch_dimension_address(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_UNSET TSRMLS_CC);
+ zend_fetch_dimension_address(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_UNSET, 0 TSRMLS_CC);
zval_ptr_dtor_nogc(free_op2.var);
if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
}
if (free_op1.var) {zval_ptr_dtor_nogc(free_op1.var);};
- if (UNEXPECTED(Z_TYPE_P(EX_VAR(opline->result.var)) == IS_STR_OFFSET)) {
- zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
- ZEND_VM_NEXT_OPCODE();
- } else {
- zend_free_op free_res;
- zval *retval_ptr = EX_VAR(opline->result.var);
-
- if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
- retval_ptr = Z_INDIRECT_P(retval_ptr);
- }
- PZVAL_UNLOCK(retval_ptr, &free_res);
- SEPARATE_ZVAL_IF_NOT_REF(retval_ptr);
- PZVAL_LOCK(retval_ptr);
- FREE_OP_VAR_PTR(free_res);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
- }
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
}
static int ZEND_FASTCALL zend_fetch_property_address_read_helper_SPEC_VAR_VAR(ZEND_OPCODE_HANDLER_ARGS)
zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
}
- zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_W TSRMLS_CC);
+ zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_W, (opline->extended_value & ZEND_FETCH_MAKE_REF) != 0 TSRMLS_CC);
//??? if (0) {
//??? zval_ptr_dtor(property);
//??? } else {
EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
}
if (free_op1.var) {zval_ptr_dtor_nogc(free_op1.var);};
-
- /* We are going to assign the result by reference */
- if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
- zval *retval_ptr = EX_VAR(opline->result.var);
- zval *retval_ind = retval_ptr;
-
- if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
- retval_ptr = Z_INDIRECT_P(retval_ptr);
- if (retval_ptr == &EG(uninitialized_zval) || retval_ptr == &EG(error_zval)) {
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
- }
- }
- if (!Z_ISREF_P(retval_ptr)) {
- if (Z_REFCOUNTED_P(retval_ptr)) {
- Z_DELREF_P(retval_ptr);
- SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
- } else {
- ZVAL_NEW_REF(retval_ptr, retval_ptr);
- }
- Z_ADDREF_P(retval_ptr);
- if (retval_ind != retval_ptr) {
- ZVAL_REF(retval_ind, Z_REF_P(retval_ptr));
- }
- }
- }
-
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
if (IS_VAR == IS_VAR && UNEXPECTED(Z_TYPE_P(container) == IS_STR_OFFSET)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
}
- zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_RW TSRMLS_CC);
+ zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_RW, 0 TSRMLS_CC);
//??? if (0) {
//??? zval_ptr_dtor(property);
//??? } else {
if (IS_VAR == IS_VAR && UNEXPECTED(Z_TYPE_P(container) == IS_STR_OFFSET)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
}
- zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_W TSRMLS_CC);
+ zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_W, 0 TSRMLS_CC);
//??? if (0) {
//??? zval_ptr_dtor(property);
//??? } else {
static int ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1, free_op2, free_res;
+ zend_free_op free_op1, free_op2;
zval *container, *property, *retval_ptr;
SAVE_OPLINE();
container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
- if (IS_VAR == IS_CV) {
- SEPARATE_ZVAL_IF_NOT_REF(container);
- }
//??? if (0) {
//??? MAKE_REAL_ZVAL_PTR(property);
//??? }
if (IS_VAR == IS_VAR && UNEXPECTED(Z_TYPE_P(container) == IS_STR_OFFSET)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
}
- zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_UNSET TSRMLS_CC);
+ zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_UNSET, 0 TSRMLS_CC);
//??? if (0) {
//??? zval_ptr_dtor(property);
//??? } else {
EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
}
if (free_op1.var) {zval_ptr_dtor_nogc(free_op1.var);};
-
- retval_ptr = EX_VAR(opline->result.var);
- if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
- retval_ptr = Z_INDIRECT_P(retval_ptr);
- }
- PZVAL_UNLOCK(retval_ptr, &free_res);
- SEPARATE_ZVAL_IF_NOT_REF(retval_ptr);
- PZVAL_LOCK(retval_ptr);
- FREE_OP_VAR_PTR(free_res);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
zval *dim = _get_zval_ptr_var_deref(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
zval *variable_ptr;
- zend_fetch_dimension_address(EX_VAR((opline+1)->op2.var), object_ptr, dim, IS_VAR, BP_VAR_W TSRMLS_CC);
+ zend_fetch_dimension_address(EX_VAR((opline+1)->op2.var), object_ptr, dim, IS_VAR, BP_VAR_W, 0 TSRMLS_CC);
zval_ptr_dtor_nogc(free_op2.var);
value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, execute_data, &free_op_data1, BP_VAR_R);
SAVE_OPLINE();
container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
- if (IS_VAR == IS_CV) {
+ if (IS_VAR != IS_UNUSED) {
SEPARATE_ZVAL_IF_NOT_REF(container);
}
offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
- if (IS_VAR != IS_VAR || container) {
container_again:
- switch (Z_TYPE_P(container)) {
- case IS_ARRAY: {
- HashTable *ht = Z_ARRVAL_P(container);
+ switch (Z_TYPE_P(container)) {
+ case IS_ARRAY: {
+ HashTable *ht = Z_ARRVAL_P(container);
offset_again:
- switch (Z_TYPE_P(offset)) {
- case IS_DOUBLE:
- hval = zend_dval_to_lval(Z_DVAL_P(offset));
- zend_hash_index_del(ht, hval);
- break;
- case IS_RESOURCE:
- case IS_BOOL:
- case IS_LONG:
- hval = Z_LVAL_P(offset);
- 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) {
- ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_dim);
- }
- if (ht == &EG(symbol_table).ht) {
- zend_delete_global_variable(Z_STR_P(offset) TSRMLS_CC);
- } else {
- zend_hash_del(ht, Z_STR_P(offset));
- }
- if (IS_VAR == IS_CV || IS_VAR == IS_VAR) {
- zval_ptr_dtor(offset);
- }
- break;
+ switch (Z_TYPE_P(offset)) {
+ case IS_DOUBLE:
+ hval = zend_dval_to_lval(Z_DVAL_P(offset));
+ zend_hash_index_del(ht, hval);
+ break;
+ case IS_RESOURCE:
+ case IS_BOOL:
+ case IS_LONG:
+ hval = Z_LVAL_P(offset);
+ 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) {
+ ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_dim);
+ }
+ if (ht == &EG(symbol_table).ht) {
+ zend_delete_global_variable(Z_STR_P(offset) TSRMLS_CC);
+ } else {
+ zend_hash_del(ht, Z_STR_P(offset));
+ }
+ if (IS_VAR == IS_CV || IS_VAR == IS_VAR) {
+ zval_ptr_dtor(offset);
+ }
+ break;
num_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());
- break;
- case IS_REFERENCE:
- offset = Z_REFVAL_P(offset);
- goto offset_again;
- break;
- default:
- zend_error(E_WARNING, "Illegal offset type in unset");
- break;
- }
- zval_ptr_dtor_nogc(free_op2.var);
- break;
+ 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());
+ break;
+ case IS_REFERENCE:
+ offset = Z_REFVAL_P(offset);
+ goto offset_again;
+ break;
+ default:
+ zend_error(E_WARNING, "Illegal offset type in unset");
+ break;
}
- case IS_OBJECT:
- if (UNEXPECTED(Z_OBJ_HT_P(container)->unset_dimension == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use object as array");
- }
-//??? if (0) {
-//???? if (IS_VAR == IS_CONST) {
-//???? ZVAL_DUP(offset, offset);
-//???? } else if (IS_VAR == IS_TMP_VAR) {
-//??? MAKE_REAL_ZVAL_PTR(offset);
-//??? }
- Z_OBJ_HT_P(container)->unset_dimension(container, offset TSRMLS_CC);
-//??? if (0) {
-//???? if (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR) {
-//??? zval_ptr_dtor(offset);
-//??? } else {
- zval_ptr_dtor_nogc(free_op2.var);
-//??? }
- break;
- case IS_STRING:
- zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
- ZEND_VM_CONTINUE(); /* bailed out before */
- case IS_REFERENCE:
- container = Z_REFVAL_P(container);
- goto container_again;
- break;
- default:
- zval_ptr_dtor_nogc(free_op2.var);
- break;
+ zval_ptr_dtor_nogc(free_op2.var);
+ break;
}
- } else {
- zval_ptr_dtor_nogc(free_op2.var);
+ case IS_OBJECT:
+ if (UNEXPECTED(Z_OBJ_HT_P(container)->unset_dimension == NULL)) {
+ zend_error_noreturn(E_ERROR, "Cannot use object as array");
+ }
+//??? if (0) {
+//???? if (IS_VAR == IS_CONST) {
+//???? ZVAL_DUP(offset, offset);
+//???? } else if (IS_VAR == IS_TMP_VAR) {
+//??? MAKE_REAL_ZVAL_PTR(offset);
+//??? }
+ Z_OBJ_HT_P(container)->unset_dimension(container, offset TSRMLS_CC);
+//??? if (0) {
+//???? if (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR) {
+//??? zval_ptr_dtor(offset);
+//??? } else {
+ zval_ptr_dtor_nogc(free_op2.var);
+//??? }
+ break;
+ case IS_STRING:
+ case IS_STR_OFFSET:
+ zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
+ ZEND_VM_CONTINUE(); /* bailed out before */
+ case IS_REFERENCE:
+ container = Z_REFVAL_P(container);
+ goto container_again;
+ break;
+ default:
+ zval_ptr_dtor_nogc(free_op2.var);
+ break;
}
if (free_op1.var) {zval_ptr_dtor_nogc(free_op1.var);};
-
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
SAVE_OPLINE();
container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
+ if (IS_VAR == IS_VAR && Z_TYPE_P(container) == IS_STR_OFFSET) {
+ zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
+ }
offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
- if (IS_VAR != IS_VAR || container) {
- if (IS_VAR == IS_CV) {
- SEPARATE_ZVAL_IF_NOT_REF(container);
- }
- if (Z_TYPE_P(container) == IS_OBJECT) {
+ ZVAL_DEREF(container);
+ if (Z_TYPE_P(container) == IS_OBJECT) {
//??? if (0) {
//??? MAKE_REAL_ZVAL_PTR(offset);
//??? }
- if (Z_OBJ_HT_P(container)->unset_property) {
- Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
- } else {
- zend_error(E_NOTICE, "Trying to unset property of non-object");
- }
-//??? if (0) {
-//??? zval_ptr_dtor(offset);
-//??? } else {
- zval_ptr_dtor_nogc(free_op2.var);
-//??? }
+ if (Z_OBJ_HT_P(container)->unset_property) {
+ Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
} else {
- zval_ptr_dtor_nogc(free_op2.var);
+ zend_error(E_NOTICE, "Trying to unset property of non-object");
}
+//??? if (0) {
+//??? zval_ptr_dtor(offset);
+//??? } else {
+ zval_ptr_dtor_nogc(free_op2.var);
+//??? }
} else {
zval_ptr_dtor_nogc(free_op2.var);
}
} else {
zval *dim = NULL;
- zend_fetch_dimension_address(EX_VAR((opline+1)->op2.var), container, dim, IS_UNUSED, BP_VAR_RW TSRMLS_CC);
+ zend_fetch_dimension_address(EX_VAR((opline+1)->op2.var), container, dim, IS_UNUSED, BP_VAR_RW, 0 TSRMLS_CC);
value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, execute_data, &free_op_data1, BP_VAR_R);
var_ptr = _get_zval_ptr_ptr_var((opline+1)->op2.var, execute_data, &free_op_data2 TSRMLS_CC);
}
zval_ptr_dtor_nogc(free_op1.var);
} else {
target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
-/*
- if (!target_symbol_table) {
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
- }
-*/
if ((retval = zend_hash_find(target_symbol_table, Z_STR_P(varname))) == NULL) {
switch (type) {
case BP_VAR_R:
break;
EMPTY_SWITCH_DEFAULT_CASE()
}
-//??? GLOBAL or $$name variable may be an INDIRECT pointer to CV
- } else if (/*(opline->extended_value & ZEND_FETCH_TYPE_MASK) != ZEND_FETCH_STATIC &&*/
+ /* GLOBAL or $$name variable may be an INDIRECT pointer to CV */
+ } else if (/* ??? (opline->extended_value & ZEND_FETCH_TYPE_MASK) != ZEND_FETCH_STATIC &&*/
Z_TYPE_P(retval) == IS_INDIRECT) {
retval = Z_INDIRECT_P(retval);
if (Z_TYPE_P(retval) == IS_UNDEF) {
}
if (EXPECTED(retval != NULL)) {
- if (Z_REFCOUNTED_P(retval)) Z_ADDREF_P(retval);
switch (type) {
case BP_VAR_R:
case BP_VAR_IS:
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), retval);
+ ZVAL_COPY(EX_VAR(opline->result.var), retval);
break;
case BP_VAR_UNSET: {
//??? zend_free_op free_res;
if (IS_VAR == IS_VAR && UNEXPECTED(Z_TYPE_P(container) == IS_STR_OFFSET)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
}
- zend_fetch_dimension_address(EX_VAR(opline->result.var), container, NULL, IS_UNUSED, BP_VAR_W TSRMLS_CC);
+ zend_fetch_dimension_address(EX_VAR(opline->result.var), container, NULL, IS_UNUSED, BP_VAR_W, opline->extended_value != 0 TSRMLS_CC);
if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
}
-
if (free_op1.var) {zval_ptr_dtor_nogc(free_op1.var);};
-
- /* We are going to assign the result by reference */
- if (UNEXPECTED(opline->extended_value != 0)) {
- zval *retval_ptr = EX_VAR(opline->result.var);
-
- if (Z_TYPE_P(retval_ptr) != IS_STR_OFFSET) {
- zval *retval_ind = retval_ptr;
-
- if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
- retval_ptr = Z_INDIRECT_P(retval_ptr);
- if (retval_ptr == &EG(uninitialized_zval) || retval_ptr == &EG(error_zval)) {
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
- }
- }
- if (!Z_ISREF_P(retval_ptr)) {
- if (Z_REFCOUNTED_P(retval_ptr)) {
- Z_DELREF_P(retval_ptr);
- SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
- } else {
- ZVAL_NEW_REF(retval_ptr, retval_ptr);
- }
- Z_ADDREF_P(retval_ptr);
- if (retval_ind != retval_ptr) {
- ZVAL_REF(retval_ind, Z_REF_P(retval_ptr));
- }
- }
- }
- }
-
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
if (IS_VAR == IS_VAR && UNEXPECTED(Z_TYPE_P(container) == IS_STR_OFFSET)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
}
- zend_fetch_dimension_address(EX_VAR(opline->result.var), container, NULL, IS_UNUSED, BP_VAR_RW TSRMLS_CC);
+ zend_fetch_dimension_address(EX_VAR(opline->result.var), container, NULL, IS_UNUSED, BP_VAR_RW, 0 TSRMLS_CC);
if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
}
- zend_fetch_dimension_address(EX_VAR(opline->result.var), container, NULL, IS_UNUSED, BP_VAR_W TSRMLS_CC);
+ zend_fetch_dimension_address(EX_VAR(opline->result.var), container, NULL, IS_UNUSED, BP_VAR_W, 0 TSRMLS_CC);
if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
}
zval *dim = NULL;
zval *variable_ptr;
- zend_fetch_dimension_address(EX_VAR((opline+1)->op2.var), object_ptr, dim, IS_UNUSED, BP_VAR_W TSRMLS_CC);
+ zend_fetch_dimension_address(EX_VAR((opline+1)->op2.var), object_ptr, dim, IS_UNUSED, BP_VAR_W, 0 TSRMLS_CC);
value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, execute_data, &free_op_data1, BP_VAR_R);
variable_ptr = _get_zval_ptr_ptr_var((opline+1)->op2.var, execute_data, &free_op_data2 TSRMLS_CC);
} else {
zval *dim = _get_zval_ptr_cv_deref_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC);
- zend_fetch_dimension_address(EX_VAR((opline+1)->op2.var), container, dim, IS_CV, BP_VAR_RW TSRMLS_CC);
+ zend_fetch_dimension_address(EX_VAR((opline+1)->op2.var), container, dim, IS_CV, BP_VAR_RW, 0 TSRMLS_CC);
value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, execute_data, &free_op_data1, BP_VAR_R);
var_ptr = _get_zval_ptr_ptr_var((opline+1)->op2.var, execute_data, &free_op_data2 TSRMLS_CC);
}
if (IS_VAR == IS_VAR && UNEXPECTED(Z_TYPE_P(container) == IS_STR_OFFSET)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
}
- zend_fetch_dimension_address(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC), IS_CV, BP_VAR_W TSRMLS_CC);
+ zend_fetch_dimension_address(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC), IS_CV, BP_VAR_W, opline->extended_value != 0 TSRMLS_CC);
if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
}
-
if (free_op1.var) {zval_ptr_dtor_nogc(free_op1.var);};
-
- /* We are going to assign the result by reference */
- if (UNEXPECTED(opline->extended_value != 0)) {
- zval *retval_ptr = EX_VAR(opline->result.var);
-
- if (Z_TYPE_P(retval_ptr) != IS_STR_OFFSET) {
- zval *retval_ind = retval_ptr;
-
- if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
- retval_ptr = Z_INDIRECT_P(retval_ptr);
- if (retval_ptr == &EG(uninitialized_zval) || retval_ptr == &EG(error_zval)) {
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
- }
- }
- if (!Z_ISREF_P(retval_ptr)) {
- if (Z_REFCOUNTED_P(retval_ptr)) {
- Z_DELREF_P(retval_ptr);
- SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
- } else {
- ZVAL_NEW_REF(retval_ptr, retval_ptr);
- }
- Z_ADDREF_P(retval_ptr);
- if (retval_ind != retval_ptr) {
- ZVAL_REF(retval_ind, Z_REF_P(retval_ptr));
- }
- }
- }
- }
-
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
if (IS_VAR == IS_VAR && UNEXPECTED(Z_TYPE_P(container) == IS_STR_OFFSET)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
}
- zend_fetch_dimension_address(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC), IS_CV, BP_VAR_RW TSRMLS_CC);
+ zend_fetch_dimension_address(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC), IS_CV, BP_VAR_RW, 0 TSRMLS_CC);
if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
}
- zend_fetch_dimension_address(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC), IS_CV, BP_VAR_W TSRMLS_CC);
+ zend_fetch_dimension_address(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC), IS_CV, BP_VAR_W, 0 TSRMLS_CC);
if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
}
SAVE_OPLINE();
container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
- if (IS_VAR == IS_CV) {
- SEPARATE_ZVAL_IF_NOT_REF(container);
- }
if (IS_VAR == IS_VAR && UNEXPECTED(Z_TYPE_P(container) == IS_STR_OFFSET)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
}
- zend_fetch_dimension_address(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC), IS_CV, BP_VAR_UNSET TSRMLS_CC);
+ zend_fetch_dimension_address(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC), IS_CV, BP_VAR_UNSET, 0 TSRMLS_CC);
if (IS_VAR == IS_VAR && (free_op1.var != NULL) && READY_TO_DESTROY(free_op1.var)) {
EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
}
if (free_op1.var) {zval_ptr_dtor_nogc(free_op1.var);};
- if (UNEXPECTED(Z_TYPE_P(EX_VAR(opline->result.var)) == IS_STR_OFFSET)) {
- zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
- ZEND_VM_NEXT_OPCODE();
- } else {
- zend_free_op free_res;
- zval *retval_ptr = EX_VAR(opline->result.var);
-
- if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
- retval_ptr = Z_INDIRECT_P(retval_ptr);
- }
- PZVAL_UNLOCK(retval_ptr, &free_res);
- SEPARATE_ZVAL_IF_NOT_REF(retval_ptr);
- PZVAL_LOCK(retval_ptr);
- FREE_OP_VAR_PTR(free_res);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
- }
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
}
static int ZEND_FASTCALL zend_fetch_property_address_read_helper_SPEC_VAR_CV(ZEND_OPCODE_HANDLER_ARGS)
zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
}
- zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_W TSRMLS_CC);
+ zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_W, (opline->extended_value & ZEND_FETCH_MAKE_REF) != 0 TSRMLS_CC);
//??? if (0) {
//??? zval_ptr_dtor(property);
//??? } else {
EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
}
if (free_op1.var) {zval_ptr_dtor_nogc(free_op1.var);};
-
- /* We are going to assign the result by reference */
- if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
- zval *retval_ptr = EX_VAR(opline->result.var);
- zval *retval_ind = retval_ptr;
-
- if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
- retval_ptr = Z_INDIRECT_P(retval_ptr);
- if (retval_ptr == &EG(uninitialized_zval) || retval_ptr == &EG(error_zval)) {
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
- }
- }
- if (!Z_ISREF_P(retval_ptr)) {
- if (Z_REFCOUNTED_P(retval_ptr)) {
- Z_DELREF_P(retval_ptr);
- SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
- } else {
- ZVAL_NEW_REF(retval_ptr, retval_ptr);
- }
- Z_ADDREF_P(retval_ptr);
- if (retval_ind != retval_ptr) {
- ZVAL_REF(retval_ind, Z_REF_P(retval_ptr));
- }
- }
- }
-
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
if (IS_VAR == IS_VAR && UNEXPECTED(Z_TYPE_P(container) == IS_STR_OFFSET)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
}
- zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_RW TSRMLS_CC);
+ zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_RW, 0 TSRMLS_CC);
//??? if (0) {
//??? zval_ptr_dtor(property);
//??? } else {
if (IS_VAR == IS_VAR && UNEXPECTED(Z_TYPE_P(container) == IS_STR_OFFSET)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
}
- zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_W TSRMLS_CC);
+ zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_W, 0 TSRMLS_CC);
//??? if (0) {
//??? zval_ptr_dtor(property);
//??? } else {
static int ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1, free_res;
+ zend_free_op free_op1;
zval *container, *property, *retval_ptr;
SAVE_OPLINE();
container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC);
- if (IS_VAR == IS_CV) {
- SEPARATE_ZVAL_IF_NOT_REF(container);
- }
//??? if (0) {
//??? MAKE_REAL_ZVAL_PTR(property);
//??? }
if (IS_VAR == IS_VAR && UNEXPECTED(Z_TYPE_P(container) == IS_STR_OFFSET)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
}
- zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_UNSET TSRMLS_CC);
+ zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_UNSET, 0 TSRMLS_CC);
//??? if (0) {
//??? zval_ptr_dtor(property);
//??? } else {
EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
}
if (free_op1.var) {zval_ptr_dtor_nogc(free_op1.var);};
-
- retval_ptr = EX_VAR(opline->result.var);
- if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
- retval_ptr = Z_INDIRECT_P(retval_ptr);
- }
- PZVAL_UNLOCK(retval_ptr, &free_res);
- SEPARATE_ZVAL_IF_NOT_REF(retval_ptr);
- PZVAL_LOCK(retval_ptr);
- FREE_OP_VAR_PTR(free_res);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
zval *dim = _get_zval_ptr_cv_deref_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC);
zval *variable_ptr;
- zend_fetch_dimension_address(EX_VAR((opline+1)->op2.var), object_ptr, dim, IS_CV, BP_VAR_W TSRMLS_CC);
+ zend_fetch_dimension_address(EX_VAR((opline+1)->op2.var), object_ptr, dim, IS_CV, BP_VAR_W, 0 TSRMLS_CC);
value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, execute_data, &free_op_data1, BP_VAR_R);
variable_ptr = _get_zval_ptr_ptr_var((opline+1)->op2.var, execute_data, &free_op_data2 TSRMLS_CC);
SAVE_OPLINE();
container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
- if (IS_VAR == IS_CV) {
+ if (IS_VAR != IS_UNUSED) {
SEPARATE_ZVAL_IF_NOT_REF(container);
}
offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC);
- if (IS_VAR != IS_VAR || container) {
container_again:
- switch (Z_TYPE_P(container)) {
- case IS_ARRAY: {
- HashTable *ht = Z_ARRVAL_P(container);
+ switch (Z_TYPE_P(container)) {
+ case IS_ARRAY: {
+ HashTable *ht = Z_ARRVAL_P(container);
offset_again:
- switch (Z_TYPE_P(offset)) {
- case IS_DOUBLE:
- hval = zend_dval_to_lval(Z_DVAL_P(offset));
- zend_hash_index_del(ht, hval);
- break;
- case IS_RESOURCE:
- case IS_BOOL:
- case IS_LONG:
- hval = Z_LVAL_P(offset);
- 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) {
- ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_dim);
- }
- if (ht == &EG(symbol_table).ht) {
- zend_delete_global_variable(Z_STR_P(offset) TSRMLS_CC);
- } else {
- zend_hash_del(ht, Z_STR_P(offset));
- }
- if (IS_CV == IS_CV || IS_CV == IS_VAR) {
- zval_ptr_dtor(offset);
- }
- break;
+ switch (Z_TYPE_P(offset)) {
+ case IS_DOUBLE:
+ hval = zend_dval_to_lval(Z_DVAL_P(offset));
+ zend_hash_index_del(ht, hval);
+ break;
+ case IS_RESOURCE:
+ case IS_BOOL:
+ case IS_LONG:
+ hval = Z_LVAL_P(offset);
+ 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) {
+ ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_dim);
+ }
+ if (ht == &EG(symbol_table).ht) {
+ zend_delete_global_variable(Z_STR_P(offset) TSRMLS_CC);
+ } else {
+ zend_hash_del(ht, Z_STR_P(offset));
+ }
+ if (IS_CV == IS_CV || IS_CV == IS_VAR) {
+ zval_ptr_dtor(offset);
+ }
+ break;
num_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());
- break;
- case IS_REFERENCE:
- offset = Z_REFVAL_P(offset);
- goto offset_again;
- break;
- default:
- zend_error(E_WARNING, "Illegal offset type in unset");
- break;
- }
-
- break;
+ 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());
+ break;
+ case IS_REFERENCE:
+ offset = Z_REFVAL_P(offset);
+ goto offset_again;
+ break;
+ default:
+ zend_error(E_WARNING, "Illegal offset type in unset");
+ break;
}
- case IS_OBJECT:
- if (UNEXPECTED(Z_OBJ_HT_P(container)->unset_dimension == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use object as array");
- }
-//??? if (0) {
-//???? if (IS_CV == IS_CONST) {
-//???? ZVAL_DUP(offset, offset);
-//???? } else if (IS_CV == IS_TMP_VAR) {
-//??? MAKE_REAL_ZVAL_PTR(offset);
-//??? }
- Z_OBJ_HT_P(container)->unset_dimension(container, offset TSRMLS_CC);
-//??? if (0) {
-//???? if (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR) {
-//??? zval_ptr_dtor(offset);
-//??? } else {
-
-//??? }
- break;
- case IS_STRING:
- zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
- ZEND_VM_CONTINUE(); /* bailed out before */
- case IS_REFERENCE:
- container = Z_REFVAL_P(container);
- goto container_again;
- break;
- default:
- break;
+ break;
}
- } else {
+ case IS_OBJECT:
+ if (UNEXPECTED(Z_OBJ_HT_P(container)->unset_dimension == NULL)) {
+ zend_error_noreturn(E_ERROR, "Cannot use object as array");
+ }
+//??? if (0) {
+//???? if (IS_CV == IS_CONST) {
+//???? ZVAL_DUP(offset, offset);
+//???? } else if (IS_CV == IS_TMP_VAR) {
+//??? MAKE_REAL_ZVAL_PTR(offset);
+//??? }
+ Z_OBJ_HT_P(container)->unset_dimension(container, offset TSRMLS_CC);
+//??? if (0) {
+//???? if (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR) {
+//??? zval_ptr_dtor(offset);
+//??? } else {
+//??? }
+ break;
+ case IS_STRING:
+ case IS_STR_OFFSET:
+ zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
+ ZEND_VM_CONTINUE(); /* bailed out before */
+ case IS_REFERENCE:
+ container = Z_REFVAL_P(container);
+ goto container_again;
+ break;
+ default:
+
+ break;
}
if (free_op1.var) {zval_ptr_dtor_nogc(free_op1.var);};
-
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
SAVE_OPLINE();
container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
+ if (IS_VAR == IS_VAR && Z_TYPE_P(container) == IS_STR_OFFSET) {
+ zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
+ }
offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC);
- if (IS_VAR != IS_VAR || container) {
- if (IS_VAR == IS_CV) {
- SEPARATE_ZVAL_IF_NOT_REF(container);
- }
- if (Z_TYPE_P(container) == IS_OBJECT) {
+ ZVAL_DEREF(container);
+ if (Z_TYPE_P(container) == IS_OBJECT) {
//??? if (0) {
//??? MAKE_REAL_ZVAL_PTR(offset);
//??? }
- if (Z_OBJ_HT_P(container)->unset_property) {
- Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
- } else {
- zend_error(E_NOTICE, "Trying to unset property of non-object");
- }
-//??? if (0) {
-//??? zval_ptr_dtor(offset);
-//??? } else {
-
-//??? }
+ if (Z_OBJ_HT_P(container)->unset_property) {
+ Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
} else {
-
+ zend_error(E_NOTICE, "Trying to unset property of non-object");
}
+//??? if (0) {
+//??? zval_ptr_dtor(offset);
+//??? } else {
+
+//??? }
} else {
}
} else {
zval *dim = opline->op2.zv;
- zend_fetch_dimension_address(EX_VAR((opline+1)->op2.var), container, dim, IS_CONST, BP_VAR_RW TSRMLS_CC);
+ zend_fetch_dimension_address(EX_VAR((opline+1)->op2.var), container, dim, IS_CONST, BP_VAR_RW, 0 TSRMLS_CC);
value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, execute_data, &free_op_data1, BP_VAR_R);
var_ptr = _get_zval_ptr_ptr_var((opline+1)->op2.var, execute_data, &free_op_data2 TSRMLS_CC);
}
zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
}
- zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_W TSRMLS_CC);
+ zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_W, (opline->extended_value & ZEND_FETCH_MAKE_REF) != 0 TSRMLS_CC);
//??? if (0) {
//??? zval_ptr_dtor(property);
//??? } else {
EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
}
- /* We are going to assign the result by reference */
- if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
- zval *retval_ptr = EX_VAR(opline->result.var);
- zval *retval_ind = retval_ptr;
-
- if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
- retval_ptr = Z_INDIRECT_P(retval_ptr);
- if (retval_ptr == &EG(uninitialized_zval) || retval_ptr == &EG(error_zval)) {
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
- }
- }
- if (!Z_ISREF_P(retval_ptr)) {
- if (Z_REFCOUNTED_P(retval_ptr)) {
- Z_DELREF_P(retval_ptr);
- SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
- } else {
- ZVAL_NEW_REF(retval_ptr, retval_ptr);
- }
- Z_ADDREF_P(retval_ptr);
- if (retval_ind != retval_ptr) {
- ZVAL_REF(retval_ind, Z_REF_P(retval_ptr));
- }
- }
- }
-
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
if (IS_UNUSED == IS_VAR && UNEXPECTED(Z_TYPE_P(container) == IS_STR_OFFSET)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
}
- zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_RW TSRMLS_CC);
+ zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_RW, 0 TSRMLS_CC);
//??? if (0) {
//??? zval_ptr_dtor(property);
//??? } else {
if (IS_UNUSED == IS_VAR && UNEXPECTED(Z_TYPE_P(container) == IS_STR_OFFSET)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
}
- zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_W TSRMLS_CC);
+ zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_W, 0 TSRMLS_CC);
//??? if (0) {
//??? zval_ptr_dtor(property);
//??? } else {
static int ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1, free_res;
+ zend_free_op free_op1;
zval *container, *property, *retval_ptr;
SAVE_OPLINE();
container = _get_obj_zval_ptr_unused(TSRMLS_C);
property = opline->op2.zv;
- if (IS_UNUSED == IS_CV) {
- SEPARATE_ZVAL_IF_NOT_REF(container);
- }
//??? if (0) {
//??? MAKE_REAL_ZVAL_PTR(property);
//??? }
if (IS_UNUSED == IS_VAR && UNEXPECTED(Z_TYPE_P(container) == IS_STR_OFFSET)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
}
- zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_UNSET TSRMLS_CC);
+ zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_UNSET, 0 TSRMLS_CC);
//??? if (0) {
//??? zval_ptr_dtor(property);
//??? } else {
EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
}
- retval_ptr = EX_VAR(opline->result.var);
- if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
- retval_ptr = Z_INDIRECT_P(retval_ptr);
- }
- PZVAL_UNLOCK(retval_ptr, &free_res);
- SEPARATE_ZVAL_IF_NOT_REF(retval_ptr);
- PZVAL_LOCK(retval_ptr);
- FREE_OP_VAR_PTR(free_res);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
SAVE_OPLINE();
container = _get_obj_zval_ptr_unused(TSRMLS_C);
- if (IS_UNUSED == IS_CV) {
+ if (IS_UNUSED != IS_UNUSED) {
SEPARATE_ZVAL_IF_NOT_REF(container);
}
offset = opline->op2.zv;
- if (IS_UNUSED != IS_VAR || container) {
container_again:
- switch (Z_TYPE_P(container)) {
- case IS_ARRAY: {
- HashTable *ht = Z_ARRVAL_P(container);
+ switch (Z_TYPE_P(container)) {
+ case IS_ARRAY: {
+ HashTable *ht = Z_ARRVAL_P(container);
offset_again:
- switch (Z_TYPE_P(offset)) {
- case IS_DOUBLE:
- hval = zend_dval_to_lval(Z_DVAL_P(offset));
- zend_hash_index_del(ht, hval);
- break;
- case IS_RESOURCE:
- case IS_BOOL:
- case IS_LONG:
- hval = Z_LVAL_P(offset);
- 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) {
- ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_dim);
- }
- if (ht == &EG(symbol_table).ht) {
- zend_delete_global_variable(Z_STR_P(offset) TSRMLS_CC);
- } else {
- zend_hash_del(ht, Z_STR_P(offset));
- }
- if (IS_CONST == IS_CV || IS_CONST == IS_VAR) {
- zval_ptr_dtor(offset);
- }
- break;
+ switch (Z_TYPE_P(offset)) {
+ case IS_DOUBLE:
+ hval = zend_dval_to_lval(Z_DVAL_P(offset));
+ zend_hash_index_del(ht, hval);
+ break;
+ case IS_RESOURCE:
+ case IS_BOOL:
+ case IS_LONG:
+ hval = Z_LVAL_P(offset);
+ 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) {
+ ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_dim);
+ }
+ if (ht == &EG(symbol_table).ht) {
+ zend_delete_global_variable(Z_STR_P(offset) TSRMLS_CC);
+ } else {
+ zend_hash_del(ht, Z_STR_P(offset));
+ }
+ if (IS_CONST == IS_CV || IS_CONST == IS_VAR) {
+ zval_ptr_dtor(offset);
+ }
+ break;
num_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());
- break;
- case IS_REFERENCE:
- offset = Z_REFVAL_P(offset);
- goto offset_again;
- break;
- default:
- zend_error(E_WARNING, "Illegal offset type in unset");
- break;
- }
-
- break;
+ 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());
+ break;
+ case IS_REFERENCE:
+ offset = Z_REFVAL_P(offset);
+ goto offset_again;
+ break;
+ default:
+ zend_error(E_WARNING, "Illegal offset type in unset");
+ break;
}
- case IS_OBJECT:
- if (UNEXPECTED(Z_OBJ_HT_P(container)->unset_dimension == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use object as array");
- }
-//??? if (0) {
-//???? if (IS_CONST == IS_CONST) {
-//???? ZVAL_DUP(offset, offset);
-//???? } else if (IS_CONST == IS_TMP_VAR) {
-//??? MAKE_REAL_ZVAL_PTR(offset);
-//??? }
- Z_OBJ_HT_P(container)->unset_dimension(container, offset TSRMLS_CC);
-//??? if (0) {
-//???? if (IS_CONST == IS_CONST || IS_CONST == IS_TMP_VAR) {
-//??? zval_ptr_dtor(offset);
-//??? } else {
-
-//??? }
- break;
- case IS_STRING:
- zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
- ZEND_VM_CONTINUE(); /* bailed out before */
- case IS_REFERENCE:
- container = Z_REFVAL_P(container);
- goto container_again;
- break;
- default:
- break;
+ break;
}
- } else {
+ case IS_OBJECT:
+ if (UNEXPECTED(Z_OBJ_HT_P(container)->unset_dimension == NULL)) {
+ zend_error_noreturn(E_ERROR, "Cannot use object as array");
+ }
+//??? if (0) {
+//???? if (IS_CONST == IS_CONST) {
+//???? ZVAL_DUP(offset, offset);
+//???? } else if (IS_CONST == IS_TMP_VAR) {
+//??? MAKE_REAL_ZVAL_PTR(offset);
+//??? }
+ Z_OBJ_HT_P(container)->unset_dimension(container, offset TSRMLS_CC);
+//??? if (0) {
+//???? if (IS_CONST == IS_CONST || IS_CONST == IS_TMP_VAR) {
+//??? zval_ptr_dtor(offset);
+//??? } else {
+//??? }
+ break;
+ case IS_STRING:
+ case IS_STR_OFFSET:
+ zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
+ ZEND_VM_CONTINUE(); /* bailed out before */
+ case IS_REFERENCE:
+ container = Z_REFVAL_P(container);
+ goto container_again;
+ break;
+ default:
+
+ break;
}
CHECK_EXCEPTION();
SAVE_OPLINE();
container = _get_obj_zval_ptr_unused(TSRMLS_C);
+ if (IS_UNUSED == IS_VAR && Z_TYPE_P(container) == IS_STR_OFFSET) {
+ zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
+ }
offset = opline->op2.zv;
- if (IS_UNUSED != IS_VAR || container) {
- if (IS_UNUSED == IS_CV) {
- SEPARATE_ZVAL_IF_NOT_REF(container);
- }
- if (Z_TYPE_P(container) == IS_OBJECT) {
+ ZVAL_DEREF(container);
+ if (Z_TYPE_P(container) == IS_OBJECT) {
//??? if (0) {
//??? MAKE_REAL_ZVAL_PTR(offset);
//??? }
- if (Z_OBJ_HT_P(container)->unset_property) {
- Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
- } else {
- zend_error(E_NOTICE, "Trying to unset property of non-object");
- }
-//??? if (0) {
-//??? zval_ptr_dtor(offset);
-//??? } else {
-
-//??? }
+ if (Z_OBJ_HT_P(container)->unset_property) {
+ Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
} else {
-
+ zend_error(E_NOTICE, "Trying to unset property of non-object");
}
+//??? if (0) {
+//??? zval_ptr_dtor(offset);
+//??? } else {
+
+//??? }
} else {
}
} else {
zval *dim = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
- zend_fetch_dimension_address(EX_VAR((opline+1)->op2.var), container, dim, IS_TMP_VAR, BP_VAR_RW TSRMLS_CC);
+ zend_fetch_dimension_address(EX_VAR((opline+1)->op2.var), container, dim, IS_TMP_VAR, BP_VAR_RW, 0 TSRMLS_CC);
value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, execute_data, &free_op_data1, BP_VAR_R);
var_ptr = _get_zval_ptr_ptr_var((opline+1)->op2.var, execute_data, &free_op_data2 TSRMLS_CC);
}
zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
}
- zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_W TSRMLS_CC);
+ zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_W, (opline->extended_value & ZEND_FETCH_MAKE_REF) != 0 TSRMLS_CC);
//??? if (1) {
//??? zval_ptr_dtor(property);
//??? } else {
EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
}
- /* We are going to assign the result by reference */
- if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
- zval *retval_ptr = EX_VAR(opline->result.var);
- zval *retval_ind = retval_ptr;
-
- if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
- retval_ptr = Z_INDIRECT_P(retval_ptr);
- if (retval_ptr == &EG(uninitialized_zval) || retval_ptr == &EG(error_zval)) {
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
- }
- }
- if (!Z_ISREF_P(retval_ptr)) {
- if (Z_REFCOUNTED_P(retval_ptr)) {
- Z_DELREF_P(retval_ptr);
- SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
- } else {
- ZVAL_NEW_REF(retval_ptr, retval_ptr);
- }
- Z_ADDREF_P(retval_ptr);
- if (retval_ind != retval_ptr) {
- ZVAL_REF(retval_ind, Z_REF_P(retval_ptr));
- }
- }
- }
-
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
if (IS_UNUSED == IS_VAR && UNEXPECTED(Z_TYPE_P(container) == IS_STR_OFFSET)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
}
- zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_RW TSRMLS_CC);
+ zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_RW, 0 TSRMLS_CC);
//??? if (1) {
//??? zval_ptr_dtor(property);
//??? } else {
if (IS_UNUSED == IS_VAR && UNEXPECTED(Z_TYPE_P(container) == IS_STR_OFFSET)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
}
- zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_W TSRMLS_CC);
+ zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_W, 0 TSRMLS_CC);
//??? if (1) {
//??? zval_ptr_dtor(property);
//??? } else {
static int ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1, free_op2, free_res;
+ zend_free_op free_op1, free_op2;
zval *container, *property, *retval_ptr;
SAVE_OPLINE();
container = _get_obj_zval_ptr_unused(TSRMLS_C);
property = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
- if (IS_UNUSED == IS_CV) {
- SEPARATE_ZVAL_IF_NOT_REF(container);
- }
//??? if (1) {
//??? MAKE_REAL_ZVAL_PTR(property);
//??? }
if (IS_UNUSED == IS_VAR && UNEXPECTED(Z_TYPE_P(container) == IS_STR_OFFSET)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
}
- zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_UNSET TSRMLS_CC);
+ zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_UNSET, 0 TSRMLS_CC);
//??? if (1) {
//??? zval_ptr_dtor(property);
//??? } else {
EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
}
- retval_ptr = EX_VAR(opline->result.var);
- if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
- retval_ptr = Z_INDIRECT_P(retval_ptr);
- }
- PZVAL_UNLOCK(retval_ptr, &free_res);
- SEPARATE_ZVAL_IF_NOT_REF(retval_ptr);
- PZVAL_LOCK(retval_ptr);
- FREE_OP_VAR_PTR(free_res);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
SAVE_OPLINE();
container = _get_obj_zval_ptr_unused(TSRMLS_C);
- if (IS_UNUSED == IS_CV) {
+ if (IS_UNUSED != IS_UNUSED) {
SEPARATE_ZVAL_IF_NOT_REF(container);
}
offset = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
- if (IS_UNUSED != IS_VAR || container) {
container_again:
- switch (Z_TYPE_P(container)) {
- case IS_ARRAY: {
- HashTable *ht = Z_ARRVAL_P(container);
+ switch (Z_TYPE_P(container)) {
+ case IS_ARRAY: {
+ HashTable *ht = Z_ARRVAL_P(container);
offset_again:
- switch (Z_TYPE_P(offset)) {
- case IS_DOUBLE:
- hval = zend_dval_to_lval(Z_DVAL_P(offset));
- zend_hash_index_del(ht, hval);
- break;
- case IS_RESOURCE:
- case IS_BOOL:
- case IS_LONG:
- hval = Z_LVAL_P(offset);
- 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) {
- ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_dim);
- }
- if (ht == &EG(symbol_table).ht) {
- zend_delete_global_variable(Z_STR_P(offset) TSRMLS_CC);
- } 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;
+ switch (Z_TYPE_P(offset)) {
+ case IS_DOUBLE:
+ hval = zend_dval_to_lval(Z_DVAL_P(offset));
+ zend_hash_index_del(ht, hval);
+ break;
+ case IS_RESOURCE:
+ case IS_BOOL:
+ case IS_LONG:
+ hval = Z_LVAL_P(offset);
+ 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) {
+ ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_dim);
+ }
+ if (ht == &EG(symbol_table).ht) {
+ zend_delete_global_variable(Z_STR_P(offset) TSRMLS_CC);
+ } 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;
num_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());
- break;
- case IS_REFERENCE:
- offset = Z_REFVAL_P(offset);
- goto offset_again;
- break;
- default:
- zend_error(E_WARNING, "Illegal offset type in unset");
- break;
- }
- zval_dtor(free_op2.var);
- break;
+ 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());
+ break;
+ case IS_REFERENCE:
+ offset = Z_REFVAL_P(offset);
+ goto offset_again;
+ break;
+ default:
+ zend_error(E_WARNING, "Illegal offset type in unset");
+ break;
}
- case IS_OBJECT:
- if (UNEXPECTED(Z_OBJ_HT_P(container)->unset_dimension == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use object as array");
- }
-//??? if (1) {
-//???? if (IS_TMP_VAR == IS_CONST) {
-//???? ZVAL_DUP(offset, offset);
-//???? } else if (IS_TMP_VAR == IS_TMP_VAR) {
-//??? MAKE_REAL_ZVAL_PTR(offset);
-//??? }
- Z_OBJ_HT_P(container)->unset_dimension(container, offset TSRMLS_CC);
-//??? if (1) {
-//???? if (IS_TMP_VAR == IS_CONST || IS_TMP_VAR == IS_TMP_VAR) {
-//??? zval_ptr_dtor(offset);
-//??? } else {
- zval_dtor(free_op2.var);
-//??? }
- break;
- case IS_STRING:
- zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
- ZEND_VM_CONTINUE(); /* bailed out before */
- case IS_REFERENCE:
- container = Z_REFVAL_P(container);
- goto container_again;
- break;
- default:
- zval_dtor(free_op2.var);
- break;
+ zval_dtor(free_op2.var);
+ break;
}
- } else {
- zval_dtor(free_op2.var);
+ case IS_OBJECT:
+ if (UNEXPECTED(Z_OBJ_HT_P(container)->unset_dimension == NULL)) {
+ zend_error_noreturn(E_ERROR, "Cannot use object as array");
+ }
+//??? if (1) {
+//???? if (IS_TMP_VAR == IS_CONST) {
+//???? ZVAL_DUP(offset, offset);
+//???? } else if (IS_TMP_VAR == IS_TMP_VAR) {
+//??? MAKE_REAL_ZVAL_PTR(offset);
+//??? }
+ Z_OBJ_HT_P(container)->unset_dimension(container, offset TSRMLS_CC);
+//??? if (1) {
+//???? if (IS_TMP_VAR == IS_CONST || IS_TMP_VAR == IS_TMP_VAR) {
+//??? zval_ptr_dtor(offset);
+//??? } else {
+ zval_dtor(free_op2.var);
+//??? }
+ break;
+ case IS_STRING:
+ case IS_STR_OFFSET:
+ zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
+ ZEND_VM_CONTINUE(); /* bailed out before */
+ case IS_REFERENCE:
+ container = Z_REFVAL_P(container);
+ goto container_again;
+ break;
+ default:
+ zval_dtor(free_op2.var);
+ break;
}
CHECK_EXCEPTION();
SAVE_OPLINE();
container = _get_obj_zval_ptr_unused(TSRMLS_C);
+ if (IS_UNUSED == IS_VAR && Z_TYPE_P(container) == IS_STR_OFFSET) {
+ zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
+ }
offset = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
- if (IS_UNUSED != IS_VAR || container) {
- if (IS_UNUSED == IS_CV) {
- SEPARATE_ZVAL_IF_NOT_REF(container);
- }
- if (Z_TYPE_P(container) == IS_OBJECT) {
+ ZVAL_DEREF(container);
+ if (Z_TYPE_P(container) == IS_OBJECT) {
//??? if (1) {
//??? MAKE_REAL_ZVAL_PTR(offset);
//??? }
- if (Z_OBJ_HT_P(container)->unset_property) {
- Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
- } else {
- zend_error(E_NOTICE, "Trying to unset property of non-object");
- }
-//??? if (1) {
-//??? zval_ptr_dtor(offset);
-//??? } else {
- zval_dtor(free_op2.var);
-//??? }
+ if (Z_OBJ_HT_P(container)->unset_property) {
+ Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
} else {
- zval_dtor(free_op2.var);
+ zend_error(E_NOTICE, "Trying to unset property of non-object");
}
+//??? if (1) {
+//??? zval_ptr_dtor(offset);
+//??? } else {
+ zval_dtor(free_op2.var);
+//??? }
} else {
zval_dtor(free_op2.var);
}
} else {
zval *dim = _get_zval_ptr_var_deref(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
- zend_fetch_dimension_address(EX_VAR((opline+1)->op2.var), container, dim, IS_VAR, BP_VAR_RW TSRMLS_CC);
+ zend_fetch_dimension_address(EX_VAR((opline+1)->op2.var), container, dim, IS_VAR, BP_VAR_RW, 0 TSRMLS_CC);
value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, execute_data, &free_op_data1, BP_VAR_R);
var_ptr = _get_zval_ptr_ptr_var((opline+1)->op2.var, execute_data, &free_op_data2 TSRMLS_CC);
}
zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
}
- zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_W TSRMLS_CC);
+ zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_W, (opline->extended_value & ZEND_FETCH_MAKE_REF) != 0 TSRMLS_CC);
//??? if (0) {
//??? zval_ptr_dtor(property);
//??? } else {
EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
}
- /* We are going to assign the result by reference */
- if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
- zval *retval_ptr = EX_VAR(opline->result.var);
- zval *retval_ind = retval_ptr;
-
- if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
- retval_ptr = Z_INDIRECT_P(retval_ptr);
- if (retval_ptr == &EG(uninitialized_zval) || retval_ptr == &EG(error_zval)) {
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
- }
- }
- if (!Z_ISREF_P(retval_ptr)) {
- if (Z_REFCOUNTED_P(retval_ptr)) {
- Z_DELREF_P(retval_ptr);
- SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
- } else {
- ZVAL_NEW_REF(retval_ptr, retval_ptr);
- }
- Z_ADDREF_P(retval_ptr);
- if (retval_ind != retval_ptr) {
- ZVAL_REF(retval_ind, Z_REF_P(retval_ptr));
- }
- }
- }
-
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
if (IS_UNUSED == IS_VAR && UNEXPECTED(Z_TYPE_P(container) == IS_STR_OFFSET)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
}
- zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_RW TSRMLS_CC);
+ zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_RW, 0 TSRMLS_CC);
//??? if (0) {
//??? zval_ptr_dtor(property);
//??? } else {
if (IS_UNUSED == IS_VAR && UNEXPECTED(Z_TYPE_P(container) == IS_STR_OFFSET)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
}
- zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_W TSRMLS_CC);
+ zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_W, 0 TSRMLS_CC);
//??? if (0) {
//??? zval_ptr_dtor(property);
//??? } else {
static int ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1, free_op2, free_res;
+ zend_free_op free_op1, free_op2;
zval *container, *property, *retval_ptr;
SAVE_OPLINE();
container = _get_obj_zval_ptr_unused(TSRMLS_C);
property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
- if (IS_UNUSED == IS_CV) {
- SEPARATE_ZVAL_IF_NOT_REF(container);
- }
//??? if (0) {
//??? MAKE_REAL_ZVAL_PTR(property);
//??? }
if (IS_UNUSED == IS_VAR && UNEXPECTED(Z_TYPE_P(container) == IS_STR_OFFSET)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
}
- zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_UNSET TSRMLS_CC);
+ zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_UNSET, 0 TSRMLS_CC);
//??? if (0) {
//??? zval_ptr_dtor(property);
//??? } else {
EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
}
- retval_ptr = EX_VAR(opline->result.var);
- if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
- retval_ptr = Z_INDIRECT_P(retval_ptr);
- }
- PZVAL_UNLOCK(retval_ptr, &free_res);
- SEPARATE_ZVAL_IF_NOT_REF(retval_ptr);
- PZVAL_LOCK(retval_ptr);
- FREE_OP_VAR_PTR(free_res);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
SAVE_OPLINE();
container = _get_obj_zval_ptr_unused(TSRMLS_C);
- if (IS_UNUSED == IS_CV) {
+ if (IS_UNUSED != IS_UNUSED) {
SEPARATE_ZVAL_IF_NOT_REF(container);
}
offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
- if (IS_UNUSED != IS_VAR || container) {
container_again:
- switch (Z_TYPE_P(container)) {
- case IS_ARRAY: {
- HashTable *ht = Z_ARRVAL_P(container);
+ switch (Z_TYPE_P(container)) {
+ case IS_ARRAY: {
+ HashTable *ht = Z_ARRVAL_P(container);
offset_again:
- switch (Z_TYPE_P(offset)) {
- case IS_DOUBLE:
- hval = zend_dval_to_lval(Z_DVAL_P(offset));
- zend_hash_index_del(ht, hval);
- break;
- case IS_RESOURCE:
- case IS_BOOL:
- case IS_LONG:
- hval = Z_LVAL_P(offset);
- 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) {
- ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_dim);
- }
- if (ht == &EG(symbol_table).ht) {
- zend_delete_global_variable(Z_STR_P(offset) TSRMLS_CC);
- } else {
- zend_hash_del(ht, Z_STR_P(offset));
- }
- if (IS_VAR == IS_CV || IS_VAR == IS_VAR) {
- zval_ptr_dtor(offset);
- }
- break;
+ switch (Z_TYPE_P(offset)) {
+ case IS_DOUBLE:
+ hval = zend_dval_to_lval(Z_DVAL_P(offset));
+ zend_hash_index_del(ht, hval);
+ break;
+ case IS_RESOURCE:
+ case IS_BOOL:
+ case IS_LONG:
+ hval = Z_LVAL_P(offset);
+ 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) {
+ ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_dim);
+ }
+ if (ht == &EG(symbol_table).ht) {
+ zend_delete_global_variable(Z_STR_P(offset) TSRMLS_CC);
+ } else {
+ zend_hash_del(ht, Z_STR_P(offset));
+ }
+ if (IS_VAR == IS_CV || IS_VAR == IS_VAR) {
+ zval_ptr_dtor(offset);
+ }
+ break;
num_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());
- break;
- case IS_REFERENCE:
- offset = Z_REFVAL_P(offset);
- goto offset_again;
- break;
- default:
- zend_error(E_WARNING, "Illegal offset type in unset");
- break;
- }
- zval_ptr_dtor_nogc(free_op2.var);
- break;
+ 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());
+ break;
+ case IS_REFERENCE:
+ offset = Z_REFVAL_P(offset);
+ goto offset_again;
+ break;
+ default:
+ zend_error(E_WARNING, "Illegal offset type in unset");
+ break;
}
- case IS_OBJECT:
- if (UNEXPECTED(Z_OBJ_HT_P(container)->unset_dimension == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use object as array");
- }
-//??? if (0) {
-//???? if (IS_VAR == IS_CONST) {
-//???? ZVAL_DUP(offset, offset);
-//???? } else if (IS_VAR == IS_TMP_VAR) {
-//??? MAKE_REAL_ZVAL_PTR(offset);
-//??? }
- Z_OBJ_HT_P(container)->unset_dimension(container, offset TSRMLS_CC);
-//??? if (0) {
-//???? if (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR) {
-//??? zval_ptr_dtor(offset);
-//??? } else {
- zval_ptr_dtor_nogc(free_op2.var);
-//??? }
- break;
- case IS_STRING:
- zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
- ZEND_VM_CONTINUE(); /* bailed out before */
- case IS_REFERENCE:
- container = Z_REFVAL_P(container);
- goto container_again;
- break;
- default:
- zval_ptr_dtor_nogc(free_op2.var);
- break;
+ zval_ptr_dtor_nogc(free_op2.var);
+ break;
}
- } else {
- zval_ptr_dtor_nogc(free_op2.var);
+ case IS_OBJECT:
+ if (UNEXPECTED(Z_OBJ_HT_P(container)->unset_dimension == NULL)) {
+ zend_error_noreturn(E_ERROR, "Cannot use object as array");
+ }
+//??? if (0) {
+//???? if (IS_VAR == IS_CONST) {
+//???? ZVAL_DUP(offset, offset);
+//???? } else if (IS_VAR == IS_TMP_VAR) {
+//??? MAKE_REAL_ZVAL_PTR(offset);
+//??? }
+ Z_OBJ_HT_P(container)->unset_dimension(container, offset TSRMLS_CC);
+//??? if (0) {
+//???? if (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR) {
+//??? zval_ptr_dtor(offset);
+//??? } else {
+ zval_ptr_dtor_nogc(free_op2.var);
+//??? }
+ break;
+ case IS_STRING:
+ case IS_STR_OFFSET:
+ zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
+ ZEND_VM_CONTINUE(); /* bailed out before */
+ case IS_REFERENCE:
+ container = Z_REFVAL_P(container);
+ goto container_again;
+ break;
+ default:
+ zval_ptr_dtor_nogc(free_op2.var);
+ break;
}
CHECK_EXCEPTION();
SAVE_OPLINE();
container = _get_obj_zval_ptr_unused(TSRMLS_C);
+ if (IS_UNUSED == IS_VAR && Z_TYPE_P(container) == IS_STR_OFFSET) {
+ zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
+ }
offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
- if (IS_UNUSED != IS_VAR || container) {
- if (IS_UNUSED == IS_CV) {
- SEPARATE_ZVAL_IF_NOT_REF(container);
- }
- if (Z_TYPE_P(container) == IS_OBJECT) {
+ ZVAL_DEREF(container);
+ if (Z_TYPE_P(container) == IS_OBJECT) {
//??? if (0) {
//??? MAKE_REAL_ZVAL_PTR(offset);
//??? }
- if (Z_OBJ_HT_P(container)->unset_property) {
- Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
- } else {
- zend_error(E_NOTICE, "Trying to unset property of non-object");
- }
-//??? if (0) {
-//??? zval_ptr_dtor(offset);
-//??? } else {
- zval_ptr_dtor_nogc(free_op2.var);
-//??? }
+ if (Z_OBJ_HT_P(container)->unset_property) {
+ Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
} else {
- zval_ptr_dtor_nogc(free_op2.var);
+ zend_error(E_NOTICE, "Trying to unset property of non-object");
}
+//??? if (0) {
+//??? zval_ptr_dtor(offset);
+//??? } else {
+ zval_ptr_dtor_nogc(free_op2.var);
+//??? }
} else {
zval_ptr_dtor_nogc(free_op2.var);
}
} else {
zval *dim = NULL;
- zend_fetch_dimension_address(EX_VAR((opline+1)->op2.var), container, dim, IS_UNUSED, BP_VAR_RW TSRMLS_CC);
+ zend_fetch_dimension_address(EX_VAR((opline+1)->op2.var), container, dim, IS_UNUSED, BP_VAR_RW, 0 TSRMLS_CC);
value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, execute_data, &free_op_data1, BP_VAR_R);
var_ptr = _get_zval_ptr_ptr_var((opline+1)->op2.var, execute_data, &free_op_data2 TSRMLS_CC);
}
} else {
zval *dim = _get_zval_ptr_cv_deref_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC);
- zend_fetch_dimension_address(EX_VAR((opline+1)->op2.var), container, dim, IS_CV, BP_VAR_RW TSRMLS_CC);
+ zend_fetch_dimension_address(EX_VAR((opline+1)->op2.var), container, dim, IS_CV, BP_VAR_RW, 0 TSRMLS_CC);
value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, execute_data, &free_op_data1, BP_VAR_R);
var_ptr = _get_zval_ptr_ptr_var((opline+1)->op2.var, execute_data, &free_op_data2 TSRMLS_CC);
}
zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
}
- zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_W TSRMLS_CC);
+ zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_W, (opline->extended_value & ZEND_FETCH_MAKE_REF) != 0 TSRMLS_CC);
//??? if (0) {
//??? zval_ptr_dtor(property);
//??? } else {
EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
}
- /* We are going to assign the result by reference */
- if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
- zval *retval_ptr = EX_VAR(opline->result.var);
- zval *retval_ind = retval_ptr;
-
- if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
- retval_ptr = Z_INDIRECT_P(retval_ptr);
- if (retval_ptr == &EG(uninitialized_zval) || retval_ptr == &EG(error_zval)) {
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
- }
- }
- if (!Z_ISREF_P(retval_ptr)) {
- if (Z_REFCOUNTED_P(retval_ptr)) {
- Z_DELREF_P(retval_ptr);
- SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
- } else {
- ZVAL_NEW_REF(retval_ptr, retval_ptr);
- }
- Z_ADDREF_P(retval_ptr);
- if (retval_ind != retval_ptr) {
- ZVAL_REF(retval_ind, Z_REF_P(retval_ptr));
- }
- }
- }
-
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
if (IS_UNUSED == IS_VAR && UNEXPECTED(Z_TYPE_P(container) == IS_STR_OFFSET)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
}
- zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_RW TSRMLS_CC);
+ zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_RW, 0 TSRMLS_CC);
//??? if (0) {
//??? zval_ptr_dtor(property);
//??? } else {
if (IS_UNUSED == IS_VAR && UNEXPECTED(Z_TYPE_P(container) == IS_STR_OFFSET)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
}
- zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_W TSRMLS_CC);
+ zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_W, 0 TSRMLS_CC);
//??? if (0) {
//??? zval_ptr_dtor(property);
//??? } else {
static int ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1, free_res;
+ zend_free_op free_op1;
zval *container, *property, *retval_ptr;
SAVE_OPLINE();
container = _get_obj_zval_ptr_unused(TSRMLS_C);
property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC);
- if (IS_UNUSED == IS_CV) {
- SEPARATE_ZVAL_IF_NOT_REF(container);
- }
//??? if (0) {
//??? MAKE_REAL_ZVAL_PTR(property);
//??? }
if (IS_UNUSED == IS_VAR && UNEXPECTED(Z_TYPE_P(container) == IS_STR_OFFSET)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
}
- zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_UNSET TSRMLS_CC);
+ zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_UNSET, 0 TSRMLS_CC);
//??? if (0) {
//??? zval_ptr_dtor(property);
//??? } else {
EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
}
- retval_ptr = EX_VAR(opline->result.var);
- if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
- retval_ptr = Z_INDIRECT_P(retval_ptr);
- }
- PZVAL_UNLOCK(retval_ptr, &free_res);
- SEPARATE_ZVAL_IF_NOT_REF(retval_ptr);
- PZVAL_LOCK(retval_ptr);
- FREE_OP_VAR_PTR(free_res);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
SAVE_OPLINE();
container = _get_obj_zval_ptr_unused(TSRMLS_C);
- if (IS_UNUSED == IS_CV) {
+ if (IS_UNUSED != IS_UNUSED) {
SEPARATE_ZVAL_IF_NOT_REF(container);
}
offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC);
- if (IS_UNUSED != IS_VAR || container) {
container_again:
- switch (Z_TYPE_P(container)) {
- case IS_ARRAY: {
- HashTable *ht = Z_ARRVAL_P(container);
+ switch (Z_TYPE_P(container)) {
+ case IS_ARRAY: {
+ HashTable *ht = Z_ARRVAL_P(container);
offset_again:
- switch (Z_TYPE_P(offset)) {
- case IS_DOUBLE:
- hval = zend_dval_to_lval(Z_DVAL_P(offset));
- zend_hash_index_del(ht, hval);
- break;
- case IS_RESOURCE:
- case IS_BOOL:
- case IS_LONG:
- hval = Z_LVAL_P(offset);
- 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) {
- ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_dim);
- }
- if (ht == &EG(symbol_table).ht) {
- zend_delete_global_variable(Z_STR_P(offset) TSRMLS_CC);
- } else {
- zend_hash_del(ht, Z_STR_P(offset));
- }
- if (IS_CV == IS_CV || IS_CV == IS_VAR) {
- zval_ptr_dtor(offset);
- }
- break;
+ switch (Z_TYPE_P(offset)) {
+ case IS_DOUBLE:
+ hval = zend_dval_to_lval(Z_DVAL_P(offset));
+ zend_hash_index_del(ht, hval);
+ break;
+ case IS_RESOURCE:
+ case IS_BOOL:
+ case IS_LONG:
+ hval = Z_LVAL_P(offset);
+ 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) {
+ ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_dim);
+ }
+ if (ht == &EG(symbol_table).ht) {
+ zend_delete_global_variable(Z_STR_P(offset) TSRMLS_CC);
+ } else {
+ zend_hash_del(ht, Z_STR_P(offset));
+ }
+ if (IS_CV == IS_CV || IS_CV == IS_VAR) {
+ zval_ptr_dtor(offset);
+ }
+ break;
num_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());
- break;
- case IS_REFERENCE:
- offset = Z_REFVAL_P(offset);
- goto offset_again;
- break;
- default:
- zend_error(E_WARNING, "Illegal offset type in unset");
- break;
- }
-
- break;
+ 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());
+ break;
+ case IS_REFERENCE:
+ offset = Z_REFVAL_P(offset);
+ goto offset_again;
+ break;
+ default:
+ zend_error(E_WARNING, "Illegal offset type in unset");
+ break;
}
- case IS_OBJECT:
- if (UNEXPECTED(Z_OBJ_HT_P(container)->unset_dimension == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use object as array");
- }
-//??? if (0) {
-//???? if (IS_CV == IS_CONST) {
-//???? ZVAL_DUP(offset, offset);
-//???? } else if (IS_CV == IS_TMP_VAR) {
-//??? MAKE_REAL_ZVAL_PTR(offset);
-//??? }
- Z_OBJ_HT_P(container)->unset_dimension(container, offset TSRMLS_CC);
-//??? if (0) {
-//???? if (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR) {
-//??? zval_ptr_dtor(offset);
-//??? } else {
-
-//??? }
- break;
- case IS_STRING:
- zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
- ZEND_VM_CONTINUE(); /* bailed out before */
- case IS_REFERENCE:
- container = Z_REFVAL_P(container);
- goto container_again;
- break;
- default:
- break;
+ break;
}
- } else {
+ case IS_OBJECT:
+ if (UNEXPECTED(Z_OBJ_HT_P(container)->unset_dimension == NULL)) {
+ zend_error_noreturn(E_ERROR, "Cannot use object as array");
+ }
+//??? if (0) {
+//???? if (IS_CV == IS_CONST) {
+//???? ZVAL_DUP(offset, offset);
+//???? } else if (IS_CV == IS_TMP_VAR) {
+//??? MAKE_REAL_ZVAL_PTR(offset);
+//??? }
+ Z_OBJ_HT_P(container)->unset_dimension(container, offset TSRMLS_CC);
+//??? if (0) {
+//???? if (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR) {
+//??? zval_ptr_dtor(offset);
+//??? } else {
+//??? }
+ break;
+ case IS_STRING:
+ case IS_STR_OFFSET:
+ zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
+ ZEND_VM_CONTINUE(); /* bailed out before */
+ case IS_REFERENCE:
+ container = Z_REFVAL_P(container);
+ goto container_again;
+ break;
+ default:
+
+ break;
}
CHECK_EXCEPTION();
SAVE_OPLINE();
container = _get_obj_zval_ptr_unused(TSRMLS_C);
+ if (IS_UNUSED == IS_VAR && Z_TYPE_P(container) == IS_STR_OFFSET) {
+ zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
+ }
offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC);
- if (IS_UNUSED != IS_VAR || container) {
- if (IS_UNUSED == IS_CV) {
- SEPARATE_ZVAL_IF_NOT_REF(container);
- }
- if (Z_TYPE_P(container) == IS_OBJECT) {
+ ZVAL_DEREF(container);
+ if (Z_TYPE_P(container) == IS_OBJECT) {
//??? if (0) {
//??? MAKE_REAL_ZVAL_PTR(offset);
//??? }
- if (Z_OBJ_HT_P(container)->unset_property) {
- Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
- } else {
- zend_error(E_NOTICE, "Trying to unset property of non-object");
- }
-//??? if (0) {
-//??? zval_ptr_dtor(offset);
-//??? } else {
-
-//??? }
+ if (Z_OBJ_HT_P(container)->unset_property) {
+ Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
} else {
-
+ zend_error(E_NOTICE, "Trying to unset property of non-object");
}
+//??? if (0) {
+//??? zval_ptr_dtor(offset);
+//??? } else {
+
+//??? }
} else {
}
} else {
zval *dim = opline->op2.zv;
- zend_fetch_dimension_address(EX_VAR((opline+1)->op2.var), container, dim, IS_CONST, BP_VAR_RW TSRMLS_CC);
+ zend_fetch_dimension_address(EX_VAR((opline+1)->op2.var), container, dim, IS_CONST, BP_VAR_RW, 0 TSRMLS_CC);
value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, execute_data, &free_op_data1, BP_VAR_R);
var_ptr = _get_zval_ptr_ptr_var((opline+1)->op2.var, execute_data, &free_op_data2 TSRMLS_CC);
}
} else {
target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
-/*
- if (!target_symbol_table) {
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
- }
-*/
if ((retval = zend_hash_find(target_symbol_table, Z_STR_P(varname))) == NULL) {
switch (type) {
case BP_VAR_R:
break;
EMPTY_SWITCH_DEFAULT_CASE()
}
-//??? GLOBAL or $$name variable may be an INDIRECT pointer to CV
- } else if (/*(opline->extended_value & ZEND_FETCH_TYPE_MASK) != ZEND_FETCH_STATIC &&*/
+ /* GLOBAL or $$name variable may be an INDIRECT pointer to CV */
+ } else if (/* ??? (opline->extended_value & ZEND_FETCH_TYPE_MASK) != ZEND_FETCH_STATIC &&*/
Z_TYPE_P(retval) == IS_INDIRECT) {
retval = Z_INDIRECT_P(retval);
if (Z_TYPE_P(retval) == IS_UNDEF) {
}
if (EXPECTED(retval != NULL)) {
- if (Z_REFCOUNTED_P(retval)) Z_ADDREF_P(retval);
switch (type) {
case BP_VAR_R:
case BP_VAR_IS:
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), retval);
+ ZVAL_COPY(EX_VAR(opline->result.var), retval);
break;
case BP_VAR_UNSET: {
//??? zend_free_op free_res;
if (IS_CV == IS_VAR && UNEXPECTED(Z_TYPE_P(container) == IS_STR_OFFSET)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
}
- zend_fetch_dimension_address(EX_VAR(opline->result.var), container, opline->op2.zv, IS_CONST, BP_VAR_W TSRMLS_CC);
+ zend_fetch_dimension_address(EX_VAR(opline->result.var), container, opline->op2.zv, IS_CONST, BP_VAR_W, opline->extended_value != 0 TSRMLS_CC);
if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
}
- /* We are going to assign the result by reference */
- if (UNEXPECTED(opline->extended_value != 0)) {
- zval *retval_ptr = EX_VAR(opline->result.var);
-
- if (Z_TYPE_P(retval_ptr) != IS_STR_OFFSET) {
- zval *retval_ind = retval_ptr;
-
- if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
- retval_ptr = Z_INDIRECT_P(retval_ptr);
- if (retval_ptr == &EG(uninitialized_zval) || retval_ptr == &EG(error_zval)) {
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
- }
- }
- if (!Z_ISREF_P(retval_ptr)) {
- if (Z_REFCOUNTED_P(retval_ptr)) {
- Z_DELREF_P(retval_ptr);
- SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
- } else {
- ZVAL_NEW_REF(retval_ptr, retval_ptr);
- }
- Z_ADDREF_P(retval_ptr);
- if (retval_ind != retval_ptr) {
- ZVAL_REF(retval_ind, Z_REF_P(retval_ptr));
- }
- }
- }
- }
-
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
if (IS_CV == IS_VAR && UNEXPECTED(Z_TYPE_P(container) == IS_STR_OFFSET)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
}
- zend_fetch_dimension_address(EX_VAR(opline->result.var), container, opline->op2.zv, IS_CONST, BP_VAR_RW TSRMLS_CC);
+ zend_fetch_dimension_address(EX_VAR(opline->result.var), container, opline->op2.zv, IS_CONST, BP_VAR_RW, 0 TSRMLS_CC);
if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
}
- zend_fetch_dimension_address(EX_VAR(opline->result.var), container, opline->op2.zv, IS_CONST, BP_VAR_W TSRMLS_CC);
+ zend_fetch_dimension_address(EX_VAR(opline->result.var), container, opline->op2.zv, IS_CONST, BP_VAR_W, 0 TSRMLS_CC);
if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
}
SAVE_OPLINE();
container = _get_zval_ptr_cv_BP_VAR_UNSET(execute_data, opline->op1.var TSRMLS_CC);
- if (IS_CV == IS_CV) {
- SEPARATE_ZVAL_IF_NOT_REF(container);
- }
if (IS_CV == IS_VAR && UNEXPECTED(Z_TYPE_P(container) == IS_STR_OFFSET)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
}
- zend_fetch_dimension_address(EX_VAR(opline->result.var), container, opline->op2.zv, IS_CONST, BP_VAR_UNSET TSRMLS_CC);
+ zend_fetch_dimension_address(EX_VAR(opline->result.var), container, opline->op2.zv, IS_CONST, BP_VAR_UNSET, 0 TSRMLS_CC);
if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
}
- if (UNEXPECTED(Z_TYPE_P(EX_VAR(opline->result.var)) == IS_STR_OFFSET)) {
- zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
- ZEND_VM_NEXT_OPCODE();
- } else {
- zend_free_op free_res;
- zval *retval_ptr = EX_VAR(opline->result.var);
-
- if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
- retval_ptr = Z_INDIRECT_P(retval_ptr);
- }
- PZVAL_UNLOCK(retval_ptr, &free_res);
- SEPARATE_ZVAL_IF_NOT_REF(retval_ptr);
- PZVAL_LOCK(retval_ptr);
- FREE_OP_VAR_PTR(free_res);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
- }
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
}
static int ZEND_FASTCALL zend_fetch_property_address_read_helper_SPEC_CV_CONST(ZEND_OPCODE_HANDLER_ARGS)
zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
}
- zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_W TSRMLS_CC);
+ zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_W, (opline->extended_value & ZEND_FETCH_MAKE_REF) != 0 TSRMLS_CC);
//??? if (0) {
//??? zval_ptr_dtor(property);
//??? } else {
EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
}
- /* We are going to assign the result by reference */
- if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
- zval *retval_ptr = EX_VAR(opline->result.var);
- zval *retval_ind = retval_ptr;
-
- if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
- retval_ptr = Z_INDIRECT_P(retval_ptr);
- if (retval_ptr == &EG(uninitialized_zval) || retval_ptr == &EG(error_zval)) {
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
- }
- }
- if (!Z_ISREF_P(retval_ptr)) {
- if (Z_REFCOUNTED_P(retval_ptr)) {
- Z_DELREF_P(retval_ptr);
- SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
- } else {
- ZVAL_NEW_REF(retval_ptr, retval_ptr);
- }
- Z_ADDREF_P(retval_ptr);
- if (retval_ind != retval_ptr) {
- ZVAL_REF(retval_ind, Z_REF_P(retval_ptr));
- }
- }
- }
-
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
if (IS_CV == IS_VAR && UNEXPECTED(Z_TYPE_P(container) == IS_STR_OFFSET)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
}
- zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_RW TSRMLS_CC);
+ zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_RW, 0 TSRMLS_CC);
//??? if (0) {
//??? zval_ptr_dtor(property);
//??? } else {
if (IS_CV == IS_VAR && UNEXPECTED(Z_TYPE_P(container) == IS_STR_OFFSET)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
}
- zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_W TSRMLS_CC);
+ zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_W, 0 TSRMLS_CC);
//??? if (0) {
//??? zval_ptr_dtor(property);
//??? } else {
static int ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1, free_res;
+ zend_free_op free_op1;
zval *container, *property, *retval_ptr;
SAVE_OPLINE();
container = _get_zval_ptr_cv_BP_VAR_UNSET(execute_data, opline->op1.var TSRMLS_CC);
property = opline->op2.zv;
- if (IS_CV == IS_CV) {
- SEPARATE_ZVAL_IF_NOT_REF(container);
- }
//??? if (0) {
//??? MAKE_REAL_ZVAL_PTR(property);
//??? }
if (IS_CV == IS_VAR && UNEXPECTED(Z_TYPE_P(container) == IS_STR_OFFSET)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
}
- zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_UNSET TSRMLS_CC);
+ zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_UNSET, 0 TSRMLS_CC);
//??? if (0) {
//??? zval_ptr_dtor(property);
//??? } else {
EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
}
- retval_ptr = EX_VAR(opline->result.var);
- if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
- retval_ptr = Z_INDIRECT_P(retval_ptr);
- }
- PZVAL_UNLOCK(retval_ptr, &free_res);
- SEPARATE_ZVAL_IF_NOT_REF(retval_ptr);
- PZVAL_LOCK(retval_ptr);
- FREE_OP_VAR_PTR(free_res);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
zval *dim = opline->op2.zv;
zval *variable_ptr;
- zend_fetch_dimension_address(EX_VAR((opline+1)->op2.var), object_ptr, dim, IS_CONST, BP_VAR_W TSRMLS_CC);
+ zend_fetch_dimension_address(EX_VAR((opline+1)->op2.var), object_ptr, dim, IS_CONST, BP_VAR_W, 0 TSRMLS_CC);
value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, execute_data, &free_op_data1, BP_VAR_R);
variable_ptr = _get_zval_ptr_ptr_var((opline+1)->op2.var, execute_data, &free_op_data2 TSRMLS_CC);
SAVE_OPLINE();
container = _get_zval_ptr_cv_BP_VAR_UNSET(execute_data, opline->op1.var TSRMLS_CC);
- if (IS_CV == IS_CV) {
+ if (IS_CV != IS_UNUSED) {
SEPARATE_ZVAL_IF_NOT_REF(container);
}
offset = opline->op2.zv;
- if (IS_CV != IS_VAR || container) {
container_again:
- switch (Z_TYPE_P(container)) {
- case IS_ARRAY: {
- HashTable *ht = Z_ARRVAL_P(container);
+ switch (Z_TYPE_P(container)) {
+ case IS_ARRAY: {
+ HashTable *ht = Z_ARRVAL_P(container);
offset_again:
- switch (Z_TYPE_P(offset)) {
- case IS_DOUBLE:
- hval = zend_dval_to_lval(Z_DVAL_P(offset));
- zend_hash_index_del(ht, hval);
- break;
- case IS_RESOURCE:
- case IS_BOOL:
- case IS_LONG:
- hval = Z_LVAL_P(offset);
- 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) {
- ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_dim);
- }
- if (ht == &EG(symbol_table).ht) {
- zend_delete_global_variable(Z_STR_P(offset) TSRMLS_CC);
- } else {
- zend_hash_del(ht, Z_STR_P(offset));
- }
- if (IS_CONST == IS_CV || IS_CONST == IS_VAR) {
- zval_ptr_dtor(offset);
- }
- break;
+ switch (Z_TYPE_P(offset)) {
+ case IS_DOUBLE:
+ hval = zend_dval_to_lval(Z_DVAL_P(offset));
+ zend_hash_index_del(ht, hval);
+ break;
+ case IS_RESOURCE:
+ case IS_BOOL:
+ case IS_LONG:
+ hval = Z_LVAL_P(offset);
+ 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) {
+ ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_dim);
+ }
+ if (ht == &EG(symbol_table).ht) {
+ zend_delete_global_variable(Z_STR_P(offset) TSRMLS_CC);
+ } else {
+ zend_hash_del(ht, Z_STR_P(offset));
+ }
+ if (IS_CONST == IS_CV || IS_CONST == IS_VAR) {
+ zval_ptr_dtor(offset);
+ }
+ break;
num_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());
- break;
- case IS_REFERENCE:
- offset = Z_REFVAL_P(offset);
- goto offset_again;
- break;
- default:
- zend_error(E_WARNING, "Illegal offset type in unset");
- break;
- }
-
- break;
+ 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());
+ break;
+ case IS_REFERENCE:
+ offset = Z_REFVAL_P(offset);
+ goto offset_again;
+ break;
+ default:
+ zend_error(E_WARNING, "Illegal offset type in unset");
+ break;
}
- case IS_OBJECT:
- if (UNEXPECTED(Z_OBJ_HT_P(container)->unset_dimension == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use object as array");
- }
-//??? if (0) {
-//???? if (IS_CONST == IS_CONST) {
-//???? ZVAL_DUP(offset, offset);
-//???? } else if (IS_CONST == IS_TMP_VAR) {
-//??? MAKE_REAL_ZVAL_PTR(offset);
-//??? }
- Z_OBJ_HT_P(container)->unset_dimension(container, offset TSRMLS_CC);
-//??? if (0) {
-//???? if (IS_CONST == IS_CONST || IS_CONST == IS_TMP_VAR) {
-//??? zval_ptr_dtor(offset);
-//??? } else {
-
-//??? }
- break;
- case IS_STRING:
- zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
- ZEND_VM_CONTINUE(); /* bailed out before */
- case IS_REFERENCE:
- container = Z_REFVAL_P(container);
- goto container_again;
- break;
- default:
- break;
+ break;
}
- } else {
+ case IS_OBJECT:
+ if (UNEXPECTED(Z_OBJ_HT_P(container)->unset_dimension == NULL)) {
+ zend_error_noreturn(E_ERROR, "Cannot use object as array");
+ }
+//??? if (0) {
+//???? if (IS_CONST == IS_CONST) {
+//???? ZVAL_DUP(offset, offset);
+//???? } else if (IS_CONST == IS_TMP_VAR) {
+//??? MAKE_REAL_ZVAL_PTR(offset);
+//??? }
+ Z_OBJ_HT_P(container)->unset_dimension(container, offset TSRMLS_CC);
+//??? if (0) {
+//???? if (IS_CONST == IS_CONST || IS_CONST == IS_TMP_VAR) {
+//??? zval_ptr_dtor(offset);
+//??? } else {
+//??? }
+ break;
+ case IS_STRING:
+ case IS_STR_OFFSET:
+ zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
+ ZEND_VM_CONTINUE(); /* bailed out before */
+ case IS_REFERENCE:
+ container = Z_REFVAL_P(container);
+ goto container_again;
+ break;
+ default:
+
+ break;
}
CHECK_EXCEPTION();
SAVE_OPLINE();
container = _get_zval_ptr_cv_BP_VAR_UNSET(execute_data, opline->op1.var TSRMLS_CC);
+ if (IS_CV == IS_VAR && Z_TYPE_P(container) == IS_STR_OFFSET) {
+ zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
+ }
offset = opline->op2.zv;
- if (IS_CV != IS_VAR || container) {
- if (IS_CV == IS_CV) {
- SEPARATE_ZVAL_IF_NOT_REF(container);
- }
- if (Z_TYPE_P(container) == IS_OBJECT) {
+ ZVAL_DEREF(container);
+ if (Z_TYPE_P(container) == IS_OBJECT) {
//??? if (0) {
//??? MAKE_REAL_ZVAL_PTR(offset);
//??? }
- if (Z_OBJ_HT_P(container)->unset_property) {
- Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
- } else {
- zend_error(E_NOTICE, "Trying to unset property of non-object");
- }
-//??? if (0) {
-//??? zval_ptr_dtor(offset);
-//??? } else {
-
-//??? }
+ if (Z_OBJ_HT_P(container)->unset_property) {
+ Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
} else {
-
+ zend_error(E_NOTICE, "Trying to unset property of non-object");
}
+//??? if (0) {
+//??? zval_ptr_dtor(offset);
+//??? } else {
+
+//??? }
} else {
}
} else {
zval *dim = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
- zend_fetch_dimension_address(EX_VAR((opline+1)->op2.var), container, dim, IS_TMP_VAR, BP_VAR_RW TSRMLS_CC);
+ zend_fetch_dimension_address(EX_VAR((opline+1)->op2.var), container, dim, IS_TMP_VAR, BP_VAR_RW, 0 TSRMLS_CC);
value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, execute_data, &free_op_data1, BP_VAR_R);
var_ptr = _get_zval_ptr_ptr_var((opline+1)->op2.var, execute_data, &free_op_data2 TSRMLS_CC);
}
if (IS_CV == IS_VAR && UNEXPECTED(Z_TYPE_P(container) == IS_STR_OFFSET)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
}
- zend_fetch_dimension_address(EX_VAR(opline->result.var), container, _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_TMP_VAR, BP_VAR_W TSRMLS_CC);
+ zend_fetch_dimension_address(EX_VAR(opline->result.var), container, _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_TMP_VAR, BP_VAR_W, opline->extended_value != 0 TSRMLS_CC);
zval_dtor(free_op2.var);
if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
}
- /* We are going to assign the result by reference */
- if (UNEXPECTED(opline->extended_value != 0)) {
- zval *retval_ptr = EX_VAR(opline->result.var);
-
- if (Z_TYPE_P(retval_ptr) != IS_STR_OFFSET) {
- zval *retval_ind = retval_ptr;
-
- if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
- retval_ptr = Z_INDIRECT_P(retval_ptr);
- if (retval_ptr == &EG(uninitialized_zval) || retval_ptr == &EG(error_zval)) {
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
- }
- }
- if (!Z_ISREF_P(retval_ptr)) {
- if (Z_REFCOUNTED_P(retval_ptr)) {
- Z_DELREF_P(retval_ptr);
- SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
- } else {
- ZVAL_NEW_REF(retval_ptr, retval_ptr);
- }
- Z_ADDREF_P(retval_ptr);
- if (retval_ind != retval_ptr) {
- ZVAL_REF(retval_ind, Z_REF_P(retval_ptr));
- }
- }
- }
- }
-
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
if (IS_CV == IS_VAR && UNEXPECTED(Z_TYPE_P(container) == IS_STR_OFFSET)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
}
- zend_fetch_dimension_address(EX_VAR(opline->result.var), container, _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_TMP_VAR, BP_VAR_RW TSRMLS_CC);
+ zend_fetch_dimension_address(EX_VAR(opline->result.var), container, _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_TMP_VAR, BP_VAR_RW, 0 TSRMLS_CC);
zval_dtor(free_op2.var);
if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
}
- zend_fetch_dimension_address(EX_VAR(opline->result.var), container, _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_TMP_VAR, BP_VAR_W TSRMLS_CC);
+ zend_fetch_dimension_address(EX_VAR(opline->result.var), container, _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_TMP_VAR, BP_VAR_W, 0 TSRMLS_CC);
if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
}
SAVE_OPLINE();
container = _get_zval_ptr_cv_BP_VAR_UNSET(execute_data, opline->op1.var TSRMLS_CC);
- if (IS_CV == IS_CV) {
- SEPARATE_ZVAL_IF_NOT_REF(container);
- }
if (IS_CV == IS_VAR && UNEXPECTED(Z_TYPE_P(container) == IS_STR_OFFSET)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
}
- zend_fetch_dimension_address(EX_VAR(opline->result.var), container, _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_TMP_VAR, BP_VAR_UNSET TSRMLS_CC);
+ zend_fetch_dimension_address(EX_VAR(opline->result.var), container, _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_TMP_VAR, BP_VAR_UNSET, 0 TSRMLS_CC);
zval_dtor(free_op2.var);
if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
}
- if (UNEXPECTED(Z_TYPE_P(EX_VAR(opline->result.var)) == IS_STR_OFFSET)) {
- zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
- ZEND_VM_NEXT_OPCODE();
- } else {
- zend_free_op free_res;
- zval *retval_ptr = EX_VAR(opline->result.var);
-
- if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
- retval_ptr = Z_INDIRECT_P(retval_ptr);
- }
- PZVAL_UNLOCK(retval_ptr, &free_res);
- SEPARATE_ZVAL_IF_NOT_REF(retval_ptr);
- PZVAL_LOCK(retval_ptr);
- FREE_OP_VAR_PTR(free_res);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
- }
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
}
static int ZEND_FASTCALL zend_fetch_property_address_read_helper_SPEC_CV_TMP(ZEND_OPCODE_HANDLER_ARGS)
zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
}
- zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_W TSRMLS_CC);
+ zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_W, (opline->extended_value & ZEND_FETCH_MAKE_REF) != 0 TSRMLS_CC);
//??? if (1) {
//??? zval_ptr_dtor(property);
//??? } else {
EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
}
- /* We are going to assign the result by reference */
- if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
- zval *retval_ptr = EX_VAR(opline->result.var);
- zval *retval_ind = retval_ptr;
-
- if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
- retval_ptr = Z_INDIRECT_P(retval_ptr);
- if (retval_ptr == &EG(uninitialized_zval) || retval_ptr == &EG(error_zval)) {
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
- }
- }
- if (!Z_ISREF_P(retval_ptr)) {
- if (Z_REFCOUNTED_P(retval_ptr)) {
- Z_DELREF_P(retval_ptr);
- SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
- } else {
- ZVAL_NEW_REF(retval_ptr, retval_ptr);
- }
- Z_ADDREF_P(retval_ptr);
- if (retval_ind != retval_ptr) {
- ZVAL_REF(retval_ind, Z_REF_P(retval_ptr));
- }
- }
- }
-
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
if (IS_CV == IS_VAR && UNEXPECTED(Z_TYPE_P(container) == IS_STR_OFFSET)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
}
- zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_RW TSRMLS_CC);
+ zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_RW, 0 TSRMLS_CC);
//??? if (1) {
//??? zval_ptr_dtor(property);
//??? } else {
if (IS_CV == IS_VAR && UNEXPECTED(Z_TYPE_P(container) == IS_STR_OFFSET)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
}
- zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_W TSRMLS_CC);
+ zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_W, 0 TSRMLS_CC);
//??? if (1) {
//??? zval_ptr_dtor(property);
//??? } else {
static int ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1, free_op2, free_res;
+ zend_free_op free_op1, free_op2;
zval *container, *property, *retval_ptr;
SAVE_OPLINE();
container = _get_zval_ptr_cv_BP_VAR_UNSET(execute_data, opline->op1.var TSRMLS_CC);
property = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
- if (IS_CV == IS_CV) {
- SEPARATE_ZVAL_IF_NOT_REF(container);
- }
//??? if (1) {
//??? MAKE_REAL_ZVAL_PTR(property);
//??? }
if (IS_CV == IS_VAR && UNEXPECTED(Z_TYPE_P(container) == IS_STR_OFFSET)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
}
- zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_UNSET TSRMLS_CC);
+ zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_UNSET, 0 TSRMLS_CC);
//??? if (1) {
//??? zval_ptr_dtor(property);
//??? } else {
EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
}
- retval_ptr = EX_VAR(opline->result.var);
- if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
- retval_ptr = Z_INDIRECT_P(retval_ptr);
- }
- PZVAL_UNLOCK(retval_ptr, &free_res);
- SEPARATE_ZVAL_IF_NOT_REF(retval_ptr);
- PZVAL_LOCK(retval_ptr);
- FREE_OP_VAR_PTR(free_res);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
zval *dim = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
zval *variable_ptr;
- zend_fetch_dimension_address(EX_VAR((opline+1)->op2.var), object_ptr, dim, IS_TMP_VAR, BP_VAR_W TSRMLS_CC);
+ zend_fetch_dimension_address(EX_VAR((opline+1)->op2.var), object_ptr, dim, IS_TMP_VAR, BP_VAR_W, 0 TSRMLS_CC);
zval_dtor(free_op2.var);
value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, execute_data, &free_op_data1, BP_VAR_R);
SAVE_OPLINE();
container = _get_zval_ptr_cv_BP_VAR_UNSET(execute_data, opline->op1.var TSRMLS_CC);
- if (IS_CV == IS_CV) {
+ if (IS_CV != IS_UNUSED) {
SEPARATE_ZVAL_IF_NOT_REF(container);
}
offset = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
- if (IS_CV != IS_VAR || container) {
container_again:
- switch (Z_TYPE_P(container)) {
- case IS_ARRAY: {
- HashTable *ht = Z_ARRVAL_P(container);
+ switch (Z_TYPE_P(container)) {
+ case IS_ARRAY: {
+ HashTable *ht = Z_ARRVAL_P(container);
offset_again:
- switch (Z_TYPE_P(offset)) {
- case IS_DOUBLE:
- hval = zend_dval_to_lval(Z_DVAL_P(offset));
- zend_hash_index_del(ht, hval);
- break;
- case IS_RESOURCE:
- case IS_BOOL:
- case IS_LONG:
- hval = Z_LVAL_P(offset);
- 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) {
- ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_dim);
- }
- if (ht == &EG(symbol_table).ht) {
- zend_delete_global_variable(Z_STR_P(offset) TSRMLS_CC);
- } 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;
+ switch (Z_TYPE_P(offset)) {
+ case IS_DOUBLE:
+ hval = zend_dval_to_lval(Z_DVAL_P(offset));
+ zend_hash_index_del(ht, hval);
+ break;
+ case IS_RESOURCE:
+ case IS_BOOL:
+ case IS_LONG:
+ hval = Z_LVAL_P(offset);
+ 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) {
+ ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_dim);
+ }
+ if (ht == &EG(symbol_table).ht) {
+ zend_delete_global_variable(Z_STR_P(offset) TSRMLS_CC);
+ } 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;
num_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());
- break;
- case IS_REFERENCE:
- offset = Z_REFVAL_P(offset);
- goto offset_again;
- break;
- default:
- zend_error(E_WARNING, "Illegal offset type in unset");
- break;
- }
- zval_dtor(free_op2.var);
- break;
+ 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());
+ break;
+ case IS_REFERENCE:
+ offset = Z_REFVAL_P(offset);
+ goto offset_again;
+ break;
+ default:
+ zend_error(E_WARNING, "Illegal offset type in unset");
+ break;
}
- case IS_OBJECT:
- if (UNEXPECTED(Z_OBJ_HT_P(container)->unset_dimension == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use object as array");
- }
-//??? if (1) {
-//???? if (IS_TMP_VAR == IS_CONST) {
-//???? ZVAL_DUP(offset, offset);
-//???? } else if (IS_TMP_VAR == IS_TMP_VAR) {
-//??? MAKE_REAL_ZVAL_PTR(offset);
-//??? }
- Z_OBJ_HT_P(container)->unset_dimension(container, offset TSRMLS_CC);
-//??? if (1) {
-//???? if (IS_TMP_VAR == IS_CONST || IS_TMP_VAR == IS_TMP_VAR) {
-//??? zval_ptr_dtor(offset);
-//??? } else {
- zval_dtor(free_op2.var);
-//??? }
- break;
- case IS_STRING:
- zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
- ZEND_VM_CONTINUE(); /* bailed out before */
- case IS_REFERENCE:
- container = Z_REFVAL_P(container);
- goto container_again;
- break;
- default:
- zval_dtor(free_op2.var);
- break;
+ zval_dtor(free_op2.var);
+ break;
}
- } else {
- zval_dtor(free_op2.var);
+ case IS_OBJECT:
+ if (UNEXPECTED(Z_OBJ_HT_P(container)->unset_dimension == NULL)) {
+ zend_error_noreturn(E_ERROR, "Cannot use object as array");
+ }
+//??? if (1) {
+//???? if (IS_TMP_VAR == IS_CONST) {
+//???? ZVAL_DUP(offset, offset);
+//???? } else if (IS_TMP_VAR == IS_TMP_VAR) {
+//??? MAKE_REAL_ZVAL_PTR(offset);
+//??? }
+ Z_OBJ_HT_P(container)->unset_dimension(container, offset TSRMLS_CC);
+//??? if (1) {
+//???? if (IS_TMP_VAR == IS_CONST || IS_TMP_VAR == IS_TMP_VAR) {
+//??? zval_ptr_dtor(offset);
+//??? } else {
+ zval_dtor(free_op2.var);
+//??? }
+ break;
+ case IS_STRING:
+ case IS_STR_OFFSET:
+ zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
+ ZEND_VM_CONTINUE(); /* bailed out before */
+ case IS_REFERENCE:
+ container = Z_REFVAL_P(container);
+ goto container_again;
+ break;
+ default:
+ zval_dtor(free_op2.var);
+ break;
}
CHECK_EXCEPTION();
SAVE_OPLINE();
container = _get_zval_ptr_cv_BP_VAR_UNSET(execute_data, opline->op1.var TSRMLS_CC);
+ if (IS_CV == IS_VAR && Z_TYPE_P(container) == IS_STR_OFFSET) {
+ zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
+ }
offset = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
- if (IS_CV != IS_VAR || container) {
- if (IS_CV == IS_CV) {
- SEPARATE_ZVAL_IF_NOT_REF(container);
- }
- if (Z_TYPE_P(container) == IS_OBJECT) {
+ ZVAL_DEREF(container);
+ if (Z_TYPE_P(container) == IS_OBJECT) {
//??? if (1) {
//??? MAKE_REAL_ZVAL_PTR(offset);
//??? }
- if (Z_OBJ_HT_P(container)->unset_property) {
- Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
- } else {
- zend_error(E_NOTICE, "Trying to unset property of non-object");
- }
-//??? if (1) {
-//??? zval_ptr_dtor(offset);
-//??? } else {
- zval_dtor(free_op2.var);
-//??? }
+ if (Z_OBJ_HT_P(container)->unset_property) {
+ Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
} else {
- zval_dtor(free_op2.var);
+ zend_error(E_NOTICE, "Trying to unset property of non-object");
}
+//??? if (1) {
+//??? zval_ptr_dtor(offset);
+//??? } else {
+ zval_dtor(free_op2.var);
+//??? }
} else {
zval_dtor(free_op2.var);
}
} else {
zval *dim = _get_zval_ptr_var_deref(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
- zend_fetch_dimension_address(EX_VAR((opline+1)->op2.var), container, dim, IS_VAR, BP_VAR_RW TSRMLS_CC);
+ zend_fetch_dimension_address(EX_VAR((opline+1)->op2.var), container, dim, IS_VAR, BP_VAR_RW, 0 TSRMLS_CC);
value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, execute_data, &free_op_data1, BP_VAR_R);
var_ptr = _get_zval_ptr_ptr_var((opline+1)->op2.var, execute_data, &free_op_data2 TSRMLS_CC);
}
} else {
target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
-/*
- if (!target_symbol_table) {
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
- }
-*/
if ((retval = zend_hash_find(target_symbol_table, Z_STR_P(varname))) == NULL) {
switch (type) {
case BP_VAR_R:
break;
EMPTY_SWITCH_DEFAULT_CASE()
}
-//??? GLOBAL or $$name variable may be an INDIRECT pointer to CV
- } else if (/*(opline->extended_value & ZEND_FETCH_TYPE_MASK) != ZEND_FETCH_STATIC &&*/
+ /* GLOBAL or $$name variable may be an INDIRECT pointer to CV */
+ } else if (/* ??? (opline->extended_value & ZEND_FETCH_TYPE_MASK) != ZEND_FETCH_STATIC &&*/
Z_TYPE_P(retval) == IS_INDIRECT) {
retval = Z_INDIRECT_P(retval);
if (Z_TYPE_P(retval) == IS_UNDEF) {
}
if (EXPECTED(retval != NULL)) {
- if (Z_REFCOUNTED_P(retval)) Z_ADDREF_P(retval);
switch (type) {
case BP_VAR_R:
case BP_VAR_IS:
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), retval);
+ ZVAL_COPY(EX_VAR(opline->result.var), retval);
break;
case BP_VAR_UNSET: {
//??? zend_free_op free_res;
if (IS_CV == IS_VAR && UNEXPECTED(Z_TYPE_P(container) == IS_STR_OFFSET)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
}
- zend_fetch_dimension_address(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_W TSRMLS_CC);
+ zend_fetch_dimension_address(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_W, opline->extended_value != 0 TSRMLS_CC);
zval_ptr_dtor_nogc(free_op2.var);
if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
}
- /* We are going to assign the result by reference */
- if (UNEXPECTED(opline->extended_value != 0)) {
- zval *retval_ptr = EX_VAR(opline->result.var);
-
- if (Z_TYPE_P(retval_ptr) != IS_STR_OFFSET) {
- zval *retval_ind = retval_ptr;
-
- if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
- retval_ptr = Z_INDIRECT_P(retval_ptr);
- if (retval_ptr == &EG(uninitialized_zval) || retval_ptr == &EG(error_zval)) {
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
- }
- }
- if (!Z_ISREF_P(retval_ptr)) {
- if (Z_REFCOUNTED_P(retval_ptr)) {
- Z_DELREF_P(retval_ptr);
- SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
- } else {
- ZVAL_NEW_REF(retval_ptr, retval_ptr);
- }
- Z_ADDREF_P(retval_ptr);
- if (retval_ind != retval_ptr) {
- ZVAL_REF(retval_ind, Z_REF_P(retval_ptr));
- }
- }
- }
- }
-
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
if (IS_CV == IS_VAR && UNEXPECTED(Z_TYPE_P(container) == IS_STR_OFFSET)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
}
- zend_fetch_dimension_address(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_RW TSRMLS_CC);
+ zend_fetch_dimension_address(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_RW, 0 TSRMLS_CC);
zval_ptr_dtor_nogc(free_op2.var);
if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
}
- zend_fetch_dimension_address(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_W TSRMLS_CC);
+ zend_fetch_dimension_address(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_W, 0 TSRMLS_CC);
if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
}
SAVE_OPLINE();
container = _get_zval_ptr_cv_BP_VAR_UNSET(execute_data, opline->op1.var TSRMLS_CC);
- if (IS_CV == IS_CV) {
- SEPARATE_ZVAL_IF_NOT_REF(container);
- }
if (IS_CV == IS_VAR && UNEXPECTED(Z_TYPE_P(container) == IS_STR_OFFSET)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
}
- zend_fetch_dimension_address(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_UNSET TSRMLS_CC);
+ zend_fetch_dimension_address(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC), IS_VAR, BP_VAR_UNSET, 0 TSRMLS_CC);
zval_ptr_dtor_nogc(free_op2.var);
if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
}
- if (UNEXPECTED(Z_TYPE_P(EX_VAR(opline->result.var)) == IS_STR_OFFSET)) {
- zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
- ZEND_VM_NEXT_OPCODE();
- } else {
- zend_free_op free_res;
- zval *retval_ptr = EX_VAR(opline->result.var);
-
- if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
- retval_ptr = Z_INDIRECT_P(retval_ptr);
- }
- PZVAL_UNLOCK(retval_ptr, &free_res);
- SEPARATE_ZVAL_IF_NOT_REF(retval_ptr);
- PZVAL_LOCK(retval_ptr);
- FREE_OP_VAR_PTR(free_res);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
- }
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
}
static int ZEND_FASTCALL zend_fetch_property_address_read_helper_SPEC_CV_VAR(ZEND_OPCODE_HANDLER_ARGS)
zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
}
- zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_W TSRMLS_CC);
+ zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_W, (opline->extended_value & ZEND_FETCH_MAKE_REF) != 0 TSRMLS_CC);
//??? if (0) {
//??? zval_ptr_dtor(property);
//??? } else {
EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
}
- /* We are going to assign the result by reference */
- if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
- zval *retval_ptr = EX_VAR(opline->result.var);
- zval *retval_ind = retval_ptr;
-
- if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
- retval_ptr = Z_INDIRECT_P(retval_ptr);
- if (retval_ptr == &EG(uninitialized_zval) || retval_ptr == &EG(error_zval)) {
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
- }
- }
- if (!Z_ISREF_P(retval_ptr)) {
- if (Z_REFCOUNTED_P(retval_ptr)) {
- Z_DELREF_P(retval_ptr);
- SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
- } else {
- ZVAL_NEW_REF(retval_ptr, retval_ptr);
- }
- Z_ADDREF_P(retval_ptr);
- if (retval_ind != retval_ptr) {
- ZVAL_REF(retval_ind, Z_REF_P(retval_ptr));
- }
- }
- }
-
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
if (IS_CV == IS_VAR && UNEXPECTED(Z_TYPE_P(container) == IS_STR_OFFSET)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
}
- zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_RW TSRMLS_CC);
+ zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_RW, 0 TSRMLS_CC);
//??? if (0) {
//??? zval_ptr_dtor(property);
//??? } else {
if (IS_CV == IS_VAR && UNEXPECTED(Z_TYPE_P(container) == IS_STR_OFFSET)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
}
- zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_W TSRMLS_CC);
+ zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_W, 0 TSRMLS_CC);
//??? if (0) {
//??? zval_ptr_dtor(property);
//??? } else {
static int ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1, free_op2, free_res;
+ zend_free_op free_op1, free_op2;
zval *container, *property, *retval_ptr;
SAVE_OPLINE();
container = _get_zval_ptr_cv_BP_VAR_UNSET(execute_data, opline->op1.var TSRMLS_CC);
property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
- if (IS_CV == IS_CV) {
- SEPARATE_ZVAL_IF_NOT_REF(container);
- }
//??? if (0) {
//??? MAKE_REAL_ZVAL_PTR(property);
//??? }
if (IS_CV == IS_VAR && UNEXPECTED(Z_TYPE_P(container) == IS_STR_OFFSET)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
}
- zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_UNSET TSRMLS_CC);
+ zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_UNSET, 0 TSRMLS_CC);
//??? if (0) {
//??? zval_ptr_dtor(property);
//??? } else {
EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
}
- retval_ptr = EX_VAR(opline->result.var);
- if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
- retval_ptr = Z_INDIRECT_P(retval_ptr);
- }
- PZVAL_UNLOCK(retval_ptr, &free_res);
- SEPARATE_ZVAL_IF_NOT_REF(retval_ptr);
- PZVAL_LOCK(retval_ptr);
- FREE_OP_VAR_PTR(free_res);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
zval *dim = _get_zval_ptr_var_deref(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
zval *variable_ptr;
- zend_fetch_dimension_address(EX_VAR((opline+1)->op2.var), object_ptr, dim, IS_VAR, BP_VAR_W TSRMLS_CC);
+ zend_fetch_dimension_address(EX_VAR((opline+1)->op2.var), object_ptr, dim, IS_VAR, BP_VAR_W, 0 TSRMLS_CC);
zval_ptr_dtor_nogc(free_op2.var);
value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, execute_data, &free_op_data1, BP_VAR_R);
SAVE_OPLINE();
container = _get_zval_ptr_cv_BP_VAR_UNSET(execute_data, opline->op1.var TSRMLS_CC);
- if (IS_CV == IS_CV) {
+ if (IS_CV != IS_UNUSED) {
SEPARATE_ZVAL_IF_NOT_REF(container);
}
offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
- if (IS_CV != IS_VAR || container) {
container_again:
- switch (Z_TYPE_P(container)) {
- case IS_ARRAY: {
- HashTable *ht = Z_ARRVAL_P(container);
+ switch (Z_TYPE_P(container)) {
+ case IS_ARRAY: {
+ HashTable *ht = Z_ARRVAL_P(container);
offset_again:
- switch (Z_TYPE_P(offset)) {
- case IS_DOUBLE:
- hval = zend_dval_to_lval(Z_DVAL_P(offset));
- zend_hash_index_del(ht, hval);
- break;
- case IS_RESOURCE:
- case IS_BOOL:
- case IS_LONG:
- hval = Z_LVAL_P(offset);
- 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) {
- ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_dim);
- }
- if (ht == &EG(symbol_table).ht) {
- zend_delete_global_variable(Z_STR_P(offset) TSRMLS_CC);
- } else {
- zend_hash_del(ht, Z_STR_P(offset));
- }
- if (IS_VAR == IS_CV || IS_VAR == IS_VAR) {
- zval_ptr_dtor(offset);
- }
- break;
+ switch (Z_TYPE_P(offset)) {
+ case IS_DOUBLE:
+ hval = zend_dval_to_lval(Z_DVAL_P(offset));
+ zend_hash_index_del(ht, hval);
+ break;
+ case IS_RESOURCE:
+ case IS_BOOL:
+ case IS_LONG:
+ hval = Z_LVAL_P(offset);
+ 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) {
+ ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_dim);
+ }
+ if (ht == &EG(symbol_table).ht) {
+ zend_delete_global_variable(Z_STR_P(offset) TSRMLS_CC);
+ } else {
+ zend_hash_del(ht, Z_STR_P(offset));
+ }
+ if (IS_VAR == IS_CV || IS_VAR == IS_VAR) {
+ zval_ptr_dtor(offset);
+ }
+ break;
num_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());
- break;
- case IS_REFERENCE:
- offset = Z_REFVAL_P(offset);
- goto offset_again;
- break;
- default:
- zend_error(E_WARNING, "Illegal offset type in unset");
- break;
- }
- zval_ptr_dtor_nogc(free_op2.var);
- break;
+ 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());
+ break;
+ case IS_REFERENCE:
+ offset = Z_REFVAL_P(offset);
+ goto offset_again;
+ break;
+ default:
+ zend_error(E_WARNING, "Illegal offset type in unset");
+ break;
}
- case IS_OBJECT:
- if (UNEXPECTED(Z_OBJ_HT_P(container)->unset_dimension == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use object as array");
- }
-//??? if (0) {
-//???? if (IS_VAR == IS_CONST) {
-//???? ZVAL_DUP(offset, offset);
-//???? } else if (IS_VAR == IS_TMP_VAR) {
-//??? MAKE_REAL_ZVAL_PTR(offset);
-//??? }
- Z_OBJ_HT_P(container)->unset_dimension(container, offset TSRMLS_CC);
-//??? if (0) {
-//???? if (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR) {
-//??? zval_ptr_dtor(offset);
-//??? } else {
- zval_ptr_dtor_nogc(free_op2.var);
-//??? }
- break;
- case IS_STRING:
- zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
- ZEND_VM_CONTINUE(); /* bailed out before */
- case IS_REFERENCE:
- container = Z_REFVAL_P(container);
- goto container_again;
- break;
- default:
- zval_ptr_dtor_nogc(free_op2.var);
- break;
+ zval_ptr_dtor_nogc(free_op2.var);
+ break;
}
- } else {
- zval_ptr_dtor_nogc(free_op2.var);
+ case IS_OBJECT:
+ if (UNEXPECTED(Z_OBJ_HT_P(container)->unset_dimension == NULL)) {
+ zend_error_noreturn(E_ERROR, "Cannot use object as array");
+ }
+//??? if (0) {
+//???? if (IS_VAR == IS_CONST) {
+//???? ZVAL_DUP(offset, offset);
+//???? } else if (IS_VAR == IS_TMP_VAR) {
+//??? MAKE_REAL_ZVAL_PTR(offset);
+//??? }
+ Z_OBJ_HT_P(container)->unset_dimension(container, offset TSRMLS_CC);
+//??? if (0) {
+//???? if (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR) {
+//??? zval_ptr_dtor(offset);
+//??? } else {
+ zval_ptr_dtor_nogc(free_op2.var);
+//??? }
+ break;
+ case IS_STRING:
+ case IS_STR_OFFSET:
+ zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
+ ZEND_VM_CONTINUE(); /* bailed out before */
+ case IS_REFERENCE:
+ container = Z_REFVAL_P(container);
+ goto container_again;
+ break;
+ default:
+ zval_ptr_dtor_nogc(free_op2.var);
+ break;
}
CHECK_EXCEPTION();
SAVE_OPLINE();
container = _get_zval_ptr_cv_BP_VAR_UNSET(execute_data, opline->op1.var TSRMLS_CC);
+ if (IS_CV == IS_VAR && Z_TYPE_P(container) == IS_STR_OFFSET) {
+ zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
+ }
offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2 TSRMLS_CC);
- if (IS_CV != IS_VAR || container) {
- if (IS_CV == IS_CV) {
- SEPARATE_ZVAL_IF_NOT_REF(container);
- }
- if (Z_TYPE_P(container) == IS_OBJECT) {
+ ZVAL_DEREF(container);
+ if (Z_TYPE_P(container) == IS_OBJECT) {
//??? if (0) {
//??? MAKE_REAL_ZVAL_PTR(offset);
//??? }
- if (Z_OBJ_HT_P(container)->unset_property) {
- Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
- } else {
- zend_error(E_NOTICE, "Trying to unset property of non-object");
- }
-//??? if (0) {
-//??? zval_ptr_dtor(offset);
-//??? } else {
- zval_ptr_dtor_nogc(free_op2.var);
-//??? }
+ if (Z_OBJ_HT_P(container)->unset_property) {
+ Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
} else {
- zval_ptr_dtor_nogc(free_op2.var);
+ zend_error(E_NOTICE, "Trying to unset property of non-object");
}
+//??? if (0) {
+//??? zval_ptr_dtor(offset);
+//??? } else {
+ zval_ptr_dtor_nogc(free_op2.var);
+//??? }
} else {
zval_ptr_dtor_nogc(free_op2.var);
}
} else {
zval *dim = NULL;
- zend_fetch_dimension_address(EX_VAR((opline+1)->op2.var), container, dim, IS_UNUSED, BP_VAR_RW TSRMLS_CC);
+ zend_fetch_dimension_address(EX_VAR((opline+1)->op2.var), container, dim, IS_UNUSED, BP_VAR_RW, 0 TSRMLS_CC);
value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, execute_data, &free_op_data1, BP_VAR_R);
var_ptr = _get_zval_ptr_ptr_var((opline+1)->op2.var, execute_data, &free_op_data2 TSRMLS_CC);
}
} else {
target_symbol_table = zend_get_target_symbol_table(opline->extended_value & ZEND_FETCH_TYPE_MASK TSRMLS_CC);
-/*
- if (!target_symbol_table) {
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
- }
-*/
if ((retval = zend_hash_find(target_symbol_table, Z_STR_P(varname))) == NULL) {
switch (type) {
case BP_VAR_R:
break;
EMPTY_SWITCH_DEFAULT_CASE()
}
-//??? GLOBAL or $$name variable may be an INDIRECT pointer to CV
- } else if (/*(opline->extended_value & ZEND_FETCH_TYPE_MASK) != ZEND_FETCH_STATIC &&*/
+ /* GLOBAL or $$name variable may be an INDIRECT pointer to CV */
+ } else if (/* ??? (opline->extended_value & ZEND_FETCH_TYPE_MASK) != ZEND_FETCH_STATIC &&*/
Z_TYPE_P(retval) == IS_INDIRECT) {
retval = Z_INDIRECT_P(retval);
if (Z_TYPE_P(retval) == IS_UNDEF) {
}
if (EXPECTED(retval != NULL)) {
- if (Z_REFCOUNTED_P(retval)) Z_ADDREF_P(retval);
switch (type) {
case BP_VAR_R:
case BP_VAR_IS:
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), retval);
+ ZVAL_COPY(EX_VAR(opline->result.var), retval);
break;
case BP_VAR_UNSET: {
//??? zend_free_op free_res;
if (IS_CV == IS_VAR && UNEXPECTED(Z_TYPE_P(container) == IS_STR_OFFSET)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
}
- zend_fetch_dimension_address(EX_VAR(opline->result.var), container, NULL, IS_UNUSED, BP_VAR_W TSRMLS_CC);
+ zend_fetch_dimension_address(EX_VAR(opline->result.var), container, NULL, IS_UNUSED, BP_VAR_W, opline->extended_value != 0 TSRMLS_CC);
if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
}
- /* We are going to assign the result by reference */
- if (UNEXPECTED(opline->extended_value != 0)) {
- zval *retval_ptr = EX_VAR(opline->result.var);
-
- if (Z_TYPE_P(retval_ptr) != IS_STR_OFFSET) {
- zval *retval_ind = retval_ptr;
-
- if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
- retval_ptr = Z_INDIRECT_P(retval_ptr);
- if (retval_ptr == &EG(uninitialized_zval) || retval_ptr == &EG(error_zval)) {
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
- }
- }
- if (!Z_ISREF_P(retval_ptr)) {
- if (Z_REFCOUNTED_P(retval_ptr)) {
- Z_DELREF_P(retval_ptr);
- SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
- } else {
- ZVAL_NEW_REF(retval_ptr, retval_ptr);
- }
- Z_ADDREF_P(retval_ptr);
- if (retval_ind != retval_ptr) {
- ZVAL_REF(retval_ind, Z_REF_P(retval_ptr));
- }
- }
- }
- }
-
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
if (IS_CV == IS_VAR && UNEXPECTED(Z_TYPE_P(container) == IS_STR_OFFSET)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
}
- zend_fetch_dimension_address(EX_VAR(opline->result.var), container, NULL, IS_UNUSED, BP_VAR_RW TSRMLS_CC);
+ zend_fetch_dimension_address(EX_VAR(opline->result.var), container, NULL, IS_UNUSED, BP_VAR_RW, 0 TSRMLS_CC);
if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
}
- zend_fetch_dimension_address(EX_VAR(opline->result.var), container, NULL, IS_UNUSED, BP_VAR_W TSRMLS_CC);
+ zend_fetch_dimension_address(EX_VAR(opline->result.var), container, NULL, IS_UNUSED, BP_VAR_W, 0 TSRMLS_CC);
if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
}
zval *dim = NULL;
zval *variable_ptr;
- zend_fetch_dimension_address(EX_VAR((opline+1)->op2.var), object_ptr, dim, IS_UNUSED, BP_VAR_W TSRMLS_CC);
+ zend_fetch_dimension_address(EX_VAR((opline+1)->op2.var), object_ptr, dim, IS_UNUSED, BP_VAR_W, 0 TSRMLS_CC);
value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, execute_data, &free_op_data1, BP_VAR_R);
variable_ptr = _get_zval_ptr_ptr_var((opline+1)->op2.var, execute_data, &free_op_data2 TSRMLS_CC);
} else {
zval *dim = _get_zval_ptr_cv_deref_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC);
- zend_fetch_dimension_address(EX_VAR((opline+1)->op2.var), container, dim, IS_CV, BP_VAR_RW TSRMLS_CC);
+ zend_fetch_dimension_address(EX_VAR((opline+1)->op2.var), container, dim, IS_CV, BP_VAR_RW, 0 TSRMLS_CC);
value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, execute_data, &free_op_data1, BP_VAR_R);
var_ptr = _get_zval_ptr_ptr_var((opline+1)->op2.var, execute_data, &free_op_data2 TSRMLS_CC);
}
if (IS_CV == IS_VAR && UNEXPECTED(Z_TYPE_P(container) == IS_STR_OFFSET)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
}
- zend_fetch_dimension_address(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC), IS_CV, BP_VAR_W TSRMLS_CC);
+ zend_fetch_dimension_address(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC), IS_CV, BP_VAR_W, opline->extended_value != 0 TSRMLS_CC);
if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
}
- /* We are going to assign the result by reference */
- if (UNEXPECTED(opline->extended_value != 0)) {
- zval *retval_ptr = EX_VAR(opline->result.var);
-
- if (Z_TYPE_P(retval_ptr) != IS_STR_OFFSET) {
- zval *retval_ind = retval_ptr;
-
- if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
- retval_ptr = Z_INDIRECT_P(retval_ptr);
- if (retval_ptr == &EG(uninitialized_zval) || retval_ptr == &EG(error_zval)) {
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
- }
- }
- if (!Z_ISREF_P(retval_ptr)) {
- if (Z_REFCOUNTED_P(retval_ptr)) {
- Z_DELREF_P(retval_ptr);
- SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
- } else {
- ZVAL_NEW_REF(retval_ptr, retval_ptr);
- }
- Z_ADDREF_P(retval_ptr);
- if (retval_ind != retval_ptr) {
- ZVAL_REF(retval_ind, Z_REF_P(retval_ptr));
- }
- }
- }
- }
-
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
if (IS_CV == IS_VAR && UNEXPECTED(Z_TYPE_P(container) == IS_STR_OFFSET)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
}
- zend_fetch_dimension_address(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC), IS_CV, BP_VAR_RW TSRMLS_CC);
+ zend_fetch_dimension_address(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC), IS_CV, BP_VAR_RW, 0 TSRMLS_CC);
if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
}
- zend_fetch_dimension_address(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC), IS_CV, BP_VAR_W TSRMLS_CC);
+ zend_fetch_dimension_address(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC), IS_CV, BP_VAR_W, 0 TSRMLS_CC);
if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
}
SAVE_OPLINE();
container = _get_zval_ptr_cv_BP_VAR_UNSET(execute_data, opline->op1.var TSRMLS_CC);
- if (IS_CV == IS_CV) {
- SEPARATE_ZVAL_IF_NOT_REF(container);
- }
if (IS_CV == IS_VAR && UNEXPECTED(Z_TYPE_P(container) == IS_STR_OFFSET)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
}
- zend_fetch_dimension_address(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC), IS_CV, BP_VAR_UNSET TSRMLS_CC);
+ zend_fetch_dimension_address(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC), IS_CV, BP_VAR_UNSET, 0 TSRMLS_CC);
if (IS_CV == IS_VAR && 0 && READY_TO_DESTROY(free_op1.var)) {
EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
}
- if (UNEXPECTED(Z_TYPE_P(EX_VAR(opline->result.var)) == IS_STR_OFFSET)) {
- zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
- ZEND_VM_NEXT_OPCODE();
- } else {
- zend_free_op free_res;
- zval *retval_ptr = EX_VAR(opline->result.var);
-
- if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
- retval_ptr = Z_INDIRECT_P(retval_ptr);
- }
- PZVAL_UNLOCK(retval_ptr, &free_res);
- SEPARATE_ZVAL_IF_NOT_REF(retval_ptr);
- PZVAL_LOCK(retval_ptr);
- FREE_OP_VAR_PTR(free_res);
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
- }
+ CHECK_EXCEPTION();
+ ZEND_VM_NEXT_OPCODE();
}
static int ZEND_FASTCALL zend_fetch_property_address_read_helper_SPEC_CV_CV(ZEND_OPCODE_HANDLER_ARGS)
zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
}
- zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_W TSRMLS_CC);
+ zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_W, (opline->extended_value & ZEND_FETCH_MAKE_REF) != 0 TSRMLS_CC);
//??? if (0) {
//??? zval_ptr_dtor(property);
//??? } else {
EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
}
- /* We are going to assign the result by reference */
- if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
- zval *retval_ptr = EX_VAR(opline->result.var);
- zval *retval_ind = retval_ptr;
-
- if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
- retval_ptr = Z_INDIRECT_P(retval_ptr);
- if (retval_ptr == &EG(uninitialized_zval) || retval_ptr == &EG(error_zval)) {
- CHECK_EXCEPTION();
- ZEND_VM_NEXT_OPCODE();
- }
- }
- if (!Z_ISREF_P(retval_ptr)) {
- if (Z_REFCOUNTED_P(retval_ptr)) {
- Z_DELREF_P(retval_ptr);
- SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr);
- } else {
- ZVAL_NEW_REF(retval_ptr, retval_ptr);
- }
- Z_ADDREF_P(retval_ptr);
- if (retval_ind != retval_ptr) {
- ZVAL_REF(retval_ind, Z_REF_P(retval_ptr));
- }
- }
- }
-
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
if (IS_CV == IS_VAR && UNEXPECTED(Z_TYPE_P(container) == IS_STR_OFFSET)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
}
- zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_RW TSRMLS_CC);
+ zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_RW, 0 TSRMLS_CC);
//??? if (0) {
//??? zval_ptr_dtor(property);
//??? } else {
if (IS_CV == IS_VAR && UNEXPECTED(Z_TYPE_P(container) == IS_STR_OFFSET)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
}
- zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_W TSRMLS_CC);
+ zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_W, 0 TSRMLS_CC);
//??? if (0) {
//??? zval_ptr_dtor(property);
//??? } else {
static int ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
USE_OPLINE
- zend_free_op free_op1, free_res;
+ zend_free_op free_op1;
zval *container, *property, *retval_ptr;
SAVE_OPLINE();
container = _get_zval_ptr_cv_BP_VAR_UNSET(execute_data, opline->op1.var TSRMLS_CC);
property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC);
- if (IS_CV == IS_CV) {
- SEPARATE_ZVAL_IF_NOT_REF(container);
- }
//??? if (0) {
//??? MAKE_REAL_ZVAL_PTR(property);
//??? }
if (IS_CV == IS_VAR && UNEXPECTED(Z_TYPE_P(container) == IS_STR_OFFSET)) {
zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
}
- zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_UNSET TSRMLS_CC);
+ zend_fetch_property_address(EX_VAR(opline->result.var), container, property, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL), BP_VAR_UNSET, 0 TSRMLS_CC);
//??? if (0) {
//??? zval_ptr_dtor(property);
//??? } else {
EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var));
}
- retval_ptr = EX_VAR(opline->result.var);
- if (Z_TYPE_P(retval_ptr) == IS_INDIRECT) {
- retval_ptr = Z_INDIRECT_P(retval_ptr);
- }
- PZVAL_UNLOCK(retval_ptr, &free_res);
- SEPARATE_ZVAL_IF_NOT_REF(retval_ptr);
- PZVAL_LOCK(retval_ptr);
- FREE_OP_VAR_PTR(free_res);
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
}
zval *dim = _get_zval_ptr_cv_deref_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC);
zval *variable_ptr;
- zend_fetch_dimension_address(EX_VAR((opline+1)->op2.var), object_ptr, dim, IS_CV, BP_VAR_W TSRMLS_CC);
+ zend_fetch_dimension_address(EX_VAR((opline+1)->op2.var), object_ptr, dim, IS_CV, BP_VAR_W, 0 TSRMLS_CC);
value = get_zval_ptr((opline+1)->op1_type, &(opline+1)->op1, execute_data, &free_op_data1, BP_VAR_R);
variable_ptr = _get_zval_ptr_ptr_var((opline+1)->op2.var, execute_data, &free_op_data2 TSRMLS_CC);
SAVE_OPLINE();
container = _get_zval_ptr_cv_BP_VAR_UNSET(execute_data, opline->op1.var TSRMLS_CC);
- if (IS_CV == IS_CV) {
+ if (IS_CV != IS_UNUSED) {
SEPARATE_ZVAL_IF_NOT_REF(container);
}
offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC);
- if (IS_CV != IS_VAR || container) {
container_again:
- switch (Z_TYPE_P(container)) {
- case IS_ARRAY: {
- HashTable *ht = Z_ARRVAL_P(container);
+ switch (Z_TYPE_P(container)) {
+ case IS_ARRAY: {
+ HashTable *ht = Z_ARRVAL_P(container);
offset_again:
- switch (Z_TYPE_P(offset)) {
- case IS_DOUBLE:
- hval = zend_dval_to_lval(Z_DVAL_P(offset));
- zend_hash_index_del(ht, hval);
- break;
- case IS_RESOURCE:
- case IS_BOOL:
- case IS_LONG:
- hval = Z_LVAL_P(offset);
- 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) {
- ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_dim);
- }
- if (ht == &EG(symbol_table).ht) {
- zend_delete_global_variable(Z_STR_P(offset) TSRMLS_CC);
- } else {
- zend_hash_del(ht, Z_STR_P(offset));
- }
- if (IS_CV == IS_CV || IS_CV == IS_VAR) {
- zval_ptr_dtor(offset);
- }
- break;
+ switch (Z_TYPE_P(offset)) {
+ case IS_DOUBLE:
+ hval = zend_dval_to_lval(Z_DVAL_P(offset));
+ zend_hash_index_del(ht, hval);
+ break;
+ case IS_RESOURCE:
+ case IS_BOOL:
+ case IS_LONG:
+ hval = Z_LVAL_P(offset);
+ 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) {
+ ZEND_HANDLE_NUMERIC_EX(Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1, hval, goto num_index_dim);
+ }
+ if (ht == &EG(symbol_table).ht) {
+ zend_delete_global_variable(Z_STR_P(offset) TSRMLS_CC);
+ } else {
+ zend_hash_del(ht, Z_STR_P(offset));
+ }
+ if (IS_CV == IS_CV || IS_CV == IS_VAR) {
+ zval_ptr_dtor(offset);
+ }
+ break;
num_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());
- break;
- case IS_REFERENCE:
- offset = Z_REFVAL_P(offset);
- goto offset_again;
- break;
- default:
- zend_error(E_WARNING, "Illegal offset type in unset");
- break;
- }
-
- break;
+ 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());
+ break;
+ case IS_REFERENCE:
+ offset = Z_REFVAL_P(offset);
+ goto offset_again;
+ break;
+ default:
+ zend_error(E_WARNING, "Illegal offset type in unset");
+ break;
}
- case IS_OBJECT:
- if (UNEXPECTED(Z_OBJ_HT_P(container)->unset_dimension == NULL)) {
- zend_error_noreturn(E_ERROR, "Cannot use object as array");
- }
-//??? if (0) {
-//???? if (IS_CV == IS_CONST) {
-//???? ZVAL_DUP(offset, offset);
-//???? } else if (IS_CV == IS_TMP_VAR) {
-//??? MAKE_REAL_ZVAL_PTR(offset);
-//??? }
- Z_OBJ_HT_P(container)->unset_dimension(container, offset TSRMLS_CC);
-//??? if (0) {
-//???? if (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR) {
-//??? zval_ptr_dtor(offset);
-//??? } else {
-
-//??? }
- break;
- case IS_STRING:
- zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
- ZEND_VM_CONTINUE(); /* bailed out before */
- case IS_REFERENCE:
- container = Z_REFVAL_P(container);
- goto container_again;
- break;
- default:
- break;
+ break;
}
- } else {
+ case IS_OBJECT:
+ if (UNEXPECTED(Z_OBJ_HT_P(container)->unset_dimension == NULL)) {
+ zend_error_noreturn(E_ERROR, "Cannot use object as array");
+ }
+//??? if (0) {
+//???? if (IS_CV == IS_CONST) {
+//???? ZVAL_DUP(offset, offset);
+//???? } else if (IS_CV == IS_TMP_VAR) {
+//??? MAKE_REAL_ZVAL_PTR(offset);
+//??? }
+ Z_OBJ_HT_P(container)->unset_dimension(container, offset TSRMLS_CC);
+//??? if (0) {
+//???? if (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR) {
+//??? zval_ptr_dtor(offset);
+//??? } else {
+
+//??? }
+ break;
+ case IS_STRING:
+ case IS_STR_OFFSET:
+ zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
+ ZEND_VM_CONTINUE(); /* bailed out before */
+ case IS_REFERENCE:
+ container = Z_REFVAL_P(container);
+ goto container_again;
+ break;
+ default:
+ break;
}
CHECK_EXCEPTION();
SAVE_OPLINE();
container = _get_zval_ptr_cv_BP_VAR_UNSET(execute_data, opline->op1.var TSRMLS_CC);
+ if (IS_CV == IS_VAR && Z_TYPE_P(container) == IS_STR_OFFSET) {
+ zend_error_noreturn(E_ERROR, "Cannot unset string offsets");
+ }
offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var TSRMLS_CC);
- if (IS_CV != IS_VAR || container) {
- if (IS_CV == IS_CV) {
- SEPARATE_ZVAL_IF_NOT_REF(container);
- }
- if (Z_TYPE_P(container) == IS_OBJECT) {
+ ZVAL_DEREF(container);
+ if (Z_TYPE_P(container) == IS_OBJECT) {
//??? if (0) {
//??? MAKE_REAL_ZVAL_PTR(offset);
//??? }
- if (Z_OBJ_HT_P(container)->unset_property) {
- Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
- } else {
- zend_error(E_NOTICE, "Trying to unset property of non-object");
- }
-//??? if (0) {
-//??? zval_ptr_dtor(offset);
-//??? } else {
-
-//??? }
+ if (Z_OBJ_HT_P(container)->unset_property) {
+ Z_OBJ_HT_P(container)->unset_property(container, offset, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL) TSRMLS_CC);
} else {
-
+ zend_error(E_NOTICE, "Trying to unset property of non-object");
}
+//??? if (0) {
+//??? zval_ptr_dtor(offset);
+//??? } else {
+
+//??? }
} else {
}