From 98885bfa1e5b4b33bbc356e221d734a1072804fe Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Wed, 23 Dec 2015 13:52:15 +0300 Subject: [PATCH] Consolidate indirect string offset modification checks (Nikita, Dmitry) Check it once, instead of dozens of times. --- Zend/zend_execute.c | 118 ++- Zend/zend_vm_def.h | 156 ---- Zend/zend_vm_execute.h | 1570 ++++------------------------------------ 3 files changed, 250 insertions(+), 1594 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index e287abf470..6f8c70f014 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -1704,6 +1704,120 @@ try_again: return offset; } +static zend_never_inline void zend_wrong_string_offset(void) +{ + const char *msg = NULL; + const zend_op *opline = EG(current_execute_data)->opline; + const zend_op *end; + uint32_t var; + + switch (opline->opcode) { + case ZEND_ASSIGN_ADD: + case ZEND_ASSIGN_SUB: + case ZEND_ASSIGN_MUL: + case ZEND_ASSIGN_DIV: + case ZEND_ASSIGN_MOD: + case ZEND_ASSIGN_SL: + case ZEND_ASSIGN_SR: + case ZEND_ASSIGN_CONCAT: + case ZEND_ASSIGN_BW_OR: + case ZEND_ASSIGN_BW_AND: + case ZEND_ASSIGN_BW_XOR: + case ZEND_ASSIGN_POW: + msg = "Cannot use assign-op operators with string offsets"; + break; + case ZEND_FETCH_DIM_W: + case ZEND_FETCH_DIM_RW: + case ZEND_FETCH_DIM_FUNC_ARG: + case ZEND_FETCH_DIM_UNSET: + /* TODO: Encode the "reason" into opline->extended_value??? */ + var = opline->result.var; + opline++; + end = EG(current_execute_data)->func->op_array.opcodes + + EG(current_execute_data)->func->op_array.last; + while (opline < end) { + if (opline->op1_type == IS_VAR && opline->op1.var == var) { + switch (opline->opcode) { + case ZEND_ASSIGN_ADD: + case ZEND_ASSIGN_SUB: + case ZEND_ASSIGN_MUL: + case ZEND_ASSIGN_DIV: + case ZEND_ASSIGN_MOD: + case ZEND_ASSIGN_SL: + case ZEND_ASSIGN_SR: + case ZEND_ASSIGN_CONCAT: + case ZEND_ASSIGN_BW_OR: + case ZEND_ASSIGN_BW_AND: + case ZEND_ASSIGN_BW_XOR: + case ZEND_ASSIGN_POW: + if (opline->extended_value == ZEND_ASSIGN_OBJ) { + msg = "Cannot use string offset as an object"; + } else if (opline->extended_value == ZEND_ASSIGN_DIM) { + msg = "Cannot use string offset as an array"; + } else { + msg = "Cannot use assign-op operators with string offsets"; + } + break; + case ZEND_PRE_INC_OBJ: + case ZEND_PRE_DEC_OBJ: + case ZEND_POST_INC_OBJ: + case ZEND_POST_DEC_OBJ: + case ZEND_PRE_INC: + case ZEND_PRE_DEC: + case ZEND_POST_INC: + case ZEND_POST_DEC: + msg = "Cannot increment/decrement string offsets"; + break; + case ZEND_FETCH_DIM_W: + case ZEND_FETCH_DIM_RW: + case ZEND_FETCH_DIM_FUNC_ARG: + case ZEND_FETCH_DIM_UNSET: + case ZEND_ASSIGN_DIM: + msg = "Cannot use string offset as an array"; + break; + case ZEND_FETCH_OBJ_W: + case ZEND_FETCH_OBJ_RW: + case ZEND_FETCH_OBJ_FUNC_ARG: + case ZEND_FETCH_OBJ_UNSET: + case ZEND_ASSIGN_OBJ: + msg = "Cannot use string offset as an object"; + break; + case ZEND_ASSIGN_REF: + case ZEND_ADD_ARRAY_ELEMENT: + case ZEND_INIT_ARRAY: + msg = "Cannot create references to/from string offsets"; + break; + case ZEND_RETURN_BY_REF: + msg = "Cannot return string offsets by reference"; + break; + case ZEND_UNSET_DIM: + case ZEND_UNSET_OBJ: + msg = "Cannot unset string offsets"; + break; + case ZEND_YIELD: + msg = "Cannot yield string offsets by reference"; + break; + case ZEND_SEND_REF: + case ZEND_SEND_VAR_EX: + msg = "Only variables can be passed by reference"; + break; + EMPTY_SWITCH_DEFAULT_CASE(); + } + break; + } + if (opline->op2_type == IS_VAR && opline->op2.var == var) { + ZEND_ASSERT(opline->opcode == ZEND_ASSIGN_REF); + msg = "Cannot create references to/from string offsets"; + break; + } + } + break; + EMPTY_SWITCH_DEFAULT_CASE(); + } + ZEND_ASSERT(msg != NULL); + zend_throw_error(NULL, msg); +} + static zend_always_inline zend_long zend_fetch_string_offset(zval *container, zval *dim, int type) { zend_long offset = zend_check_string_offset(dim, type); @@ -1754,11 +1868,11 @@ convert_to_array: if (dim == NULL) { zend_throw_error(NULL, "[] operator not supported for strings"); - ZVAL_INDIRECT(result, &EG(error_zval)); } else { zend_check_string_offset(dim, type); - ZVAL_INDIRECT(result, NULL); /* wrong string offset */ + zend_wrong_string_offset(); } + ZVAL_INDIRECT(result, &EG(error_zval)); } else if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) { if (!Z_OBJ_HT_P(container)->read_dimension) { zend_throw_error(NULL, "Cannot use object as array"); diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index cc03508fbc..3f96086b97 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -720,13 +720,6 @@ ZEND_VM_HELPER(zend_binary_assign_op_obj_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, property = GET_OP2_ZVAL_PTR(BP_VAR_R); - if (OP1_TYPE == IS_VAR && UNEXPECTED(object == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an object"); - FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); - FREE_OP2(); - HANDLE_EXCEPTION(); - } - do { value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); @@ -779,12 +772,6 @@ ZEND_VM_HELPER(zend_binary_assign_op_dim_helper, VAR|UNUSED|CV, CONST|TMPVAR|UNU FREE_UNFETCHED_OP2(); HANDLE_EXCEPTION(); } - if (OP1_TYPE == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an array"); - FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); - FREE_UNFETCHED_OP2(); - HANDLE_EXCEPTION(); - } dim = GET_OP2_ZVAL_PTR(BP_VAR_R); @@ -805,14 +792,6 @@ ZEND_VM_HELPER(zend_binary_assign_op_dim_helper, VAR|UNUSED|CV, CONST|TMPVAR|UNU ZEND_ASSERT(Z_TYPE(rv) == IS_INDIRECT); var_ptr = Z_INDIRECT(rv); - if (UNEXPECTED(var_ptr == NULL)) { - zend_throw_error(NULL, "Cannot use assign-op operators with string offsets"); - FREE_OP2(); - FREE_OP(free_op_data1); - FREE_OP1_VAR_PTR(); - HANDLE_EXCEPTION(); - } - if (UNEXPECTED(var_ptr == &EG(error_zval))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -846,12 +825,6 @@ ZEND_VM_HELPER(zend_binary_assign_op_helper, VAR|CV, CONST|TMPVAR|CV, binary_op_ value = GET_OP2_ZVAL_PTR(BP_VAR_R); var_ptr = GET_OP1_ZVAL_PTR_PTR(BP_VAR_RW); - if (OP1_TYPE == IS_VAR && UNEXPECTED(var_ptr == NULL)) { - zend_throw_error(NULL, "Cannot use assign-op operators with string offsets"); - FREE_OP2(); - HANDLE_EXCEPTION(); - } - if (OP1_TYPE == IS_VAR && UNEXPECTED(var_ptr == &EG(error_zval))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -1131,12 +1104,6 @@ ZEND_VM_HELPER(zend_pre_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, property = GET_OP2_ZVAL_PTR(BP_VAR_R); - if (OP1_TYPE == IS_VAR && UNEXPECTED(object == NULL)) { - zend_throw_error(NULL, "Cannot increment/decrement string offsets"); - FREE_OP2(); - HANDLE_EXCEPTION(); - } - do { if (OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { ZVAL_DEREF(object); @@ -1212,12 +1179,6 @@ ZEND_VM_HELPER(zend_post_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, property = GET_OP2_ZVAL_PTR(BP_VAR_R); - if (OP1_TYPE == IS_VAR && UNEXPECTED(object == NULL)) { - zend_throw_error(NULL, "Cannot increment/decrement string offsets"); - FREE_OP2(); - HANDLE_EXCEPTION(); - } - do { if (OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { ZVAL_DEREF(object); @@ -1278,12 +1239,6 @@ ZEND_VM_HANDLER(34, ZEND_PRE_INC, VAR|CV, ANY) var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW); - if (OP1_TYPE == IS_VAR && UNEXPECTED(var_ptr == NULL)) { - SAVE_OPLINE(); - zend_throw_error(NULL, "Cannot increment/decrement string offsets"); - HANDLE_EXCEPTION(); - } - if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) { fast_long_increment_function(var_ptr); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -1324,12 +1279,6 @@ ZEND_VM_HANDLER(35, ZEND_PRE_DEC, VAR|CV, ANY) var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW); - if (OP1_TYPE == IS_VAR && UNEXPECTED(var_ptr == NULL)) { - SAVE_OPLINE(); - zend_throw_error(NULL, "Cannot increment/decrement string offsets"); - HANDLE_EXCEPTION(); - } - if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) { fast_long_decrement_function(var_ptr); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -1370,12 +1319,6 @@ ZEND_VM_HANDLER(36, ZEND_POST_INC, VAR|CV, ANY) var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW); - if (OP1_TYPE == IS_VAR && UNEXPECTED(var_ptr == NULL)) { - SAVE_OPLINE(); - zend_throw_error(NULL, "Cannot increment/decrement string offsets"); - HANDLE_EXCEPTION(); - } - if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) { ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr); fast_long_increment_function(var_ptr); @@ -1409,12 +1352,6 @@ ZEND_VM_HANDLER(37, ZEND_POST_DEC, VAR|CV, ANY) var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW); - if (OP1_TYPE == IS_VAR && UNEXPECTED(var_ptr == NULL)) { - SAVE_OPLINE(); - zend_throw_error(NULL, "Cannot increment/decrement string offsets"); - HANDLE_EXCEPTION(); - } - if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) { ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr); fast_long_decrement_function(var_ptr); @@ -1764,10 +1701,6 @@ ZEND_VM_HANDLER(84, ZEND_FETCH_DIM_W, VAR|CV, CONST|TMPVAR|UNUSED|NEXT|CV) SAVE_OPLINE(); container = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_W); - if (OP1_TYPE == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an array"); - HANDLE_EXCEPTION(); - } zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, GET_OP2_ZVAL_PTR(BP_VAR_R), OP2_TYPE); FREE_OP2(); if (OP1_TYPE == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -1786,10 +1719,6 @@ ZEND_VM_HANDLER(87, ZEND_FETCH_DIM_RW, VAR|CV, CONST|TMPVAR|UNUSED|NEXT|CV) SAVE_OPLINE(); container = GET_OP1_ZVAL_PTR_PTR(BP_VAR_RW); - if (OP1_TYPE == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an array"); - HANDLE_EXCEPTION(); - } zend_fetch_dimension_address_RW(EX_VAR(opline->result.var), container, GET_OP2_ZVAL_PTR(BP_VAR_R), OP2_TYPE); FREE_OP2(); if (OP1_TYPE == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -1829,11 +1758,6 @@ ZEND_VM_HANDLER(93, ZEND_FETCH_DIM_FUNC_ARG, CONST|TMP|VAR|CV, CONST|TMPVAR|UNUS HANDLE_EXCEPTION(); } container = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_W); - if (OP1_TYPE == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an array"); - FREE_UNFETCHED_OP2(); - HANDLE_EXCEPTION(); - } zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, GET_OP2_ZVAL_PTR(BP_VAR_R), OP2_TYPE); if (OP1_TYPE == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 1); @@ -1864,11 +1788,6 @@ ZEND_VM_HANDLER(96, ZEND_FETCH_DIM_UNSET, VAR|CV, CONST|TMPVAR|CV) SAVE_OPLINE(); container = GET_OP1_ZVAL_PTR_PTR(BP_VAR_UNSET); - if (OP1_TYPE == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an array"); - FREE_UNFETCHED_OP2(); - HANDLE_EXCEPTION(); - } zend_fetch_dimension_address_UNSET(EX_VAR(opline->result.var), container, GET_OP2_ZVAL_PTR(BP_VAR_R), OP2_TYPE); FREE_OP2(); if (OP1_TYPE == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -1967,11 +1886,6 @@ ZEND_VM_HANDLER(85, ZEND_FETCH_OBJ_W, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV) FREE_OP2(); HANDLE_EXCEPTION(); } - if (OP1_TYPE == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an object"); - FREE_OP2(); - HANDLE_EXCEPTION(); - } zend_fetch_property_address(EX_VAR(opline->result.var), container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); FREE_OP2(); @@ -1998,11 +1912,6 @@ ZEND_VM_HANDLER(88, ZEND_FETCH_OBJ_RW, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV) FREE_OP2(); HANDLE_EXCEPTION(); } - if (OP1_TYPE == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an object"); - FREE_OP2(); - HANDLE_EXCEPTION(); - } zend_fetch_property_address(EX_VAR(opline->result.var), container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); FREE_OP2(); if (OP1_TYPE == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -2110,11 +2019,6 @@ ZEND_VM_HANDLER(94, ZEND_FETCH_OBJ_FUNC_ARG, CONST|TMP|VAR|UNUSED|THIS|CV, CONST FREE_OP1_VAR_PTR(); HANDLE_EXCEPTION(); } - if (OP1_TYPE == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an object"); - FREE_OP2(); - HANDLE_EXCEPTION(); - } zend_fetch_property_address(EX_VAR(opline->result.var), container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); FREE_OP2(); if (OP1_TYPE == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -2144,11 +2048,6 @@ ZEND_VM_HANDLER(97, ZEND_FETCH_OBJ_UNSET, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV) property = GET_OP2_ZVAL_PTR(BP_VAR_R); - if (OP1_TYPE == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an object"); - FREE_OP2(); - HANDLE_EXCEPTION(); - } zend_fetch_property_address(EX_VAR(opline->result.var), container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET); FREE_OP2(); if (OP1_TYPE == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -2220,11 +2119,6 @@ ZEND_VM_HANDLER(136, ZEND_ASSIGN_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV) property_name = GET_OP2_ZVAL_PTR(BP_VAR_R); - if (OP1_TYPE == IS_VAR && UNEXPECTED(object == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an object"); - FREE_OP2(); - HANDLE_EXCEPTION(); - } zend_assign_to_object(UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL, object, OP1_TYPE, property_name, OP2_TYPE, (opline+1)->op1_type, (opline+1)->op1, execute_data, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); FREE_OP2(); FREE_OP1_VAR_PTR(); @@ -2245,13 +2139,6 @@ ZEND_VM_HANDLER(147, ZEND_ASSIGN_DIM, VAR|CV, CONST|TMPVAR|UNUSED|NEXT|CV) SAVE_OPLINE(); object_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_W); - if (OP1_TYPE == IS_VAR && UNEXPECTED(object_ptr == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an array"); - FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); - FREE_UNFETCHED_OP2(); - HANDLE_EXCEPTION(); - } - if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { ZEND_VM_C_LABEL(try_assign_dim_array): if (OP2_TYPE == IS_UNUSED) { @@ -2376,11 +2263,6 @@ ZEND_VM_HANDLER(39, ZEND_ASSIGN_REF, VAR|CV, VAR|CV, SRC) SAVE_OPLINE(); value_ptr = GET_OP2_ZVAL_PTR_PTR(BP_VAR_W); - if (OP2_TYPE == IS_VAR && UNEXPECTED(value_ptr == NULL)) { - zend_throw_error(NULL, "Cannot create references to/from string offsets"); - FREE_UNFETCHED_OP1(); - HANDLE_EXCEPTION(); - } if (OP1_TYPE == IS_VAR && UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT) && UNEXPECTED(!Z_ISREF_P(EX_VAR(opline->op1.var)))) { @@ -2404,11 +2286,6 @@ ZEND_VM_HANDLER(39, ZEND_ASSIGN_REF, VAR|CV, VAR|CV, SRC) } variable_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_W); - if (OP1_TYPE == IS_VAR && UNEXPECTED(variable_ptr == NULL)) { - zend_throw_error(NULL, "Cannot create references to/from string offsets"); - FREE_OP2_VAR_PTR(); - HANDLE_EXCEPTION(); - } if ((OP1_TYPE == IS_VAR && UNEXPECTED(variable_ptr == &EG(error_zval))) || (OP2_TYPE == IS_VAR && UNEXPECTED(value_ptr == &EG(error_zval)))) { variable_ptr = &EG(uninitialized_zval); @@ -4103,11 +3980,6 @@ ZEND_VM_HANDLER(111, ZEND_RETURN_BY_REF, CONST|TMP|VAR|CV, ANY, SRC) retval_ptr = GET_OP1_ZVAL_PTR_PTR(BP_VAR_W); - if (OP1_TYPE == IS_VAR && UNEXPECTED(retval_ptr == NULL)) { - zend_throw_error(NULL, "Cannot return string offsets by reference"); - HANDLE_EXCEPTION(); - } - if (OP1_TYPE == IS_VAR) { if (retval_ptr == &EG(uninitialized_zval) || (opline->extended_value == ZEND_RETURNS_FUNCTION && @@ -4402,13 +4274,6 @@ ZEND_VM_HANDLER(67, ZEND_SEND_REF, VAR|CV, NUM) SAVE_OPLINE(); varptr = GET_OP1_ZVAL_PTR_PTR(BP_VAR_W); - if (OP1_TYPE == IS_VAR && UNEXPECTED(varptr == NULL)) { - zend_throw_error(NULL, "Only variables can be passed by reference"); - arg = ZEND_CALL_VAR(EX(call), opline->result.var); - ZVAL_UNDEF(arg); - HANDLE_EXCEPTION(); - } - arg = ZEND_CALL_VAR(EX(call), opline->result.var); if (OP1_TYPE == IS_VAR && UNEXPECTED(varptr == &EG(error_zval))) { ZVAL_NEW_REF(arg, &EG(uninitialized_zval)); @@ -5255,11 +5120,6 @@ ZEND_VM_HANDLER(72, ZEND_ADD_ARRAY_ELEMENT, CONST|TMP|VAR|CV, CONST|TMPVAR|UNUSE if ((OP1_TYPE == IS_VAR || OP1_TYPE == IS_CV) && UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) { expr_ptr = GET_OP1_ZVAL_PTR_PTR(BP_VAR_W); - if (OP1_TYPE == IS_VAR && UNEXPECTED(expr_ptr == NULL)) { - zend_throw_error(NULL, "Cannot create references to/from string offsets"); - zend_array_destroy(Z_ARRVAL_P(EX_VAR(opline->result.var))); - HANDLE_EXCEPTION(); - } ZVAL_MAKE_REF(expr_ptr); Z_ADDREF_P(expr_ptr); FREE_OP1_VAR_PTR(); @@ -5735,11 +5595,6 @@ ZEND_VM_HANDLER(75, ZEND_UNSET_DIM, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV) FREE_UNFETCHED_OP2(); HANDLE_EXCEPTION(); } - if (OP1_TYPE == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot unset string offsets"); - FREE_UNFETCHED_OP2(); - HANDLE_EXCEPTION(); - } offset = GET_OP2_ZVAL_PTR_UNDEF(BP_VAR_R); do { @@ -5832,11 +5687,6 @@ ZEND_VM_HANDLER(76, ZEND_UNSET_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV) FREE_UNFETCHED_OP2(); HANDLE_EXCEPTION(); } - if (OP1_TYPE == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot unset string offsets"); - FREE_UNFETCHED_OP2(); - HANDLE_EXCEPTION(); - } offset = GET_OP2_ZVAL_PTR(BP_VAR_R); do { @@ -7509,12 +7359,6 @@ ZEND_VM_HANDLER(160, ZEND_YIELD, CONST|TMP|VAR|CV|UNUSED, CONST|TMP|VAR|CV|UNUSE } else { zval *value_ptr = GET_OP1_ZVAL_PTR_PTR(BP_VAR_W); - if (OP1_TYPE == IS_VAR && UNEXPECTED(value_ptr == NULL)) { - zend_throw_error(NULL, "Cannot yield string offsets by reference"); - FREE_UNFETCHED_OP2(); - HANDLE_EXCEPTION(); - } - /* If a function call result is yielded and the function did * not return by reference we throw a notice. */ if (OP1_TYPE == IS_VAR && diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index a1a7834766..04d789592a 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -3156,11 +3156,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_BY_REF_SPEC_CONST_HANDL retval_ptr = NULL; - if (IS_CONST == IS_VAR && UNEXPECTED(retval_ptr == NULL)) { - zend_throw_error(NULL, "Cannot return string offsets by reference"); - HANDLE_EXCEPTION(); - } - if (IS_CONST == IS_VAR) { if (retval_ptr == &EG(uninitialized_zval) || (opline->extended_value == ZEND_RETURNS_FUNCTION && @@ -5116,11 +5111,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_ HANDLE_EXCEPTION(); } container = NULL; - if (IS_CONST == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an array"); - - HANDLE_EXCEPTION(); - } zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, EX_CONSTANT(opline->op2), IS_CONST); if (IS_CONST == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 1); @@ -5309,11 +5299,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_ zend_throw_error(NULL, "Cannot use temporary expression in write context"); - HANDLE_EXCEPTION(); - } - if (IS_CONST == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an object"); - HANDLE_EXCEPTION(); } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CONST, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); @@ -5915,11 +5900,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_C if ((IS_CONST == IS_VAR || IS_CONST == IS_CV) && UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) { expr_ptr = NULL; - if (IS_CONST == IS_VAR && UNEXPECTED(expr_ptr == NULL)) { - zend_throw_error(NULL, "Cannot create references to/from string offsets"); - zend_array_destroy(Z_ARRVAL_P(EX_VAR(opline->result.var))); - HANDLE_EXCEPTION(); - } ZVAL_MAKE_REF(expr_ptr); Z_ADDREF_P(expr_ptr); @@ -6437,12 +6417,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_CONST_HANDLER } else { zval *value_ptr = NULL; - if (IS_CONST == IS_VAR && UNEXPECTED(value_ptr == NULL)) { - zend_throw_error(NULL, "Cannot yield string offsets by reference"); - - HANDLE_EXCEPTION(); - } - /* If a function call result is yielded and the function did * not return by reference we throw a notice. */ if (IS_CONST == IS_VAR && @@ -6614,12 +6588,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_TMP_HANDLER(Z } else { zval *value_ptr = NULL; - if (IS_CONST == IS_VAR && UNEXPECTED(value_ptr == NULL)) { - zend_throw_error(NULL, "Cannot yield string offsets by reference"); - zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); - HANDLE_EXCEPTION(); - } - /* If a function call result is yielded and the function did * not return by reference we throw a notice. */ if (IS_CONST == IS_VAR && @@ -7071,12 +7039,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_VAR_HANDLER(Z } else { zval *value_ptr = NULL; - if (IS_CONST == IS_VAR && UNEXPECTED(value_ptr == NULL)) { - zend_throw_error(NULL, "Cannot yield string offsets by reference"); - zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); - HANDLE_EXCEPTION(); - } - /* If a function call result is yielded and the function did * not return by reference we throw a notice. */ if (IS_CONST == IS_VAR && @@ -7455,11 +7417,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_ HANDLE_EXCEPTION(); } container = NULL; - if (IS_CONST == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an array"); - - HANDLE_EXCEPTION(); - } zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, NULL, IS_UNUSED); if (IS_CONST == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 1); @@ -7687,11 +7644,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_U if ((IS_CONST == IS_VAR || IS_CONST == IS_CV) && UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) { expr_ptr = NULL; - if (IS_CONST == IS_VAR && UNEXPECTED(expr_ptr == NULL)) { - zend_throw_error(NULL, "Cannot create references to/from string offsets"); - zend_array_destroy(Z_ARRVAL_P(EX_VAR(opline->result.var))); - HANDLE_EXCEPTION(); - } ZVAL_MAKE_REF(expr_ptr); Z_ADDREF_P(expr_ptr); @@ -8124,12 +8076,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_UNUSED_HANDLE } else { zval *value_ptr = NULL; - if (IS_CONST == IS_VAR && UNEXPECTED(value_ptr == NULL)) { - zend_throw_error(NULL, "Cannot yield string offsets by reference"); - - HANDLE_EXCEPTION(); - } - /* If a function call result is yielded and the function did * not return by reference we throw a notice. */ if (IS_CONST == IS_VAR && @@ -8904,11 +8850,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_ HANDLE_EXCEPTION(); } container = NULL; - if (IS_CONST == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an array"); - - HANDLE_EXCEPTION(); - } zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var), IS_CV); if (IS_CONST == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 1); @@ -9097,11 +9038,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_ zend_throw_error(NULL, "Cannot use temporary expression in write context"); - HANDLE_EXCEPTION(); - } - if (IS_CONST == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an object"); - HANDLE_EXCEPTION(); } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CONST, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); @@ -9627,11 +9563,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_C if ((IS_CONST == IS_VAR || IS_CONST == IS_CV) && UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) { expr_ptr = NULL; - if (IS_CONST == IS_VAR && UNEXPECTED(expr_ptr == NULL)) { - zend_throw_error(NULL, "Cannot create references to/from string offsets"); - zend_array_destroy(Z_ARRVAL_P(EX_VAR(opline->result.var))); - HANDLE_EXCEPTION(); - } ZVAL_MAKE_REF(expr_ptr); Z_ADDREF_P(expr_ptr); @@ -9972,12 +9903,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_CV_HANDLER(ZE } else { zval *value_ptr = NULL; - if (IS_CONST == IS_VAR && UNEXPECTED(value_ptr == NULL)) { - zend_throw_error(NULL, "Cannot yield string offsets by reference"); - - HANDLE_EXCEPTION(); - } - /* If a function call result is yielded and the function did * not return by reference we throw a notice. */ if (IS_CONST == IS_VAR && @@ -10716,11 +10641,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_ HANDLE_EXCEPTION(); } container = NULL; - if (IS_CONST == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an array"); - zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); - HANDLE_EXCEPTION(); - } zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2), (IS_TMP_VAR|IS_VAR)); if (IS_CONST == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 1); @@ -10913,11 +10833,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_ HANDLE_EXCEPTION(); } - if (IS_CONST == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an object"); - zval_ptr_dtor_nogc(free_op2); - HANDLE_EXCEPTION(); - } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CONST, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); zval_ptr_dtor_nogc(free_op2); if (IS_CONST == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -11393,11 +11308,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_T if ((IS_CONST == IS_VAR || IS_CONST == IS_CV) && UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) { expr_ptr = NULL; - if (IS_CONST == IS_VAR && UNEXPECTED(expr_ptr == NULL)) { - zend_throw_error(NULL, "Cannot create references to/from string offsets"); - zend_array_destroy(Z_ARRVAL_P(EX_VAR(opline->result.var))); - HANDLE_EXCEPTION(); - } ZVAL_MAKE_REF(expr_ptr); Z_ADDREF_P(expr_ptr); @@ -11778,11 +11688,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_BY_REF_SPEC_TMP_HANDLER retval_ptr = NULL; - if (IS_TMP_VAR == IS_VAR && UNEXPECTED(retval_ptr == NULL)) { - zend_throw_error(NULL, "Cannot return string offsets by reference"); - HANDLE_EXCEPTION(); - } - if (IS_TMP_VAR == IS_VAR) { if (retval_ptr == &EG(uninitialized_zval) || (opline->extended_value == ZEND_RETURNS_FUNCTION && @@ -12607,11 +12512,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_CO HANDLE_EXCEPTION(); } container = NULL; - if (IS_TMP_VAR == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an array"); - - HANDLE_EXCEPTION(); - } zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, EX_CONSTANT(opline->op2), IS_CONST); if (IS_TMP_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 1); @@ -12728,11 +12628,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_CO zend_throw_error(NULL, "Cannot use temporary expression in write context"); - HANDLE_EXCEPTION(); - } - if (IS_TMP_VAR == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an object"); - HANDLE_EXCEPTION(); } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_TMP_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); @@ -12843,11 +12738,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_CON if ((IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) && UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) { expr_ptr = NULL; - if (IS_TMP_VAR == IS_VAR && UNEXPECTED(expr_ptr == NULL)) { - zend_throw_error(NULL, "Cannot create references to/from string offsets"); - zend_array_destroy(Z_ARRVAL_P(EX_VAR(opline->result.var))); - HANDLE_EXCEPTION(); - } ZVAL_MAKE_REF(expr_ptr); Z_ADDREF_P(expr_ptr); @@ -13005,12 +12895,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_CONST_HANDLER(Z } else { zval *value_ptr = NULL; - if (IS_TMP_VAR == IS_VAR && UNEXPECTED(value_ptr == NULL)) { - zend_throw_error(NULL, "Cannot yield string offsets by reference"); - - HANDLE_EXCEPTION(); - } - /* If a function call result is yielded and the function did * not return by reference we throw a notice. */ if (IS_TMP_VAR == IS_VAR && @@ -13182,12 +13066,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_TMP_HANDLER(ZEN } else { zval *value_ptr = NULL; - if (IS_TMP_VAR == IS_VAR && UNEXPECTED(value_ptr == NULL)) { - zend_throw_error(NULL, "Cannot yield string offsets by reference"); - zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); - HANDLE_EXCEPTION(); - } - /* If a function call result is yielded and the function did * not return by reference we throw a notice. */ if (IS_TMP_VAR == IS_VAR && @@ -13359,12 +13237,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_VAR_HANDLER(ZEN } else { zval *value_ptr = NULL; - if (IS_TMP_VAR == IS_VAR && UNEXPECTED(value_ptr == NULL)) { - zend_throw_error(NULL, "Cannot yield string offsets by reference"); - zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); - HANDLE_EXCEPTION(); - } - /* If a function call result is yielded and the function did * not return by reference we throw a notice. */ if (IS_TMP_VAR == IS_VAR && @@ -13474,11 +13346,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_UN HANDLE_EXCEPTION(); } container = NULL; - if (IS_TMP_VAR == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an array"); - - HANDLE_EXCEPTION(); - } zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, NULL, IS_UNUSED); if (IS_TMP_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 1); @@ -13565,11 +13432,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_UNU if ((IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) && UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) { expr_ptr = NULL; - if (IS_TMP_VAR == IS_VAR && UNEXPECTED(expr_ptr == NULL)) { - zend_throw_error(NULL, "Cannot create references to/from string offsets"); - zend_array_destroy(Z_ARRVAL_P(EX_VAR(opline->result.var))); - HANDLE_EXCEPTION(); - } ZVAL_MAKE_REF(expr_ptr); Z_ADDREF_P(expr_ptr); @@ -13727,12 +13589,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_UNUSED_HANDLER( } else { zval *value_ptr = NULL; - if (IS_TMP_VAR == IS_VAR && UNEXPECTED(value_ptr == NULL)) { - zend_throw_error(NULL, "Cannot yield string offsets by reference"); - - HANDLE_EXCEPTION(); - } - /* If a function call result is yielded and the function did * not return by reference we throw a notice. */ if (IS_TMP_VAR == IS_VAR && @@ -13878,11 +13734,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_CV HANDLE_EXCEPTION(); } container = NULL; - if (IS_TMP_VAR == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an array"); - - HANDLE_EXCEPTION(); - } zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var), IS_CV); if (IS_TMP_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 1); @@ -13999,11 +13850,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_CV zend_throw_error(NULL, "Cannot use temporary expression in write context"); - HANDLE_EXCEPTION(); - } - if (IS_TMP_VAR == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an object"); - HANDLE_EXCEPTION(); } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_TMP_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); @@ -14114,11 +13960,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_CV_ if ((IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) && UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) { expr_ptr = NULL; - if (IS_TMP_VAR == IS_VAR && UNEXPECTED(expr_ptr == NULL)) { - zend_throw_error(NULL, "Cannot create references to/from string offsets"); - zend_array_destroy(Z_ARRVAL_P(EX_VAR(opline->result.var))); - HANDLE_EXCEPTION(); - } ZVAL_MAKE_REF(expr_ptr); Z_ADDREF_P(expr_ptr); @@ -14276,12 +14117,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_CV_HANDLER(ZEND } else { zval *value_ptr = NULL; - if (IS_TMP_VAR == IS_VAR && UNEXPECTED(value_ptr == NULL)) { - zend_throw_error(NULL, "Cannot yield string offsets by reference"); - - HANDLE_EXCEPTION(); - } - /* If a function call result is yielded and the function did * not return by reference we throw a notice. */ if (IS_TMP_VAR == IS_VAR && @@ -14391,11 +14226,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_TM HANDLE_EXCEPTION(); } container = NULL; - if (IS_TMP_VAR == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an array"); - zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); - HANDLE_EXCEPTION(); - } zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2), (IS_TMP_VAR|IS_VAR)); if (IS_TMP_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 1); @@ -14515,11 +14345,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_TMP_TM HANDLE_EXCEPTION(); } - if (IS_TMP_VAR == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an object"); - zval_ptr_dtor_nogc(free_op2); - HANDLE_EXCEPTION(); - } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_TMP_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); zval_ptr_dtor_nogc(free_op2); if (IS_TMP_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -14628,11 +14453,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_TMP if ((IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) && UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) { expr_ptr = NULL; - if (IS_TMP_VAR == IS_VAR && UNEXPECTED(expr_ptr == NULL)) { - zend_throw_error(NULL, "Cannot create references to/from string offsets"); - zend_array_destroy(Z_ARRVAL_P(EX_VAR(opline->result.var))); - HANDLE_EXCEPTION(); - } ZVAL_MAKE_REF(expr_ptr); Z_ADDREF_P(expr_ptr); @@ -14756,12 +14576,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_VAR_HANDLER(ZEND_ var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); - if (IS_VAR == IS_VAR && UNEXPECTED(var_ptr == NULL)) { - SAVE_OPLINE(); - zend_throw_error(NULL, "Cannot increment/decrement string offsets"); - HANDLE_EXCEPTION(); - } - if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) { fast_long_increment_function(var_ptr); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -14802,12 +14616,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_VAR_HANDLER(ZEND_ var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); - if (IS_VAR == IS_VAR && UNEXPECTED(var_ptr == NULL)) { - SAVE_OPLINE(); - zend_throw_error(NULL, "Cannot increment/decrement string offsets"); - HANDLE_EXCEPTION(); - } - if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) { fast_long_decrement_function(var_ptr); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -14848,12 +14656,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_VAR_HANDLER(ZEND var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); - if (IS_VAR == IS_VAR && UNEXPECTED(var_ptr == NULL)) { - SAVE_OPLINE(); - zend_throw_error(NULL, "Cannot increment/decrement string offsets"); - HANDLE_EXCEPTION(); - } - if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) { ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr); fast_long_increment_function(var_ptr); @@ -14887,12 +14689,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_SPEC_VAR_HANDLER(ZEND var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); - if (IS_VAR == IS_VAR && UNEXPECTED(var_ptr == NULL)) { - SAVE_OPLINE(); - zend_throw_error(NULL, "Cannot increment/decrement string offsets"); - HANDLE_EXCEPTION(); - } - if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) { ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr); fast_long_decrement_function(var_ptr); @@ -14999,11 +14795,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_BY_REF_SPEC_VAR_HANDLER retval_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); - if (IS_VAR == IS_VAR && UNEXPECTED(retval_ptr == NULL)) { - zend_throw_error(NULL, "Cannot return string offsets by reference"); - HANDLE_EXCEPTION(); - } - if (IS_VAR == IS_VAR) { if (retval_ptr == &EG(uninitialized_zval) || (opline->extended_value == ZEND_RETURNS_FUNCTION && @@ -15200,13 +14991,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_REF_SPEC_VAR_HANDLER(ZEND SAVE_OPLINE(); varptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); - if (IS_VAR == IS_VAR && UNEXPECTED(varptr == NULL)) { - zend_throw_error(NULL, "Only variables can be passed by reference"); - arg = ZEND_CALL_VAR(EX(call), opline->result.var); - ZVAL_UNDEF(arg); - HANDLE_EXCEPTION(); - } - arg = ZEND_CALL_VAR(EX(call), opline->result.var); if (IS_VAR == IS_VAR && UNEXPECTED(varptr == &EG(error_zval))) { ZVAL_NEW_REF(arg, &EG(uninitialized_zval)); @@ -16426,13 +16210,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP property = EX_CONSTANT(opline->op2); - if (IS_VAR == IS_VAR && UNEXPECTED(object == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an object"); - FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); - - HANDLE_EXCEPTION(); - } - do { value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); @@ -16485,12 +16262,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP HANDLE_EXCEPTION(); } - if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an array"); - FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); - - HANDLE_EXCEPTION(); - } dim = EX_CONSTANT(opline->op2); @@ -16511,14 +16282,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP ZEND_ASSERT(Z_TYPE(rv) == IS_INDIRECT); var_ptr = Z_INDIRECT(rv); - if (UNEXPECTED(var_ptr == NULL)) { - zend_throw_error(NULL, "Cannot use assign-op operators with string offsets"); - - FREE_OP(free_op_data1); - if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - HANDLE_EXCEPTION(); - } - if (UNEXPECTED(var_ptr == &EG(error_zval))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -16551,12 +16314,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_V value = EX_CONSTANT(opline->op2); var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); - if (IS_VAR == IS_VAR && UNEXPECTED(var_ptr == NULL)) { - zend_throw_error(NULL, "Cannot use assign-op operators with string offsets"); - - HANDLE_EXCEPTION(); - } - if (IS_VAR == IS_VAR && UNEXPECTED(var_ptr == &EG(error_zval))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -16835,12 +16592,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE property = EX_CONSTANT(opline->op2); - if (IS_VAR == IS_VAR && UNEXPECTED(object == NULL)) { - zend_throw_error(NULL, "Cannot increment/decrement string offsets"); - - HANDLE_EXCEPTION(); - } - do { if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { ZVAL_DEREF(object); @@ -16915,12 +16666,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP property = EX_CONSTANT(opline->op2); - if (IS_VAR == IS_VAR && UNEXPECTED(object == NULL)) { - zend_throw_error(NULL, "Cannot increment/decrement string offsets"); - - HANDLE_EXCEPTION(); - } - do { if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { ZVAL_DEREF(object); @@ -16981,10 +16726,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_VAR_CONST_HAN SAVE_OPLINE(); container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); - if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an array"); - HANDLE_EXCEPTION(); - } zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, EX_CONSTANT(opline->op2), IS_CONST); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -17003,10 +16744,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_RW_SPEC_VAR_CONST_HA SAVE_OPLINE(); container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); - if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an array"); - HANDLE_EXCEPTION(); - } zend_fetch_dimension_address_RW(EX_VAR(opline->result.var), container, EX_CONSTANT(opline->op2), IS_CONST); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -17032,11 +16769,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_CO HANDLE_EXCEPTION(); } container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); - if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an array"); - - HANDLE_EXCEPTION(); - } zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, EX_CONSTANT(opline->op2), IS_CONST); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 1); @@ -17067,11 +16799,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_UNSET_SPEC_VAR_CONST SAVE_OPLINE(); container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); - if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an array"); - - HANDLE_EXCEPTION(); - } zend_fetch_dimension_address_UNSET(EX_VAR(opline->result.var), container, EX_CONSTANT(opline->op2), IS_CONST); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -17169,11 +16896,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CONST_HAN HANDLE_EXCEPTION(); } - if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an object"); - - HANDLE_EXCEPTION(); - } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); @@ -17200,11 +16922,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_CONST_HA HANDLE_EXCEPTION(); } - if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an object"); - - HANDLE_EXCEPTION(); - } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -17239,11 +16956,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CO if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; HANDLE_EXCEPTION(); } - if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an object"); - - HANDLE_EXCEPTION(); - } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -17273,11 +16985,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CONST property = EX_CONSTANT(opline->op2); - if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an object"); - - HANDLE_EXCEPTION(); - } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -17305,11 +17012,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_HAND property_name = EX_CONSTANT(opline->op2); - if (IS_VAR == IS_VAR && UNEXPECTED(object == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an object"); - - HANDLE_EXCEPTION(); - } zend_assign_to_object(UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL, object, IS_VAR, property_name, IS_CONST, (opline+1)->op1_type, (opline+1)->op1, execute_data, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -17330,13 +17032,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_HAND SAVE_OPLINE(); object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); - if (IS_VAR == IS_VAR && UNEXPECTED(object_ptr == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an array"); - FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); - - HANDLE_EXCEPTION(); - } - if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: if (IS_CONST == IS_UNUSED) { @@ -17684,11 +17379,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CON if ((IS_VAR == IS_VAR || IS_VAR == IS_CV) && UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) { expr_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); - if (IS_VAR == IS_VAR && UNEXPECTED(expr_ptr == NULL)) { - zend_throw_error(NULL, "Cannot create references to/from string offsets"); - zend_array_destroy(Z_ARRVAL_P(EX_VAR(opline->result.var))); - HANDLE_EXCEPTION(); - } ZVAL_MAKE_REF(expr_ptr); Z_ADDREF_P(expr_ptr); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -17820,11 +17510,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_VAR_CONST_HANDL HANDLE_EXCEPTION(); } - if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot unset string offsets"); - - HANDLE_EXCEPTION(); - } offset = EX_CONSTANT(opline->op2); do { @@ -17916,11 +17601,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_VAR_CONST_HANDL HANDLE_EXCEPTION(); } - if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot unset string offsets"); - - HANDLE_EXCEPTION(); - } offset = EX_CONSTANT(opline->op2); do { @@ -17987,12 +17667,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_CONST_HANDLER(Z } else { zval *value_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); - if (IS_VAR == IS_VAR && UNEXPECTED(value_ptr == NULL)) { - zend_throw_error(NULL, "Cannot yield string offsets by reference"); - - HANDLE_EXCEPTION(); - } - /* If a function call result is yielded and the function did * not return by reference we throw a notice. */ if (IS_VAR == IS_VAR && @@ -18193,12 +17867,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_TMP_HANDLER(ZEN } else { zval *value_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); - if (IS_VAR == IS_VAR && UNEXPECTED(value_ptr == NULL)) { - zend_throw_error(NULL, "Cannot yield string offsets by reference"); - zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); - HANDLE_EXCEPTION(); - } - /* If a function call result is yielded and the function did * not return by reference we throw a notice. */ if (IS_VAR == IS_VAR && @@ -18367,11 +18035,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_VAR_VAR_HANDLE SAVE_OPLINE(); value_ptr = _get_zval_ptr_ptr_var(opline->op2.var, execute_data, &free_op2); - if (IS_VAR == IS_VAR && UNEXPECTED(value_ptr == NULL)) { - zend_throw_error(NULL, "Cannot create references to/from string offsets"); - zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); - HANDLE_EXCEPTION(); - } if (IS_VAR == IS_VAR && UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT) && UNEXPECTED(!Z_ISREF_P(EX_VAR(opline->op1.var)))) { @@ -18395,11 +18058,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_VAR_VAR_HANDLE } variable_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); - if (IS_VAR == IS_VAR && UNEXPECTED(variable_ptr == NULL)) { - zend_throw_error(NULL, "Cannot create references to/from string offsets"); - if (UNEXPECTED(free_op2)) {zval_ptr_dtor_nogc(free_op2);}; - HANDLE_EXCEPTION(); - } if ((IS_VAR == IS_VAR && UNEXPECTED(variable_ptr == &EG(error_zval))) || (IS_VAR == IS_VAR && UNEXPECTED(value_ptr == &EG(error_zval)))) { variable_ptr = &EG(uninitialized_zval); @@ -18459,12 +18117,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_VAR_HANDLER(ZEN } else { zval *value_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); - if (IS_VAR == IS_VAR && UNEXPECTED(value_ptr == NULL)) { - zend_throw_error(NULL, "Cannot yield string offsets by reference"); - zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); - HANDLE_EXCEPTION(); - } - /* If a function call result is yielded and the function did * not return by reference we throw a notice. */ if (IS_VAR == IS_VAR && @@ -18574,12 +18226,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP HANDLE_EXCEPTION(); } - if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an array"); - FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); - - HANDLE_EXCEPTION(); - } dim = NULL; @@ -18600,14 +18246,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP ZEND_ASSERT(Z_TYPE(rv) == IS_INDIRECT); var_ptr = Z_INDIRECT(rv); - if (UNEXPECTED(var_ptr == NULL)) { - zend_throw_error(NULL, "Cannot use assign-op operators with string offsets"); - - FREE_OP(free_op_data1); - if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - HANDLE_EXCEPTION(); - } - if (UNEXPECTED(var_ptr == &EG(error_zval))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -18878,10 +18516,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_VAR_UNUSED_HA SAVE_OPLINE(); container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); - if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an array"); - HANDLE_EXCEPTION(); - } zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, NULL, IS_UNUSED); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -18900,10 +18534,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_RW_SPEC_VAR_UNUSED_H SAVE_OPLINE(); container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); - if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an array"); - HANDLE_EXCEPTION(); - } zend_fetch_dimension_address_RW(EX_VAR(opline->result.var), container, NULL, IS_UNUSED); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -18929,11 +18559,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_UN HANDLE_EXCEPTION(); } container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); - if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an array"); - - HANDLE_EXCEPTION(); - } zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, NULL, IS_UNUSED); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 1); @@ -18968,13 +18593,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_HAN SAVE_OPLINE(); object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); - if (IS_VAR == IS_VAR && UNEXPECTED(object_ptr == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an array"); - FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); - - HANDLE_EXCEPTION(); - } - if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: if (IS_UNUSED == IS_UNUSED) { @@ -19267,11 +18885,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_UNU if ((IS_VAR == IS_VAR || IS_VAR == IS_CV) && UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) { expr_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); - if (IS_VAR == IS_VAR && UNEXPECTED(expr_ptr == NULL)) { - zend_throw_error(NULL, "Cannot create references to/from string offsets"); - zend_array_destroy(Z_ARRVAL_P(EX_VAR(opline->result.var))); - HANDLE_EXCEPTION(); - } ZVAL_MAKE_REF(expr_ptr); Z_ADDREF_P(expr_ptr); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -19446,12 +19059,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_UNUSED_HANDLER( } else { zval *value_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); - if (IS_VAR == IS_VAR && UNEXPECTED(value_ptr == NULL)) { - zend_throw_error(NULL, "Cannot yield string offsets by reference"); - - HANDLE_EXCEPTION(); - } - /* If a function call result is yielded and the function did * not return by reference we throw a notice. */ if (IS_VAR == IS_VAR && @@ -19603,13 +19210,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); - if (IS_VAR == IS_VAR && UNEXPECTED(object == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an object"); - FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); - - HANDLE_EXCEPTION(); - } - do { value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); @@ -19662,12 +19262,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP HANDLE_EXCEPTION(); } - if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an array"); - FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); - - HANDLE_EXCEPTION(); - } dim = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); @@ -19688,14 +19282,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP ZEND_ASSERT(Z_TYPE(rv) == IS_INDIRECT); var_ptr = Z_INDIRECT(rv); - if (UNEXPECTED(var_ptr == NULL)) { - zend_throw_error(NULL, "Cannot use assign-op operators with string offsets"); - - FREE_OP(free_op_data1); - if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - HANDLE_EXCEPTION(); - } - if (UNEXPECTED(var_ptr == &EG(error_zval))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -19728,12 +19314,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_V value = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); - if (IS_VAR == IS_VAR && UNEXPECTED(var_ptr == NULL)) { - zend_throw_error(NULL, "Cannot use assign-op operators with string offsets"); - - HANDLE_EXCEPTION(); - } - if (IS_VAR == IS_VAR && UNEXPECTED(var_ptr == &EG(error_zval))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -20012,12 +19592,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); - if (IS_VAR == IS_VAR && UNEXPECTED(object == NULL)) { - zend_throw_error(NULL, "Cannot increment/decrement string offsets"); - - HANDLE_EXCEPTION(); - } - do { if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { ZVAL_DEREF(object); @@ -20092,12 +19666,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); - if (IS_VAR == IS_VAR && UNEXPECTED(object == NULL)) { - zend_throw_error(NULL, "Cannot increment/decrement string offsets"); - - HANDLE_EXCEPTION(); - } - do { if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { ZVAL_DEREF(object); @@ -20158,10 +19726,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_VAR_CV_HANDLE SAVE_OPLINE(); container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); - if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an array"); - HANDLE_EXCEPTION(); - } zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var), IS_CV); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -20180,10 +19744,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_RW_SPEC_VAR_CV_HANDL SAVE_OPLINE(); container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); - if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an array"); - HANDLE_EXCEPTION(); - } zend_fetch_dimension_address_RW(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var), IS_CV); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -20209,11 +19769,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_CV HANDLE_EXCEPTION(); } container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); - if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an array"); - - HANDLE_EXCEPTION(); - } zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var), IS_CV); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 1); @@ -20244,11 +19799,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_UNSET_SPEC_VAR_CV_HA SAVE_OPLINE(); container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); - if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an array"); - - HANDLE_EXCEPTION(); - } zend_fetch_dimension_address_UNSET(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var), IS_CV); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -20346,11 +19896,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CV_HANDLE HANDLE_EXCEPTION(); } - if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an object"); - - HANDLE_EXCEPTION(); - } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); @@ -20377,11 +19922,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_CV_HANDL HANDLE_EXCEPTION(); } - if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an object"); - - HANDLE_EXCEPTION(); - } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -20416,11 +19956,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_CV if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; HANDLE_EXCEPTION(); } - if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an object"); - - HANDLE_EXCEPTION(); - } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -20450,11 +19985,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_VAR_CV_HA property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); - if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an object"); - - HANDLE_EXCEPTION(); - } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -20482,11 +20012,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_HANDLER property_name = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); - if (IS_VAR == IS_VAR && UNEXPECTED(object == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an object"); - - HANDLE_EXCEPTION(); - } zend_assign_to_object(UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL, object, IS_VAR, property_name, IS_CV, (opline+1)->op1_type, (opline+1)->op1, execute_data, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -20507,13 +20032,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_HANDLER SAVE_OPLINE(); object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); - if (IS_VAR == IS_VAR && UNEXPECTED(object_ptr == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an array"); - FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); - - HANDLE_EXCEPTION(); - } - if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: if (IS_CV == IS_UNUSED) { @@ -20638,11 +20156,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_VAR_CV_HANDLER SAVE_OPLINE(); value_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, opline->op2.var); - if (IS_CV == IS_VAR && UNEXPECTED(value_ptr == NULL)) { - zend_throw_error(NULL, "Cannot create references to/from string offsets"); - zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); - HANDLE_EXCEPTION(); - } if (IS_VAR == IS_VAR && UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT) && UNEXPECTED(!Z_ISREF_P(EX_VAR(opline->op1.var)))) { @@ -20666,11 +20179,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_VAR_CV_HANDLER } variable_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); - if (IS_VAR == IS_VAR && UNEXPECTED(variable_ptr == NULL)) { - zend_throw_error(NULL, "Cannot create references to/from string offsets"); - - HANDLE_EXCEPTION(); - } if ((IS_VAR == IS_VAR && UNEXPECTED(variable_ptr == &EG(error_zval))) || (IS_CV == IS_VAR && UNEXPECTED(value_ptr == &EG(error_zval)))) { variable_ptr = &EG(uninitialized_zval); @@ -20838,11 +20346,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CV_ if ((IS_VAR == IS_VAR || IS_VAR == IS_CV) && UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) { expr_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); - if (IS_VAR == IS_VAR && UNEXPECTED(expr_ptr == NULL)) { - zend_throw_error(NULL, "Cannot create references to/from string offsets"); - zend_array_destroy(Z_ARRVAL_P(EX_VAR(opline->result.var))); - HANDLE_EXCEPTION(); - } ZVAL_MAKE_REF(expr_ptr); Z_ADDREF_P(expr_ptr); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -20974,11 +20477,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_VAR_CV_HANDLER( HANDLE_EXCEPTION(); } - if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot unset string offsets"); - - HANDLE_EXCEPTION(); - } offset = _get_zval_ptr_cv_undef(execute_data, opline->op2.var); do { @@ -21070,11 +20568,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_VAR_CV_HANDLER( HANDLE_EXCEPTION(); } - if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot unset string offsets"); - - HANDLE_EXCEPTION(); - } offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); do { @@ -21141,12 +20634,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_CV_HANDLER(ZEND } else { zval *value_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); - if (IS_VAR == IS_VAR && UNEXPECTED(value_ptr == NULL)) { - zend_throw_error(NULL, "Cannot yield string offsets by reference"); - - HANDLE_EXCEPTION(); - } - /* If a function call result is yielded and the function did * not return by reference we throw a notice. */ if (IS_VAR == IS_VAR && @@ -21262,13 +20749,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); - if (IS_VAR == IS_VAR && UNEXPECTED(object == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an object"); - FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); - zval_ptr_dtor_nogc(free_op2); - HANDLE_EXCEPTION(); - } - do { value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); @@ -21321,12 +20801,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); HANDLE_EXCEPTION(); } - if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an array"); - FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); - zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); - HANDLE_EXCEPTION(); - } dim = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); @@ -21347,14 +20821,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP ZEND_ASSERT(Z_TYPE(rv) == IS_INDIRECT); var_ptr = Z_INDIRECT(rv); - if (UNEXPECTED(var_ptr == NULL)) { - zend_throw_error(NULL, "Cannot use assign-op operators with string offsets"); - zval_ptr_dtor_nogc(free_op2); - FREE_OP(free_op_data1); - if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - HANDLE_EXCEPTION(); - } - if (UNEXPECTED(var_ptr == &EG(error_zval))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -21388,12 +20854,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_V value = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); - if (IS_VAR == IS_VAR && UNEXPECTED(var_ptr == NULL)) { - zend_throw_error(NULL, "Cannot use assign-op operators with string offsets"); - zval_ptr_dtor_nogc(free_op2); - HANDLE_EXCEPTION(); - } - if (IS_VAR == IS_VAR && UNEXPECTED(var_ptr == &EG(error_zval))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -21673,12 +21133,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); - if (IS_VAR == IS_VAR && UNEXPECTED(object == NULL)) { - zend_throw_error(NULL, "Cannot increment/decrement string offsets"); - zval_ptr_dtor_nogc(free_op2); - HANDLE_EXCEPTION(); - } - do { if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { ZVAL_DEREF(object); @@ -21754,12 +21208,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); - if (IS_VAR == IS_VAR && UNEXPECTED(object == NULL)) { - zend_throw_error(NULL, "Cannot increment/decrement string offsets"); - zval_ptr_dtor_nogc(free_op2); - HANDLE_EXCEPTION(); - } - do { if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { ZVAL_DEREF(object); @@ -21821,10 +21269,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_VAR_TMPVAR_HA SAVE_OPLINE(); container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); - if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an array"); - HANDLE_EXCEPTION(); - } zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2), (IS_TMP_VAR|IS_VAR)); zval_ptr_dtor_nogc(free_op2); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -21843,10 +21287,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_RW_SPEC_VAR_TMPVAR_H SAVE_OPLINE(); container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); - if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an array"); - HANDLE_EXCEPTION(); - } zend_fetch_dimension_address_RW(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2), (IS_TMP_VAR|IS_VAR)); zval_ptr_dtor_nogc(free_op2); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -21872,11 +21312,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_VAR_TM HANDLE_EXCEPTION(); } container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); - if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an array"); - zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); - HANDLE_EXCEPTION(); - } zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2), (IS_TMP_VAR|IS_VAR)); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 1); @@ -21907,11 +21342,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_UNSET_SPEC_VAR_TMPVA SAVE_OPLINE(); container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); - if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an array"); - zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); - HANDLE_EXCEPTION(); - } zend_fetch_dimension_address_UNSET(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2), (IS_TMP_VAR|IS_VAR)); zval_ptr_dtor_nogc(free_op2); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -22010,11 +21440,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_TMPVAR_HA zval_ptr_dtor_nogc(free_op2); HANDLE_EXCEPTION(); } - if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an object"); - zval_ptr_dtor_nogc(free_op2); - HANDLE_EXCEPTION(); - } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); zval_ptr_dtor_nogc(free_op2); @@ -22041,11 +21466,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_VAR_TMPVAR_H zval_ptr_dtor_nogc(free_op2); HANDLE_EXCEPTION(); } - if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an object"); - zval_ptr_dtor_nogc(free_op2); - HANDLE_EXCEPTION(); - } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); zval_ptr_dtor_nogc(free_op2); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -22080,11 +21500,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_VAR_TM if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; HANDLE_EXCEPTION(); } - if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an object"); - zval_ptr_dtor_nogc(free_op2); - HANDLE_EXCEPTION(); - } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); zval_ptr_dtor_nogc(free_op2); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -22114,11 +21529,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_VAR_TMPVA property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); - if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an object"); - zval_ptr_dtor_nogc(free_op2); - HANDLE_EXCEPTION(); - } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET); zval_ptr_dtor_nogc(free_op2); if (IS_VAR == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -22146,11 +21556,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_HAN property_name = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); - if (IS_VAR == IS_VAR && UNEXPECTED(object == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an object"); - zval_ptr_dtor_nogc(free_op2); - HANDLE_EXCEPTION(); - } zend_assign_to_object(UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL, object, IS_VAR, property_name, (IS_TMP_VAR|IS_VAR), (opline+1)->op1_type, (opline+1)->op1, execute_data, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); zval_ptr_dtor_nogc(free_op2); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -22171,13 +21576,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_HAN SAVE_OPLINE(); object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); - if (IS_VAR == IS_VAR && UNEXPECTED(object_ptr == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an array"); - FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); - zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); - HANDLE_EXCEPTION(); - } - if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) { @@ -22415,11 +21813,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_TMP if ((IS_VAR == IS_VAR || IS_VAR == IS_CV) && UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) { expr_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); - if (IS_VAR == IS_VAR && UNEXPECTED(expr_ptr == NULL)) { - zend_throw_error(NULL, "Cannot create references to/from string offsets"); - zend_array_destroy(Z_ARRVAL_P(EX_VAR(opline->result.var))); - HANDLE_EXCEPTION(); - } ZVAL_MAKE_REF(expr_ptr); Z_ADDREF_P(expr_ptr); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -22551,11 +21944,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_VAR_TMPVAR_HAND zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); HANDLE_EXCEPTION(); } - if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot unset string offsets"); - zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); - HANDLE_EXCEPTION(); - } offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); do { @@ -22648,11 +22036,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_VAR_TMPVAR_HAND zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); HANDLE_EXCEPTION(); } - if (IS_VAR == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot unset string offsets"); - zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); - HANDLE_EXCEPTION(); - } offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); do { @@ -22861,13 +22244,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP property = EX_CONSTANT(opline->op2); - if (IS_UNUSED == IS_VAR && UNEXPECTED(object == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an object"); - FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); - - HANDLE_EXCEPTION(); - } - do { value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); @@ -22920,12 +22296,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP HANDLE_EXCEPTION(); } - if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an array"); - FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); - - HANDLE_EXCEPTION(); - } dim = EX_CONSTANT(opline->op2); @@ -22946,14 +22316,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP ZEND_ASSERT(Z_TYPE(rv) == IS_INDIRECT); var_ptr = Z_INDIRECT(rv); - if (UNEXPECTED(var_ptr == NULL)) { - zend_throw_error(NULL, "Cannot use assign-op operators with string offsets"); - - FREE_OP(free_op_data1); - - HANDLE_EXCEPTION(); - } - if (UNEXPECTED(var_ptr == &EG(error_zval))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -23234,12 +22596,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE property = EX_CONSTANT(opline->op2); - if (IS_UNUSED == IS_VAR && UNEXPECTED(object == NULL)) { - zend_throw_error(NULL, "Cannot increment/decrement string offsets"); - - HANDLE_EXCEPTION(); - } - do { if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { ZVAL_DEREF(object); @@ -23314,12 +22670,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP property = EX_CONSTANT(opline->op2); - if (IS_UNUSED == IS_VAR && UNEXPECTED(object == NULL)) { - zend_throw_error(NULL, "Cannot increment/decrement string offsets"); - - HANDLE_EXCEPTION(); - } - do { if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { ZVAL_DEREF(object); @@ -23459,11 +22809,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CONST_ HANDLE_EXCEPTION(); } - if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an object"); - - HANDLE_EXCEPTION(); - } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); @@ -23490,11 +22835,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CONST HANDLE_EXCEPTION(); } - if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an object"); - - HANDLE_EXCEPTION(); - } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -23599,11 +22939,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED zend_throw_error(NULL, "Cannot use temporary expression in write context"); - HANDLE_EXCEPTION(); - } - if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an object"); - HANDLE_EXCEPTION(); } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); @@ -23635,11 +22970,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_CO property = EX_CONSTANT(opline->op2); - if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an object"); - - HANDLE_EXCEPTION(); - } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET); if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -23667,11 +22997,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_H property_name = EX_CONSTANT(opline->op2); - if (IS_UNUSED == IS_VAR && UNEXPECTED(object == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an object"); - - HANDLE_EXCEPTION(); - } zend_assign_to_object(UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL, object, IS_UNUSED, property_name, IS_CONST, (opline+1)->op1_type, (opline+1)->op1, execute_data, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); @@ -24145,11 +23470,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_UNUSED_CONST_HA HANDLE_EXCEPTION(); } - if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot unset string offsets"); - - HANDLE_EXCEPTION(); - } offset = EX_CONSTANT(opline->op2); do { @@ -24241,11 +23561,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_UNUSED_CONST_HA HANDLE_EXCEPTION(); } - if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot unset string offsets"); - - HANDLE_EXCEPTION(); - } offset = EX_CONSTANT(opline->op2); do { @@ -24495,12 +23810,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_CONST_HANDLE } else { zval *value_ptr = NULL; - if (IS_UNUSED == IS_VAR && UNEXPECTED(value_ptr == NULL)) { - zend_throw_error(NULL, "Cannot yield string offsets by reference"); - - HANDLE_EXCEPTION(); - } - /* If a function call result is yielded and the function did * not return by reference we throw a notice. */ if (IS_UNUSED == IS_VAR && @@ -24594,148 +23903,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_CONST_HANDLE ZEND_VM_RETURN(); } -static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) -{ - USE_OPLINE - - zend_generator *generator = zend_get_running_generator(execute_data); - - SAVE_OPLINE(); - if (UNEXPECTED(generator->flags & ZEND_GENERATOR_FORCED_CLOSE)) { - zend_throw_error(NULL, "Cannot yield from finally in a force-closed generator"); - zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); - - HANDLE_EXCEPTION(); - } - - /* Destroy the previously yielded value */ - zval_ptr_dtor(&generator->value); - - /* Destroy the previously yielded key */ - zval_ptr_dtor(&generator->key); - - /* Set the new yielded value */ - if (IS_UNUSED != IS_UNUSED) { - - - if (UNEXPECTED(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)) { - /* Constants and temporary variables aren't yieldable by reference, - * but we still allow them with a notice. */ - if (IS_UNUSED == IS_CONST || IS_UNUSED == IS_TMP_VAR) { - zval *value; - - zend_error(E_NOTICE, "Only variable references should be yielded by reference"); - - value = NULL; - ZVAL_COPY_VALUE(&generator->value, value); - if (IS_UNUSED != IS_CONST) { - if (UNEXPECTED(Z_OPT_COPYABLE(generator->value))) { - zval_copy_ctor_func(&generator->value); - } - } - } else { - zval *value_ptr = NULL; - - if (IS_UNUSED == IS_VAR && UNEXPECTED(value_ptr == NULL)) { - zend_throw_error(NULL, "Cannot yield string offsets by reference"); - zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); - HANDLE_EXCEPTION(); - } - - /* If a function call result is yielded and the function did - * not return by reference we throw a notice. */ - if (IS_UNUSED == IS_VAR && - (value_ptr == &EG(uninitialized_zval) || - (opline->extended_value == ZEND_RETURNS_FUNCTION && - !(Z_VAR_FLAGS_P(value_ptr) & IS_VAR_RET_REF)))) { - zend_error(E_NOTICE, "Only variable references should be yielded by reference"); - } else { - ZVAL_MAKE_REF(value_ptr); - } - ZVAL_COPY(&generator->value, value_ptr); - - } - } else { - zval *value = NULL; - - /* Consts, temporary variables and references need copying */ - if (IS_UNUSED == IS_CONST) { - ZVAL_COPY_VALUE(&generator->value, value); - if (UNEXPECTED(Z_OPT_COPYABLE(generator->value))) { - zval_copy_ctor_func(&generator->value); - } - } else if (IS_UNUSED == IS_TMP_VAR) { - ZVAL_COPY_VALUE(&generator->value, value); - } else if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) { - ZVAL_COPY(&generator->value, Z_REFVAL_P(value)); - - } else { - ZVAL_COPY_VALUE(&generator->value, value); - if (IS_UNUSED == IS_CV) { - if (Z_OPT_REFCOUNTED_P(value)) Z_ADDREF_P(value); - } - } - } - } else { - /* If no value was specified yield null */ - ZVAL_NULL(&generator->value); - } - - /* Set the new yielded key */ - if (IS_TMP_VAR != IS_UNUSED) { - zend_free_op free_op2; - zval *key = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2); - - /* Consts, temporary variables and references need copying */ - if (IS_TMP_VAR == IS_CONST) { - ZVAL_COPY_VALUE(&generator->key, key); - if (UNEXPECTED(Z_OPT_COPYABLE(generator->key))) { - zval_copy_ctor_func(&generator->key); - } - } else if (IS_TMP_VAR == IS_TMP_VAR) { - ZVAL_COPY_VALUE(&generator->key, key); - } else if ((IS_TMP_VAR & (IS_VAR|IS_CV)) && Z_ISREF_P(key)) { - ZVAL_COPY(&generator->key, Z_REFVAL_P(key)); - - } else { - ZVAL_COPY_VALUE(&generator->key, key); - if (IS_TMP_VAR == IS_CV) { - if (Z_OPT_REFCOUNTED_P(key)) Z_ADDREF_P(key); - } - } - - if (Z_TYPE(generator->key) == IS_LONG - && Z_LVAL(generator->key) > generator->largest_used_integer_key - ) { - generator->largest_used_integer_key = Z_LVAL(generator->key); - } - } else { - /* If no key was specified we use auto-increment keys */ - generator->largest_used_integer_key++; - ZVAL_LONG(&generator->key, generator->largest_used_integer_key); - } - - if (RETURN_VALUE_USED(opline)) { - /* If the return value of yield is used set the send - * target and initialize it to NULL */ - generator->send_target = EX_VAR(opline->result.var); - ZVAL_NULL(generator->send_target); - } else { - generator->send_target = NULL; - } - - /* We increment to the next op, so we are at the correct position when the - * generator is resumed. */ - ZEND_VM_INC_OPCODE(); - - /* The GOTO VM uses a local opline variable. We need to set the opline - * variable in execute_data so we don't resume at an old position. */ - SAVE_OPLINE(); - - ZEND_VM_RETURN(); -} - -static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -24777,11 +23945,140 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_VAR_HANDLER( } else { zval *value_ptr = NULL; - if (IS_UNUSED == IS_VAR && UNEXPECTED(value_ptr == NULL)) { - zend_throw_error(NULL, "Cannot yield string offsets by reference"); - zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); - HANDLE_EXCEPTION(); + /* If a function call result is yielded and the function did + * not return by reference we throw a notice. */ + if (IS_UNUSED == IS_VAR && + (value_ptr == &EG(uninitialized_zval) || + (opline->extended_value == ZEND_RETURNS_FUNCTION && + !(Z_VAR_FLAGS_P(value_ptr) & IS_VAR_RET_REF)))) { + zend_error(E_NOTICE, "Only variable references should be yielded by reference"); + } else { + ZVAL_MAKE_REF(value_ptr); + } + ZVAL_COPY(&generator->value, value_ptr); + + } + } else { + zval *value = NULL; + + /* Consts, temporary variables and references need copying */ + if (IS_UNUSED == IS_CONST) { + ZVAL_COPY_VALUE(&generator->value, value); + if (UNEXPECTED(Z_OPT_COPYABLE(generator->value))) { + zval_copy_ctor_func(&generator->value); + } + } else if (IS_UNUSED == IS_TMP_VAR) { + ZVAL_COPY_VALUE(&generator->value, value); + } else if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_ISREF_P(value)) { + ZVAL_COPY(&generator->value, Z_REFVAL_P(value)); + + } else { + ZVAL_COPY_VALUE(&generator->value, value); + if (IS_UNUSED == IS_CV) { + if (Z_OPT_REFCOUNTED_P(value)) Z_ADDREF_P(value); + } + } + } + } else { + /* If no value was specified yield null */ + ZVAL_NULL(&generator->value); + } + + /* Set the new yielded key */ + if (IS_TMP_VAR != IS_UNUSED) { + zend_free_op free_op2; + zval *key = _get_zval_ptr_tmp(opline->op2.var, execute_data, &free_op2); + + /* Consts, temporary variables and references need copying */ + if (IS_TMP_VAR == IS_CONST) { + ZVAL_COPY_VALUE(&generator->key, key); + if (UNEXPECTED(Z_OPT_COPYABLE(generator->key))) { + zval_copy_ctor_func(&generator->key); + } + } else if (IS_TMP_VAR == IS_TMP_VAR) { + ZVAL_COPY_VALUE(&generator->key, key); + } else if ((IS_TMP_VAR & (IS_VAR|IS_CV)) && Z_ISREF_P(key)) { + ZVAL_COPY(&generator->key, Z_REFVAL_P(key)); + + } else { + ZVAL_COPY_VALUE(&generator->key, key); + if (IS_TMP_VAR == IS_CV) { + if (Z_OPT_REFCOUNTED_P(key)) Z_ADDREF_P(key); + } + } + + if (Z_TYPE(generator->key) == IS_LONG + && Z_LVAL(generator->key) > generator->largest_used_integer_key + ) { + generator->largest_used_integer_key = Z_LVAL(generator->key); + } + } else { + /* If no key was specified we use auto-increment keys */ + generator->largest_used_integer_key++; + ZVAL_LONG(&generator->key, generator->largest_used_integer_key); + } + + if (RETURN_VALUE_USED(opline)) { + /* If the return value of yield is used set the send + * target and initialize it to NULL */ + generator->send_target = EX_VAR(opline->result.var); + ZVAL_NULL(generator->send_target); + } else { + generator->send_target = NULL; + } + + /* We increment to the next op, so we are at the correct position when the + * generator is resumed. */ + ZEND_VM_INC_OPCODE(); + + /* The GOTO VM uses a local opline variable. We need to set the opline + * variable in execute_data so we don't resume at an old position. */ + SAVE_OPLINE(); + + ZEND_VM_RETURN(); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zend_generator *generator = zend_get_running_generator(execute_data); + + SAVE_OPLINE(); + if (UNEXPECTED(generator->flags & ZEND_GENERATOR_FORCED_CLOSE)) { + zend_throw_error(NULL, "Cannot yield from finally in a force-closed generator"); + zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); + + HANDLE_EXCEPTION(); + } + + /* Destroy the previously yielded value */ + zval_ptr_dtor(&generator->value); + + /* Destroy the previously yielded key */ + zval_ptr_dtor(&generator->key); + + /* Set the new yielded value */ + if (IS_UNUSED != IS_UNUSED) { + + + if (UNEXPECTED(EX(func)->op_array.fn_flags & ZEND_ACC_RETURN_REFERENCE)) { + /* Constants and temporary variables aren't yieldable by reference, + * but we still allow them with a notice. */ + if (IS_UNUSED == IS_CONST || IS_UNUSED == IS_TMP_VAR) { + zval *value; + + zend_error(E_NOTICE, "Only variable references should be yielded by reference"); + + value = NULL; + ZVAL_COPY_VALUE(&generator->value, value); + if (IS_UNUSED != IS_CONST) { + if (UNEXPECTED(Z_OPT_COPYABLE(generator->value))) { + zval_copy_ctor_func(&generator->value); + } } + } else { + zval *value_ptr = NULL; /* If a function call result is yielded and the function did * not return by reference we throw a notice. */ @@ -24891,12 +24188,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP HANDLE_EXCEPTION(); } - if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an array"); - FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); - - HANDLE_EXCEPTION(); - } dim = NULL; @@ -24917,14 +24208,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP ZEND_ASSERT(Z_TYPE(rv) == IS_INDIRECT); var_ptr = Z_INDIRECT(rv); - if (UNEXPECTED(var_ptr == NULL)) { - zend_throw_error(NULL, "Cannot use assign-op operators with string offsets"); - - FREE_OP(free_op_data1); - - HANDLE_EXCEPTION(); - } - if (UNEXPECTED(var_ptr == &EG(error_zval))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -25455,12 +24738,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_UNUSED_HANDL } else { zval *value_ptr = NULL; - if (IS_UNUSED == IS_VAR && UNEXPECTED(value_ptr == NULL)) { - zend_throw_error(NULL, "Cannot yield string offsets by reference"); - - HANDLE_EXCEPTION(); - } - /* If a function call result is yielded and the function did * not return by reference we throw a notice. */ if (IS_UNUSED == IS_VAR && @@ -25575,13 +24852,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); - if (IS_UNUSED == IS_VAR && UNEXPECTED(object == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an object"); - FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); - - HANDLE_EXCEPTION(); - } - do { value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); @@ -25634,12 +24904,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP HANDLE_EXCEPTION(); } - if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an array"); - FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); - - HANDLE_EXCEPTION(); - } dim = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); @@ -25660,14 +24924,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP ZEND_ASSERT(Z_TYPE(rv) == IS_INDIRECT); var_ptr = Z_INDIRECT(rv); - if (UNEXPECTED(var_ptr == NULL)) { - zend_throw_error(NULL, "Cannot use assign-op operators with string offsets"); - - FREE_OP(free_op_data1); - - HANDLE_EXCEPTION(); - } - if (UNEXPECTED(var_ptr == &EG(error_zval))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -25948,12 +25204,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); - if (IS_UNUSED == IS_VAR && UNEXPECTED(object == NULL)) { - zend_throw_error(NULL, "Cannot increment/decrement string offsets"); - - HANDLE_EXCEPTION(); - } - do { if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { ZVAL_DEREF(object); @@ -26028,12 +25278,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); - if (IS_UNUSED == IS_VAR && UNEXPECTED(object == NULL)) { - zend_throw_error(NULL, "Cannot increment/decrement string offsets"); - - HANDLE_EXCEPTION(); - } - do { if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { ZVAL_DEREF(object); @@ -26173,11 +25417,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CV_HAN HANDLE_EXCEPTION(); } - if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an object"); - - HANDLE_EXCEPTION(); - } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); @@ -26204,11 +25443,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_CV_HA HANDLE_EXCEPTION(); } - if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an object"); - - HANDLE_EXCEPTION(); - } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -26313,11 +25547,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED zend_throw_error(NULL, "Cannot use temporary expression in write context"); - HANDLE_EXCEPTION(); - } - if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an object"); - HANDLE_EXCEPTION(); } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); @@ -26349,11 +25578,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_CV property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); - if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an object"); - - HANDLE_EXCEPTION(); - } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET); if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -26381,11 +25605,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_HAND property_name = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); - if (IS_UNUSED == IS_VAR && UNEXPECTED(object == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an object"); - - HANDLE_EXCEPTION(); - } zend_assign_to_object(UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL, object, IS_UNUSED, property_name, IS_CV, (opline+1)->op1_type, (opline+1)->op1, execute_data, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); @@ -26733,11 +25952,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_UNUSED_CV_HANDL HANDLE_EXCEPTION(); } - if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot unset string offsets"); - - HANDLE_EXCEPTION(); - } offset = _get_zval_ptr_cv_undef(execute_data, opline->op2.var); do { @@ -26829,11 +26043,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_UNUSED_CV_HANDL HANDLE_EXCEPTION(); } - if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot unset string offsets"); - - HANDLE_EXCEPTION(); - } offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); do { @@ -27083,12 +26292,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_CV_HANDLER(Z } else { zval *value_ptr = NULL; - if (IS_UNUSED == IS_VAR && UNEXPECTED(value_ptr == NULL)) { - zend_throw_error(NULL, "Cannot yield string offsets by reference"); - - HANDLE_EXCEPTION(); - } - /* If a function call result is yielded and the function did * not return by reference we throw a notice. */ if (IS_UNUSED == IS_VAR && @@ -27203,13 +26406,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); - if (IS_UNUSED == IS_VAR && UNEXPECTED(object == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an object"); - FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); - zval_ptr_dtor_nogc(free_op2); - HANDLE_EXCEPTION(); - } - do { value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); @@ -27262,12 +26458,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); HANDLE_EXCEPTION(); } - if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an array"); - FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); - zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); - HANDLE_EXCEPTION(); - } dim = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); @@ -27288,14 +26478,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP ZEND_ASSERT(Z_TYPE(rv) == IS_INDIRECT); var_ptr = Z_INDIRECT(rv); - if (UNEXPECTED(var_ptr == NULL)) { - zend_throw_error(NULL, "Cannot use assign-op operators with string offsets"); - zval_ptr_dtor_nogc(free_op2); - FREE_OP(free_op_data1); - - HANDLE_EXCEPTION(); - } - if (UNEXPECTED(var_ptr == &EG(error_zval))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -27577,12 +26759,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); - if (IS_UNUSED == IS_VAR && UNEXPECTED(object == NULL)) { - zend_throw_error(NULL, "Cannot increment/decrement string offsets"); - zval_ptr_dtor_nogc(free_op2); - HANDLE_EXCEPTION(); - } - do { if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { ZVAL_DEREF(object); @@ -27658,12 +26834,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); - if (IS_UNUSED == IS_VAR && UNEXPECTED(object == NULL)) { - zend_throw_error(NULL, "Cannot increment/decrement string offsets"); - zval_ptr_dtor_nogc(free_op2); - HANDLE_EXCEPTION(); - } - do { if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { ZVAL_DEREF(object); @@ -27805,11 +26975,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMPVAR zval_ptr_dtor_nogc(free_op2); HANDLE_EXCEPTION(); } - if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an object"); - zval_ptr_dtor_nogc(free_op2); - HANDLE_EXCEPTION(); - } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); zval_ptr_dtor_nogc(free_op2); @@ -27836,11 +27001,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_UNUSED_TMPVA zval_ptr_dtor_nogc(free_op2); HANDLE_EXCEPTION(); } - if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an object"); - zval_ptr_dtor_nogc(free_op2); - HANDLE_EXCEPTION(); - } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); zval_ptr_dtor_nogc(free_op2); if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -27948,11 +27108,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED HANDLE_EXCEPTION(); } - if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an object"); - zval_ptr_dtor_nogc(free_op2); - HANDLE_EXCEPTION(); - } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); zval_ptr_dtor_nogc(free_op2); if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -27982,11 +27137,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_UNUSED_TM property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); - if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an object"); - zval_ptr_dtor_nogc(free_op2); - HANDLE_EXCEPTION(); - } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET); zval_ptr_dtor_nogc(free_op2); if (IS_UNUSED == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -28014,11 +27164,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ property_name = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); - if (IS_UNUSED == IS_VAR && UNEXPECTED(object == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an object"); - zval_ptr_dtor_nogc(free_op2); - HANDLE_EXCEPTION(); - } zend_assign_to_object(UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL, object, IS_UNUSED, property_name, (IS_TMP_VAR|IS_VAR), (opline+1)->op1_type, (opline+1)->op1, execute_data, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); zval_ptr_dtor_nogc(free_op2); @@ -28367,11 +27512,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_UNUSED_TMPVAR_H zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); HANDLE_EXCEPTION(); } - if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot unset string offsets"); - zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); - HANDLE_EXCEPTION(); - } offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); do { @@ -28464,11 +27604,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_UNUSED_TMPVAR_H zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); HANDLE_EXCEPTION(); } - if (IS_UNUSED == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot unset string offsets"); - zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); - HANDLE_EXCEPTION(); - } offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); do { @@ -28723,12 +27858,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_CV_HANDLER(ZEND_O var_ptr = _get_zval_ptr_cv_undef_BP_VAR_RW(execute_data, opline->op1.var); - if (IS_CV == IS_VAR && UNEXPECTED(var_ptr == NULL)) { - SAVE_OPLINE(); - zend_throw_error(NULL, "Cannot increment/decrement string offsets"); - HANDLE_EXCEPTION(); - } - if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) { fast_long_increment_function(var_ptr); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -28768,12 +27897,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_CV_HANDLER(ZEND_O var_ptr = _get_zval_ptr_cv_undef_BP_VAR_RW(execute_data, opline->op1.var); - if (IS_CV == IS_VAR && UNEXPECTED(var_ptr == NULL)) { - SAVE_OPLINE(); - zend_throw_error(NULL, "Cannot increment/decrement string offsets"); - HANDLE_EXCEPTION(); - } - if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) { fast_long_decrement_function(var_ptr); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -28813,12 +27936,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_CV_HANDLER(ZEND_ var_ptr = _get_zval_ptr_cv_undef_BP_VAR_RW(execute_data, opline->op1.var); - if (IS_CV == IS_VAR && UNEXPECTED(var_ptr == NULL)) { - SAVE_OPLINE(); - zend_throw_error(NULL, "Cannot increment/decrement string offsets"); - HANDLE_EXCEPTION(); - } - if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) { ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr); fast_long_increment_function(var_ptr); @@ -28851,12 +27968,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_SPEC_CV_HANDLER(ZEND_ var_ptr = _get_zval_ptr_cv_undef_BP_VAR_RW(execute_data, opline->op1.var); - if (IS_CV == IS_VAR && UNEXPECTED(var_ptr == NULL)) { - SAVE_OPLINE(); - zend_throw_error(NULL, "Cannot increment/decrement string offsets"); - HANDLE_EXCEPTION(); - } - if (EXPECTED(Z_TYPE_P(var_ptr) == IS_LONG)) { ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr); fast_long_decrement_function(var_ptr); @@ -29180,11 +28291,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RETURN_BY_REF_SPEC_CV_HANDLER( retval_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, opline->op1.var); - if (IS_CV == IS_VAR && UNEXPECTED(retval_ptr == NULL)) { - zend_throw_error(NULL, "Cannot return string offsets by reference"); - HANDLE_EXCEPTION(); - } - if (IS_CV == IS_VAR) { if (retval_ptr == &EG(uninitialized_zval) || (opline->extended_value == ZEND_RETURNS_FUNCTION && @@ -29343,13 +28449,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_REF_SPEC_CV_HANDLER(ZEND_ SAVE_OPLINE(); varptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, opline->op1.var); - if (IS_CV == IS_VAR && UNEXPECTED(varptr == NULL)) { - zend_throw_error(NULL, "Only variables can be passed by reference"); - arg = ZEND_CALL_VAR(EX(call), opline->result.var); - ZVAL_UNDEF(arg); - HANDLE_EXCEPTION(); - } - arg = ZEND_CALL_VAR(EX(call), opline->result.var); if (IS_CV == IS_VAR && UNEXPECTED(varptr == &EG(error_zval))) { ZVAL_NEW_REF(arg, &EG(uninitialized_zval)); @@ -31028,13 +30127,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP property = EX_CONSTANT(opline->op2); - if (IS_CV == IS_VAR && UNEXPECTED(object == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an object"); - FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); - - HANDLE_EXCEPTION(); - } - do { value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); @@ -31087,12 +30179,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP HANDLE_EXCEPTION(); } - if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an array"); - FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); - - HANDLE_EXCEPTION(); - } dim = EX_CONSTANT(opline->op2); @@ -31113,14 +30199,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP ZEND_ASSERT(Z_TYPE(rv) == IS_INDIRECT); var_ptr = Z_INDIRECT(rv); - if (UNEXPECTED(var_ptr == NULL)) { - zend_throw_error(NULL, "Cannot use assign-op operators with string offsets"); - - FREE_OP(free_op_data1); - - HANDLE_EXCEPTION(); - } - if (UNEXPECTED(var_ptr == &EG(error_zval))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -31153,12 +30231,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_C value = EX_CONSTANT(opline->op2); var_ptr = _get_zval_ptr_cv_BP_VAR_RW(execute_data, opline->op1.var); - if (IS_CV == IS_VAR && UNEXPECTED(var_ptr == NULL)) { - zend_throw_error(NULL, "Cannot use assign-op operators with string offsets"); - - HANDLE_EXCEPTION(); - } - if (IS_CV == IS_VAR && UNEXPECTED(var_ptr == &EG(error_zval))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -31437,12 +30509,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE property = EX_CONSTANT(opline->op2); - if (IS_CV == IS_VAR && UNEXPECTED(object == NULL)) { - zend_throw_error(NULL, "Cannot increment/decrement string offsets"); - - HANDLE_EXCEPTION(); - } - do { if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { ZVAL_DEREF(object); @@ -31517,12 +30583,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP property = EX_CONSTANT(opline->op2); - if (IS_CV == IS_VAR && UNEXPECTED(object == NULL)) { - zend_throw_error(NULL, "Cannot increment/decrement string offsets"); - - HANDLE_EXCEPTION(); - } - do { if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { ZVAL_DEREF(object); @@ -31736,10 +30796,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_CV_CONST_HAND SAVE_OPLINE(); container = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var); - if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an array"); - HANDLE_EXCEPTION(); - } zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, EX_CONSTANT(opline->op2), IS_CONST); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -31758,10 +30814,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_RW_SPEC_CV_CONST_HAN SAVE_OPLINE(); container = _get_zval_ptr_cv_BP_VAR_RW(execute_data, opline->op1.var); - if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an array"); - HANDLE_EXCEPTION(); - } zend_fetch_dimension_address_RW(EX_VAR(opline->result.var), container, EX_CONSTANT(opline->op2), IS_CONST); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -31801,11 +30853,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_CON HANDLE_EXCEPTION(); } container = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var); - if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an array"); - - HANDLE_EXCEPTION(); - } zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, EX_CONSTANT(opline->op2), IS_CONST); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 1); @@ -31836,11 +30883,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_UNSET_SPEC_CV_CONST_ SAVE_OPLINE(); container = _get_zval_ptr_cv_BP_VAR_UNSET(execute_data, opline->op1.var); - if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an array"); - - HANDLE_EXCEPTION(); - } zend_fetch_dimension_address_UNSET(EX_VAR(opline->result.var), container, EX_CONSTANT(opline->op2), IS_CONST); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -31938,11 +30980,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CONST_HAND HANDLE_EXCEPTION(); } - if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an object"); - - HANDLE_EXCEPTION(); - } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); @@ -31969,11 +31006,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_CONST_HAN HANDLE_EXCEPTION(); } - if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an object"); - - HANDLE_EXCEPTION(); - } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -32078,11 +31110,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CON zend_throw_error(NULL, "Cannot use temporary expression in write context"); - HANDLE_EXCEPTION(); - } - if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an object"); - HANDLE_EXCEPTION(); } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); @@ -32114,11 +31141,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_CV_CONST_ property = EX_CONSTANT(opline->op2); - if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an object"); - - HANDLE_EXCEPTION(); - } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -32190,11 +31212,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_HANDL property_name = EX_CONSTANT(opline->op2); - if (IS_CV == IS_VAR && UNEXPECTED(object == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an object"); - - HANDLE_EXCEPTION(); - } zend_assign_to_object(UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL, object, IS_CV, property_name, IS_CONST, (opline+1)->op1_type, (opline+1)->op1, execute_data, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); @@ -32215,13 +31232,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_HANDL SAVE_OPLINE(); object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var); - if (IS_CV == IS_VAR && UNEXPECTED(object_ptr == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an array"); - FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); - - HANDLE_EXCEPTION(); - } - if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: if (IS_CONST == IS_UNUSED) { @@ -32598,11 +31608,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CONS if ((IS_CV == IS_VAR || IS_CV == IS_CV) && UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) { expr_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, opline->op1.var); - if (IS_CV == IS_VAR && UNEXPECTED(expr_ptr == NULL)) { - zend_throw_error(NULL, "Cannot create references to/from string offsets"); - zend_array_destroy(Z_ARRVAL_P(EX_VAR(opline->result.var))); - HANDLE_EXCEPTION(); - } ZVAL_MAKE_REF(expr_ptr); Z_ADDREF_P(expr_ptr); @@ -32792,11 +31797,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_CV_CONST_HANDLE HANDLE_EXCEPTION(); } - if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot unset string offsets"); - - HANDLE_EXCEPTION(); - } offset = EX_CONSTANT(opline->op2); do { @@ -32888,11 +31888,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_CV_CONST_HANDLE HANDLE_EXCEPTION(); } - if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot unset string offsets"); - - HANDLE_EXCEPTION(); - } offset = EX_CONSTANT(opline->op2); do { @@ -33276,12 +32271,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CV_CONST_HANDLER(ZE } else { zval *value_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, opline->op1.var); - if (IS_CV == IS_VAR && UNEXPECTED(value_ptr == NULL)) { - zend_throw_error(NULL, "Cannot yield string offsets by reference"); - - HANDLE_EXCEPTION(); - } - /* If a function call result is yielded and the function did * not return by reference we throw a notice. */ if (IS_CV == IS_VAR && @@ -33572,12 +32561,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CV_TMP_HANDLER(ZEND } else { zval *value_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, opline->op1.var); - if (IS_CV == IS_VAR && UNEXPECTED(value_ptr == NULL)) { - zend_throw_error(NULL, "Cannot yield string offsets by reference"); - zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); - HANDLE_EXCEPTION(); - } - /* If a function call result is yielded and the function did * not return by reference we throw a notice. */ if (IS_CV == IS_VAR && @@ -33884,11 +32867,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_CV_VAR_HANDLER SAVE_OPLINE(); value_ptr = _get_zval_ptr_ptr_var(opline->op2.var, execute_data, &free_op2); - if (IS_VAR == IS_VAR && UNEXPECTED(value_ptr == NULL)) { - zend_throw_error(NULL, "Cannot create references to/from string offsets"); - - HANDLE_EXCEPTION(); - } if (IS_CV == IS_VAR && UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT) && UNEXPECTED(!Z_ISREF_P(EX_VAR(opline->op1.var)))) { @@ -33912,11 +32890,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_CV_VAR_HANDLER } variable_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var); - if (IS_CV == IS_VAR && UNEXPECTED(variable_ptr == NULL)) { - zend_throw_error(NULL, "Cannot create references to/from string offsets"); - if (UNEXPECTED(free_op2)) {zval_ptr_dtor_nogc(free_op2);}; - HANDLE_EXCEPTION(); - } if ((IS_CV == IS_VAR && UNEXPECTED(variable_ptr == &EG(error_zval))) || (IS_VAR == IS_VAR && UNEXPECTED(value_ptr == &EG(error_zval)))) { variable_ptr = &EG(uninitialized_zval); @@ -34167,12 +33140,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CV_VAR_HANDLER(ZEND } else { zval *value_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, opline->op1.var); - if (IS_CV == IS_VAR && UNEXPECTED(value_ptr == NULL)) { - zend_throw_error(NULL, "Cannot yield string offsets by reference"); - zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); - HANDLE_EXCEPTION(); - } - /* If a function call result is yielded and the function did * not return by reference we throw a notice. */ if (IS_CV == IS_VAR && @@ -34281,12 +33248,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP HANDLE_EXCEPTION(); } - if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an array"); - FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); - - HANDLE_EXCEPTION(); - } dim = NULL; @@ -34307,14 +33268,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP ZEND_ASSERT(Z_TYPE(rv) == IS_INDIRECT); var_ptr = Z_INDIRECT(rv); - if (UNEXPECTED(var_ptr == NULL)) { - zend_throw_error(NULL, "Cannot use assign-op operators with string offsets"); - - FREE_OP(free_op_data1); - - HANDLE_EXCEPTION(); - } - if (UNEXPECTED(var_ptr == &EG(error_zval))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -34854,10 +33807,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_CV_UNUSED_HAN SAVE_OPLINE(); container = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var); - if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an array"); - HANDLE_EXCEPTION(); - } zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, NULL, IS_UNUSED); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -34876,10 +33825,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_RW_SPEC_CV_UNUSED_HA SAVE_OPLINE(); container = _get_zval_ptr_cv_BP_VAR_RW(execute_data, opline->op1.var); - if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an array"); - HANDLE_EXCEPTION(); - } zend_fetch_dimension_address_RW(EX_VAR(opline->result.var), container, NULL, IS_UNUSED); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -34905,11 +33850,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_UNU HANDLE_EXCEPTION(); } container = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var); - if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an array"); - - HANDLE_EXCEPTION(); - } zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, NULL, IS_UNUSED); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 1); @@ -34944,13 +33884,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_HAND SAVE_OPLINE(); object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var); - if (IS_CV == IS_VAR && UNEXPECTED(object_ptr == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an array"); - FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); - - HANDLE_EXCEPTION(); - } - if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: if (IS_UNUSED == IS_UNUSED) { @@ -35102,11 +34035,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_UNUS if ((IS_CV == IS_VAR || IS_CV == IS_CV) && UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) { expr_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, opline->op1.var); - if (IS_CV == IS_VAR && UNEXPECTED(expr_ptr == NULL)) { - zend_throw_error(NULL, "Cannot create references to/from string offsets"); - zend_array_destroy(Z_ARRVAL_P(EX_VAR(opline->result.var))); - HANDLE_EXCEPTION(); - } ZVAL_MAKE_REF(expr_ptr); Z_ADDREF_P(expr_ptr); @@ -35568,12 +34496,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CV_UNUSED_HANDLER(Z } else { zval *value_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, opline->op1.var); - if (IS_CV == IS_VAR && UNEXPECTED(value_ptr == NULL)) { - zend_throw_error(NULL, "Cannot yield string offsets by reference"); - - HANDLE_EXCEPTION(); - } - /* If a function call result is yielded and the function did * not return by reference we throw a notice. */ if (IS_CV == IS_VAR && @@ -36325,13 +35247,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); - if (IS_CV == IS_VAR && UNEXPECTED(object == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an object"); - FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); - - HANDLE_EXCEPTION(); - } - do { value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); @@ -36384,12 +35299,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP HANDLE_EXCEPTION(); } - if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an array"); - FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); - - HANDLE_EXCEPTION(); - } dim = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); @@ -36410,14 +35319,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP ZEND_ASSERT(Z_TYPE(rv) == IS_INDIRECT); var_ptr = Z_INDIRECT(rv); - if (UNEXPECTED(var_ptr == NULL)) { - zend_throw_error(NULL, "Cannot use assign-op operators with string offsets"); - - FREE_OP(free_op_data1); - - HANDLE_EXCEPTION(); - } - if (UNEXPECTED(var_ptr == &EG(error_zval))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -36450,12 +35351,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_C value = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); var_ptr = _get_zval_ptr_cv_BP_VAR_RW(execute_data, opline->op1.var); - if (IS_CV == IS_VAR && UNEXPECTED(var_ptr == NULL)) { - zend_throw_error(NULL, "Cannot use assign-op operators with string offsets"); - - HANDLE_EXCEPTION(); - } - if (IS_CV == IS_VAR && UNEXPECTED(var_ptr == &EG(error_zval))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -36734,12 +35629,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); - if (IS_CV == IS_VAR && UNEXPECTED(object == NULL)) { - zend_throw_error(NULL, "Cannot increment/decrement string offsets"); - - HANDLE_EXCEPTION(); - } - do { if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { ZVAL_DEREF(object); @@ -36814,12 +35703,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); - if (IS_CV == IS_VAR && UNEXPECTED(object == NULL)) { - zend_throw_error(NULL, "Cannot increment/decrement string offsets"); - - HANDLE_EXCEPTION(); - } - do { if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { ZVAL_DEREF(object); @@ -36894,10 +35777,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_CV_CV_HANDLER SAVE_OPLINE(); container = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var); - if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an array"); - HANDLE_EXCEPTION(); - } zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var), IS_CV); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -36916,10 +35795,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_RW_SPEC_CV_CV_HANDLE SAVE_OPLINE(); container = _get_zval_ptr_cv_BP_VAR_RW(execute_data, opline->op1.var); - if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an array"); - HANDLE_EXCEPTION(); - } zend_fetch_dimension_address_RW(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var), IS_CV); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -36959,11 +35834,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_CV_ HANDLE_EXCEPTION(); } container = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var); - if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an array"); - - HANDLE_EXCEPTION(); - } zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var), IS_CV); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 1); @@ -36994,11 +35864,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_UNSET_SPEC_CV_CV_HAN SAVE_OPLINE(); container = _get_zval_ptr_cv_BP_VAR_UNSET(execute_data, opline->op1.var); - if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an array"); - - HANDLE_EXCEPTION(); - } zend_fetch_dimension_address_UNSET(EX_VAR(opline->result.var), container, _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var), IS_CV); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -37096,11 +35961,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CV_HANDLER HANDLE_EXCEPTION(); } - if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an object"); - - HANDLE_EXCEPTION(); - } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); @@ -37127,11 +35987,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_CV_HANDLE HANDLE_EXCEPTION(); } - if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an object"); - - HANDLE_EXCEPTION(); - } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -37236,11 +36091,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CV_ zend_throw_error(NULL, "Cannot use temporary expression in write context"); - HANDLE_EXCEPTION(); - } - if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an object"); - HANDLE_EXCEPTION(); } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); @@ -37272,11 +36122,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_CV_CV_HAN property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); - if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an object"); - - HANDLE_EXCEPTION(); - } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -37304,11 +36149,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_HANDLER( property_name = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); - if (IS_CV == IS_VAR && UNEXPECTED(object == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an object"); - - HANDLE_EXCEPTION(); - } zend_assign_to_object(UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL, object, IS_CV, property_name, IS_CV, (opline+1)->op1_type, (opline+1)->op1, execute_data, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); @@ -37329,13 +36169,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_HANDLER( SAVE_OPLINE(); object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var); - if (IS_CV == IS_VAR && UNEXPECTED(object_ptr == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an array"); - FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); - - HANDLE_EXCEPTION(); - } - if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: if (IS_CV == IS_UNUSED) { @@ -37460,11 +36293,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_CV_CV_HANDLER( SAVE_OPLINE(); value_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, opline->op2.var); - if (IS_CV == IS_VAR && UNEXPECTED(value_ptr == NULL)) { - zend_throw_error(NULL, "Cannot create references to/from string offsets"); - - HANDLE_EXCEPTION(); - } if (IS_CV == IS_VAR && UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT) && UNEXPECTED(!Z_ISREF_P(EX_VAR(opline->op1.var)))) { @@ -37488,11 +36316,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_CV_CV_HANDLER( } variable_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var); - if (IS_CV == IS_VAR && UNEXPECTED(variable_ptr == NULL)) { - zend_throw_error(NULL, "Cannot create references to/from string offsets"); - - HANDLE_EXCEPTION(); - } if ((IS_CV == IS_VAR && UNEXPECTED(variable_ptr == &EG(error_zval))) || (IS_CV == IS_VAR && UNEXPECTED(value_ptr == &EG(error_zval)))) { variable_ptr = &EG(uninitialized_zval); @@ -37770,11 +36593,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CV_H if ((IS_CV == IS_VAR || IS_CV == IS_CV) && UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) { expr_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, opline->op1.var); - if (IS_CV == IS_VAR && UNEXPECTED(expr_ptr == NULL)) { - zend_throw_error(NULL, "Cannot create references to/from string offsets"); - zend_array_destroy(Z_ARRVAL_P(EX_VAR(opline->result.var))); - HANDLE_EXCEPTION(); - } ZVAL_MAKE_REF(expr_ptr); Z_ADDREF_P(expr_ptr); @@ -37906,11 +36724,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_CV_CV_HANDLER(Z HANDLE_EXCEPTION(); } - if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot unset string offsets"); - - HANDLE_EXCEPTION(); - } offset = _get_zval_ptr_cv_undef(execute_data, opline->op2.var); do { @@ -38002,11 +36815,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_CV_CV_HANDLER(Z HANDLE_EXCEPTION(); } - if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot unset string offsets"); - - HANDLE_EXCEPTION(); - } offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); do { @@ -38256,12 +37064,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CV_CV_HANDLER(ZEND_ } else { zval *value_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, opline->op1.var); - if (IS_CV == IS_VAR && UNEXPECTED(value_ptr == NULL)) { - zend_throw_error(NULL, "Cannot yield string offsets by reference"); - - HANDLE_EXCEPTION(); - } - /* If a function call result is yielded and the function did * not return by reference we throw a notice. */ if (IS_CV == IS_VAR && @@ -38977,13 +37779,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); - if (IS_CV == IS_VAR && UNEXPECTED(object == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an object"); - FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); - zval_ptr_dtor_nogc(free_op2); - HANDLE_EXCEPTION(); - } - do { value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); @@ -39036,12 +37831,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); HANDLE_EXCEPTION(); } - if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an array"); - FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); - zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); - HANDLE_EXCEPTION(); - } dim = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); @@ -39062,14 +37851,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP ZEND_ASSERT(Z_TYPE(rv) == IS_INDIRECT); var_ptr = Z_INDIRECT(rv); - if (UNEXPECTED(var_ptr == NULL)) { - zend_throw_error(NULL, "Cannot use assign-op operators with string offsets"); - zval_ptr_dtor_nogc(free_op2); - FREE_OP(free_op_data1); - - HANDLE_EXCEPTION(); - } - if (UNEXPECTED(var_ptr == &EG(error_zval))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -39103,12 +37884,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_C value = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); var_ptr = _get_zval_ptr_cv_BP_VAR_RW(execute_data, opline->op1.var); - if (IS_CV == IS_VAR && UNEXPECTED(var_ptr == NULL)) { - zend_throw_error(NULL, "Cannot use assign-op operators with string offsets"); - zval_ptr_dtor_nogc(free_op2); - HANDLE_EXCEPTION(); - } - if (IS_CV == IS_VAR && UNEXPECTED(var_ptr == &EG(error_zval))) { if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -39388,12 +38163,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); - if (IS_CV == IS_VAR && UNEXPECTED(object == NULL)) { - zend_throw_error(NULL, "Cannot increment/decrement string offsets"); - zval_ptr_dtor_nogc(free_op2); - HANDLE_EXCEPTION(); - } - do { if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { ZVAL_DEREF(object); @@ -39469,12 +38238,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); - if (IS_CV == IS_VAR && UNEXPECTED(object == NULL)) { - zend_throw_error(NULL, "Cannot increment/decrement string offsets"); - zval_ptr_dtor_nogc(free_op2); - HANDLE_EXCEPTION(); - } - do { if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { ZVAL_DEREF(object); @@ -39550,10 +38313,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_CV_TMPVAR_HAN SAVE_OPLINE(); container = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var); - if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an array"); - HANDLE_EXCEPTION(); - } zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2), (IS_TMP_VAR|IS_VAR)); zval_ptr_dtor_nogc(free_op2); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -39572,10 +38331,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_RW_SPEC_CV_TMPVAR_HA SAVE_OPLINE(); container = _get_zval_ptr_cv_BP_VAR_RW(execute_data, opline->op1.var); - if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an array"); - HANDLE_EXCEPTION(); - } zend_fetch_dimension_address_RW(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2), (IS_TMP_VAR|IS_VAR)); zval_ptr_dtor_nogc(free_op2); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -39615,11 +38370,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_TMP HANDLE_EXCEPTION(); } container = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var); - if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an array"); - zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); - HANDLE_EXCEPTION(); - } zend_fetch_dimension_address_W(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2), (IS_TMP_VAR|IS_VAR)); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var), 1); @@ -39650,11 +38400,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_UNSET_SPEC_CV_TMPVAR SAVE_OPLINE(); container = _get_zval_ptr_cv_BP_VAR_UNSET(execute_data, opline->op1.var); - if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an array"); - zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); - HANDLE_EXCEPTION(); - } zend_fetch_dimension_address_UNSET(EX_VAR(opline->result.var), container, _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2), (IS_TMP_VAR|IS_VAR)); zval_ptr_dtor_nogc(free_op2); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -39753,11 +38498,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_TMPVAR_HAN zval_ptr_dtor_nogc(free_op2); HANDLE_EXCEPTION(); } - if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an object"); - zval_ptr_dtor_nogc(free_op2); - HANDLE_EXCEPTION(); - } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); zval_ptr_dtor_nogc(free_op2); @@ -39784,11 +38524,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_RW_SPEC_CV_TMPVAR_HA zval_ptr_dtor_nogc(free_op2); HANDLE_EXCEPTION(); } - if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an object"); - zval_ptr_dtor_nogc(free_op2); - HANDLE_EXCEPTION(); - } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_RW); zval_ptr_dtor_nogc(free_op2); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -39896,11 +38631,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_TMP HANDLE_EXCEPTION(); } - if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an object"); - zval_ptr_dtor_nogc(free_op2); - HANDLE_EXCEPTION(); - } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); zval_ptr_dtor_nogc(free_op2); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -39930,11 +38660,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_UNSET_SPEC_CV_TMPVAR property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); - if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an object"); - zval_ptr_dtor_nogc(free_op2); - HANDLE_EXCEPTION(); - } zend_fetch_property_address(EX_VAR(opline->result.var), container, IS_CV, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_UNSET); zval_ptr_dtor_nogc(free_op2); if (IS_CV == IS_VAR && READY_TO_DESTROY(free_op1)) { @@ -39962,11 +38687,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_HAND property_name = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); - if (IS_CV == IS_VAR && UNEXPECTED(object == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an object"); - zval_ptr_dtor_nogc(free_op2); - HANDLE_EXCEPTION(); - } zend_assign_to_object(UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL, object, IS_CV, property_name, (IS_TMP_VAR|IS_VAR), (opline+1)->op1_type, (opline+1)->op1, execute_data, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); zval_ptr_dtor_nogc(free_op2); @@ -39987,13 +38707,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_HAND SAVE_OPLINE(); object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var); - if (IS_CV == IS_VAR && UNEXPECTED(object_ptr == NULL)) { - zend_throw_error(NULL, "Cannot use string offset as an array"); - FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); - zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); - HANDLE_EXCEPTION(); - } - if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) { @@ -40343,11 +39056,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_TMPV if ((IS_CV == IS_VAR || IS_CV == IS_CV) && UNEXPECTED(opline->extended_value & ZEND_ARRAY_ELEMENT_REF)) { expr_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, opline->op1.var); - if (IS_CV == IS_VAR && UNEXPECTED(expr_ptr == NULL)) { - zend_throw_error(NULL, "Cannot create references to/from string offsets"); - zend_array_destroy(Z_ARRVAL_P(EX_VAR(opline->result.var))); - HANDLE_EXCEPTION(); - } ZVAL_MAKE_REF(expr_ptr); Z_ADDREF_P(expr_ptr); @@ -40479,11 +39187,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_DIM_SPEC_CV_TMPVAR_HANDL zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); HANDLE_EXCEPTION(); } - if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot unset string offsets"); - zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); - HANDLE_EXCEPTION(); - } offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); do { @@ -40576,11 +39279,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_OBJ_SPEC_CV_TMPVAR_HANDL zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); HANDLE_EXCEPTION(); } - if (IS_CV == IS_VAR && UNEXPECTED(container == NULL)) { - zend_throw_error(NULL, "Cannot unset string offsets"); - zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); - HANDLE_EXCEPTION(); - } offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); do { -- 2.40.0