if (!obj || Z_TYPE_P(obj) != IS_OBJECT) {
zend_error_noreturn(E_ERROR, "__clone method called on non-object");
- EX_T(opline->result.u.var).var.ptr = EG(error_zval_ptr);
- Z_ADDREF_P(EX_T(opline->result.u.var).var.ptr);
-
- ZEND_VM_NEXT_OPCODE();
}
ce = Z_OBJCE_P(obj);
} else {
zend_error_noreturn(E_ERROR, "Trying to clone an uncloneable object");
}
- EX_T(opline->result.u.var).var.ptr = EG(error_zval_ptr);
- Z_ADDREF_P(EX_T(opline->result.u.var).var.ptr);
}
if (ce && clone) {
if (!obj || Z_TYPE_P(obj) != IS_OBJECT) {
zend_error_noreturn(E_ERROR, "__clone method called on non-object");
- EX_T(opline->result.u.var).var.ptr = EG(error_zval_ptr);
- Z_ADDREF_P(EX_T(opline->result.u.var).var.ptr);
-
- ZEND_VM_NEXT_OPCODE();
}
ce = Z_OBJCE_P(obj);
} else {
zend_error_noreturn(E_ERROR, "Trying to clone an uncloneable object");
}
- EX_T(opline->result.u.var).var.ptr = EG(error_zval_ptr);
- Z_ADDREF_P(EX_T(opline->result.u.var).var.ptr);
}
if (ce && clone) {
if (IS_VAR == IS_VAR && !var_ptr) {
zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
}
- if (*var_ptr == EG(error_zval_ptr)) {
+ if (IS_VAR == IS_VAR && *var_ptr == EG(error_zval_ptr)) {
if (!RETURN_VALUE_UNUSED(&opline->result)) {
AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
PZVAL_LOCK(EG(uninitialized_zval_ptr));
if (IS_VAR == IS_VAR && !var_ptr) {
zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
}
- if (*var_ptr == EG(error_zval_ptr)) {
+ if (IS_VAR == IS_VAR && *var_ptr == EG(error_zval_ptr)) {
if (!RETURN_VALUE_UNUSED(&opline->result)) {
AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
PZVAL_LOCK(EG(uninitialized_zval_ptr));
if (IS_VAR == IS_VAR && !var_ptr) {
zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
}
- if (*var_ptr == EG(error_zval_ptr)) {
+ if (IS_VAR == IS_VAR && *var_ptr == EG(error_zval_ptr)) {
if (!RETURN_VALUE_UNUSED(&opline->result)) {
EX_T(opline->result.u.var).tmp_var = *EG(uninitialized_zval_ptr);
}
if (IS_VAR == IS_VAR && !var_ptr) {
zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
}
- if (*var_ptr == EG(error_zval_ptr)) {
+ if (IS_VAR == IS_VAR && *var_ptr == EG(error_zval_ptr)) {
if (!RETURN_VALUE_UNUSED(&opline->result)) {
EX_T(opline->result.u.var).tmp_var = *EG(uninitialized_zval_ptr);
}
if (!obj || Z_TYPE_P(obj) != IS_OBJECT) {
zend_error_noreturn(E_ERROR, "__clone method called on non-object");
- EX_T(opline->result.u.var).var.ptr = EG(error_zval_ptr);
- Z_ADDREF_P(EX_T(opline->result.u.var).var.ptr);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
- ZEND_VM_NEXT_OPCODE();
}
ce = Z_OBJCE_P(obj);
} else {
zend_error_noreturn(E_ERROR, "Trying to clone an uncloneable object");
}
- EX_T(opline->result.u.var).var.ptr = EG(error_zval_ptr);
- Z_ADDREF_P(EX_T(opline->result.u.var).var.ptr);
}
if (ce && clone) {
znode *result = &opline->result;
int have_get_ptr = 0;
+ if (IS_VAR == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ }
+
make_real_object(object_ptr TSRMLS_CC);
object = *object_ptr;
if (!have_get_ptr) {
zval *z = NULL;
- switch (opline->extended_value) {
- case ZEND_ASSIGN_OBJ:
- if (Z_OBJ_HT_P(object)->read_property) {
- z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R TSRMLS_CC);
- }
- break;
- case ZEND_ASSIGN_DIM:
- if (Z_OBJ_HT_P(object)->read_dimension) {
- z = Z_OBJ_HT_P(object)->read_dimension(object, property, BP_VAR_R TSRMLS_CC);
- }
- break;
+ if (opline->extended_value == ZEND_ASSIGN_OBJ) {
+ if (Z_OBJ_HT_P(object)->read_property) {
+ z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R TSRMLS_CC);
+ }
+ } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
+ if (Z_OBJ_HT_P(object)->read_dimension) {
+ z = Z_OBJ_HT_P(object)->read_dimension(object, property, BP_VAR_R TSRMLS_CC);
+ }
}
if (z) {
if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
Z_ADDREF_P(z);
SEPARATE_ZVAL_IF_NOT_REF(&z);
binary_op(z, z, value TSRMLS_CC);
- switch (opline->extended_value) {
- case ZEND_ASSIGN_OBJ:
- Z_OBJ_HT_P(object)->write_property(object, property, z TSRMLS_CC);
- break;
- case ZEND_ASSIGN_DIM:
- Z_OBJ_HT_P(object)->write_dimension(object, property, z TSRMLS_CC);
- break;
+ if (opline->extended_value == ZEND_ASSIGN_OBJ) {
+ Z_OBJ_HT_P(object)->write_property(object, property, z TSRMLS_CC);
+ } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
+ Z_OBJ_HT_P(object)->write_dimension(object, property, z TSRMLS_CC);
}
if (!RETURN_VALUE_UNUSED(result)) {
EX_T(result->u.var).var.ptr = z;
zend_free_op free_op1, free_op_data2, free_op_data1;
zval **var_ptr;
zval *value;
- zend_bool increment_opline = 0;
switch (opline->extended_value) {
case ZEND_ASSIGN_OBJ:
return zend_binary_assign_op_obj_helper_SPEC_VAR_CONST(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
break;
case ZEND_ASSIGN_DIM: {
- zval **object_ptr = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
+ zval **container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
- if (object_ptr && IS_VAR != IS_CV && !(free_op1.var != NULL)) {
- Z_ADDREF_PP(object_ptr); /* undo the effect of get_obj_zval_ptr_ptr() */
- }
-
- if (object_ptr && Z_TYPE_PP(object_ptr) == IS_OBJECT) {
+ if (IS_VAR == IS_VAR && !container) {
+ zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ } else if (Z_TYPE_PP(container) == IS_OBJECT) {
+ if (IS_VAR == IS_VAR && !(free_op1.var != NULL)) {
+ Z_ADDREF_PP(container); /* undo the effect of get_obj_zval_ptr_ptr() */
+ }
return zend_binary_assign_op_obj_helper_SPEC_VAR_CONST(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
} else {
zend_op *op_data = opline+1;
zval *dim = &opline->op2.u.constant;
- zval **container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
- if (IS_VAR == IS_VAR && !container) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
- }
zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), container, dim, 0, BP_VAR_RW TSRMLS_CC);
value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
var_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
- increment_opline = 1;
+ ZEND_VM_INC_OPCODE();
}
}
break;
}
if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
- if (increment_opline) {
- ZEND_VM_INC_OPCODE();
- }
ZEND_VM_NEXT_OPCODE();
}
PZVAL_LOCK(*var_ptr);
}
- if (increment_opline) {
- ZEND_VM_INC_OPCODE();
+ if (opline->extended_value == ZEND_ASSIGN_DIM) {
FREE_OP(free_op_data1);
FREE_OP_VAR_PTR(free_op_data2);
}
zval **retval = &EX_T(opline->result.u.var).var.ptr;
int have_get_ptr = 0;
+ if (IS_VAR == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ }
+
make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
object = *object_ptr;
zval *retval = &EX_T(opline->result.u.var).tmp_var;
int have_get_ptr = 0;
+ if (IS_VAR == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ }
+
make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
object = *object_ptr;
zval *offset = &opline->op2.u.constant;
- if (container == EG(error_zval_ptr)) {
- if (!RETURN_VALUE_UNUSED(&opline->result)) {
- AI_SET_PTR(EX_T(opline->result.u.var).var, EG(error_zval_ptr));
- PZVAL_LOCK(EG(error_zval_ptr));
- }
-
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
- ZEND_VM_NEXT_OPCODE();
- }
-
-
if (Z_TYPE_P(container) != IS_OBJECT || !Z_OBJ_HT_P(container)->read_property) {
if (type != BP_VAR_IS) {
zend_error(E_NOTICE, "Trying to get property of non-object");
zend_op *opline = EX(opline);
zend_op *op_data = opline+1;
zend_free_op free_op1;
- zval **object_ptr;
+ zval **object_ptr = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
- if (IS_VAR == IS_CV || EX_T(opline->op1.u.var).var.ptr_ptr) {
- /* not an array offset */
- object_ptr = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
- } else {
- object_ptr = NULL;
+ if (IS_VAR == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
}
-
- if (object_ptr && Z_TYPE_PP(object_ptr) == IS_OBJECT) {
+ if (Z_TYPE_PP(object_ptr) == IS_OBJECT) {
zval *property_name = &opline->op2.u.constant;
zval *dim = &opline->op2.u.constant;
zval **variable_ptr_ptr;
- if (IS_VAR == IS_VAR && !object_ptr) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
- }
zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), object_ptr, dim, 0, BP_VAR_W TSRMLS_CC);
value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
zval *value = &opline->op2.u.constant;
zval **variable_ptr_ptr = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
- if (!variable_ptr_ptr) {
+ if (IS_VAR == IS_VAR && !variable_ptr_ptr) {
if (zend_assign_to_string_offset(&EX_T(opline->op1.u.var), value, IS_CONST TSRMLS_CC)) {
if (!RETURN_VALUE_UNUSED(&opline->result)) {
EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
zval *offset = &opline->op2.u.constant;
long index;
- if (container) {
+ if (IS_VAR != IS_VAR || container) {
if (IS_VAR == IS_CV && container != &EG(uninitialized_zval_ptr)) {
SEPARATE_ZVAL_IF_NOT_REF(container);
}
zval **container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
zval *offset = &opline->op2.u.constant;
- if (container) {
+ if (IS_VAR != IS_VAR || container) {
if (IS_VAR == IS_CV && container != &EG(uninitialized_zval_ptr)) {
SEPARATE_ZVAL_IF_NOT_REF(container);
}
int result = 0;
long index;
- if (container) {
+ if (IS_VAR != IS_VAR || container) {
zval *offset = &opline->op2.u.constant;
znode *result = &opline->result;
int have_get_ptr = 0;
+ if (IS_VAR == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ }
+
make_real_object(object_ptr TSRMLS_CC);
object = *object_ptr;
if (!have_get_ptr) {
zval *z = NULL;
- switch (opline->extended_value) {
- case ZEND_ASSIGN_OBJ:
- if (Z_OBJ_HT_P(object)->read_property) {
- z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R TSRMLS_CC);
- }
- break;
- case ZEND_ASSIGN_DIM:
- if (Z_OBJ_HT_P(object)->read_dimension) {
- z = Z_OBJ_HT_P(object)->read_dimension(object, property, BP_VAR_R TSRMLS_CC);
- }
- break;
+ if (opline->extended_value == ZEND_ASSIGN_OBJ) {
+ if (Z_OBJ_HT_P(object)->read_property) {
+ z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R TSRMLS_CC);
+ }
+ } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
+ if (Z_OBJ_HT_P(object)->read_dimension) {
+ z = Z_OBJ_HT_P(object)->read_dimension(object, property, BP_VAR_R TSRMLS_CC);
+ }
}
if (z) {
if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
Z_ADDREF_P(z);
SEPARATE_ZVAL_IF_NOT_REF(&z);
binary_op(z, z, value TSRMLS_CC);
- switch (opline->extended_value) {
- case ZEND_ASSIGN_OBJ:
- Z_OBJ_HT_P(object)->write_property(object, property, z TSRMLS_CC);
- break;
- case ZEND_ASSIGN_DIM:
- Z_OBJ_HT_P(object)->write_dimension(object, property, z TSRMLS_CC);
- break;
+ if (opline->extended_value == ZEND_ASSIGN_OBJ) {
+ Z_OBJ_HT_P(object)->write_property(object, property, z TSRMLS_CC);
+ } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
+ Z_OBJ_HT_P(object)->write_dimension(object, property, z TSRMLS_CC);
}
if (!RETURN_VALUE_UNUSED(result)) {
EX_T(result->u.var).var.ptr = z;
zend_free_op free_op1, free_op2, free_op_data2, free_op_data1;
zval **var_ptr;
zval *value;
- zend_bool increment_opline = 0;
switch (opline->extended_value) {
case ZEND_ASSIGN_OBJ:
return zend_binary_assign_op_obj_helper_SPEC_VAR_TMP(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
break;
case ZEND_ASSIGN_DIM: {
- zval **object_ptr = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
-
- if (object_ptr && IS_VAR != IS_CV && !(free_op1.var != NULL)) {
- Z_ADDREF_PP(object_ptr); /* undo the effect of get_obj_zval_ptr_ptr() */
- }
+ zval **container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
- if (object_ptr && Z_TYPE_PP(object_ptr) == IS_OBJECT) {
+ if (IS_VAR == IS_VAR && !container) {
+ zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ } else if (Z_TYPE_PP(container) == IS_OBJECT) {
+ if (IS_VAR == IS_VAR && !(free_op1.var != NULL)) {
+ Z_ADDREF_PP(container); /* undo the effect of get_obj_zval_ptr_ptr() */
+ }
return zend_binary_assign_op_obj_helper_SPEC_VAR_TMP(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
} else {
zend_op *op_data = opline+1;
zval *dim = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
- zval **container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
- if (IS_VAR == IS_VAR && !container) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
- }
zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), container, dim, 1, BP_VAR_RW TSRMLS_CC);
value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
var_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
- increment_opline = 1;
+ ZEND_VM_INC_OPCODE();
}
}
break;
}
zval_dtor(free_op2.var);
if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
- if (increment_opline) {
- ZEND_VM_INC_OPCODE();
- }
ZEND_VM_NEXT_OPCODE();
}
}
zval_dtor(free_op2.var);
- if (increment_opline) {
- ZEND_VM_INC_OPCODE();
+ if (opline->extended_value == ZEND_ASSIGN_DIM) {
FREE_OP(free_op_data1);
FREE_OP_VAR_PTR(free_op_data2);
}
zval **retval = &EX_T(opline->result.u.var).var.ptr;
int have_get_ptr = 0;
+ if (IS_VAR == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ }
+
make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
object = *object_ptr;
zval *retval = &EX_T(opline->result.u.var).tmp_var;
int have_get_ptr = 0;
+ if (IS_VAR == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ }
+
make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
object = *object_ptr;
zend_free_op free_op2;
zval *offset = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
- if (container == EG(error_zval_ptr)) {
- if (!RETURN_VALUE_UNUSED(&opline->result)) {
- AI_SET_PTR(EX_T(opline->result.u.var).var, EG(error_zval_ptr));
- PZVAL_LOCK(EG(error_zval_ptr));
- }
- zval_dtor(free_op2.var);
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
- ZEND_VM_NEXT_OPCODE();
- }
-
-
if (Z_TYPE_P(container) != IS_OBJECT || !Z_OBJ_HT_P(container)->read_property) {
if (type != BP_VAR_IS) {
zend_error(E_NOTICE, "Trying to get property of non-object");
zend_op *opline = EX(opline);
zend_op *op_data = opline+1;
zend_free_op free_op1;
- zval **object_ptr;
+ zval **object_ptr = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
- if (IS_VAR == IS_CV || EX_T(opline->op1.u.var).var.ptr_ptr) {
- /* not an array offset */
- object_ptr = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
- } else {
- object_ptr = NULL;
+ if (IS_VAR == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
}
-
- if (object_ptr && Z_TYPE_PP(object_ptr) == IS_OBJECT) {
+ if (Z_TYPE_PP(object_ptr) == IS_OBJECT) {
zend_free_op free_op2;
zval *property_name = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
zval *dim = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
zval **variable_ptr_ptr;
- if (IS_VAR == IS_VAR && !object_ptr) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
- }
zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), object_ptr, dim, 1, BP_VAR_W TSRMLS_CC);
zval_dtor(free_op2.var);
zval *value = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
zval **variable_ptr_ptr = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
- if (!variable_ptr_ptr) {
+ if (IS_VAR == IS_VAR && !variable_ptr_ptr) {
if (zend_assign_to_string_offset(&EX_T(opline->op1.u.var), value, IS_TMP_VAR TSRMLS_CC)) {
if (!RETURN_VALUE_UNUSED(&opline->result)) {
EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
zval *offset = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
long index;
- if (container) {
+ if (IS_VAR != IS_VAR || container) {
if (IS_VAR == IS_CV && container != &EG(uninitialized_zval_ptr)) {
SEPARATE_ZVAL_IF_NOT_REF(container);
}
zval **container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
zval *offset = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
- if (container) {
+ if (IS_VAR != IS_VAR || container) {
if (IS_VAR == IS_CV && container != &EG(uninitialized_zval_ptr)) {
SEPARATE_ZVAL_IF_NOT_REF(container);
}
int result = 0;
long index;
- if (container) {
+ if (IS_VAR != IS_VAR || container) {
zend_free_op free_op2;
zval *offset = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
znode *result = &opline->result;
int have_get_ptr = 0;
+ if (IS_VAR == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ }
+
make_real_object(object_ptr TSRMLS_CC);
object = *object_ptr;
if (!have_get_ptr) {
zval *z = NULL;
- switch (opline->extended_value) {
- case ZEND_ASSIGN_OBJ:
- if (Z_OBJ_HT_P(object)->read_property) {
- z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R TSRMLS_CC);
- }
- break;
- case ZEND_ASSIGN_DIM:
- if (Z_OBJ_HT_P(object)->read_dimension) {
- z = Z_OBJ_HT_P(object)->read_dimension(object, property, BP_VAR_R TSRMLS_CC);
- }
- break;
+ if (opline->extended_value == ZEND_ASSIGN_OBJ) {
+ if (Z_OBJ_HT_P(object)->read_property) {
+ z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R TSRMLS_CC);
+ }
+ } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
+ if (Z_OBJ_HT_P(object)->read_dimension) {
+ z = Z_OBJ_HT_P(object)->read_dimension(object, property, BP_VAR_R TSRMLS_CC);
+ }
}
if (z) {
if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
Z_ADDREF_P(z);
SEPARATE_ZVAL_IF_NOT_REF(&z);
binary_op(z, z, value TSRMLS_CC);
- switch (opline->extended_value) {
- case ZEND_ASSIGN_OBJ:
- Z_OBJ_HT_P(object)->write_property(object, property, z TSRMLS_CC);
- break;
- case ZEND_ASSIGN_DIM:
- Z_OBJ_HT_P(object)->write_dimension(object, property, z TSRMLS_CC);
- break;
+ if (opline->extended_value == ZEND_ASSIGN_OBJ) {
+ Z_OBJ_HT_P(object)->write_property(object, property, z TSRMLS_CC);
+ } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
+ Z_OBJ_HT_P(object)->write_dimension(object, property, z TSRMLS_CC);
}
if (!RETURN_VALUE_UNUSED(result)) {
EX_T(result->u.var).var.ptr = z;
zend_free_op free_op1, free_op2, free_op_data2, free_op_data1;
zval **var_ptr;
zval *value;
- zend_bool increment_opline = 0;
switch (opline->extended_value) {
case ZEND_ASSIGN_OBJ:
return zend_binary_assign_op_obj_helper_SPEC_VAR_VAR(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
break;
case ZEND_ASSIGN_DIM: {
- zval **object_ptr = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
+ zval **container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
- if (object_ptr && IS_VAR != IS_CV && !(free_op1.var != NULL)) {
- Z_ADDREF_PP(object_ptr); /* undo the effect of get_obj_zval_ptr_ptr() */
- }
-
- if (object_ptr && Z_TYPE_PP(object_ptr) == IS_OBJECT) {
+ if (IS_VAR == IS_VAR && !container) {
+ zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ } else if (Z_TYPE_PP(container) == IS_OBJECT) {
+ if (IS_VAR == IS_VAR && !(free_op1.var != NULL)) {
+ Z_ADDREF_PP(container); /* undo the effect of get_obj_zval_ptr_ptr() */
+ }
return zend_binary_assign_op_obj_helper_SPEC_VAR_VAR(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
} else {
zend_op *op_data = opline+1;
zval *dim = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
- zval **container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
- if (IS_VAR == IS_VAR && !container) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
- }
zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), container, dim, 0, BP_VAR_RW TSRMLS_CC);
value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
var_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
- increment_opline = 1;
+ ZEND_VM_INC_OPCODE();
}
}
break;
}
if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
- if (increment_opline) {
- ZEND_VM_INC_OPCODE();
- }
ZEND_VM_NEXT_OPCODE();
}
}
if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
- if (increment_opline) {
- ZEND_VM_INC_OPCODE();
+ if (opline->extended_value == ZEND_ASSIGN_DIM) {
FREE_OP(free_op_data1);
FREE_OP_VAR_PTR(free_op_data2);
}
zval **retval = &EX_T(opline->result.u.var).var.ptr;
int have_get_ptr = 0;
+ if (IS_VAR == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ }
+
make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
object = *object_ptr;
zval *retval = &EX_T(opline->result.u.var).tmp_var;
int have_get_ptr = 0;
+ if (IS_VAR == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ }
+
make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
object = *object_ptr;
zend_free_op free_op2;
zval *offset = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
- if (container == EG(error_zval_ptr)) {
- if (!RETURN_VALUE_UNUSED(&opline->result)) {
- AI_SET_PTR(EX_T(opline->result.u.var).var, EG(error_zval_ptr));
- PZVAL_LOCK(EG(error_zval_ptr));
- }
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
- ZEND_VM_NEXT_OPCODE();
- }
-
-
if (Z_TYPE_P(container) != IS_OBJECT || !Z_OBJ_HT_P(container)->read_property) {
if (type != BP_VAR_IS) {
zend_error(E_NOTICE, "Trying to get property of non-object");
zend_op *opline = EX(opline);
zend_op *op_data = opline+1;
zend_free_op free_op1;
- zval **object_ptr;
+ zval **object_ptr = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
- if (IS_VAR == IS_CV || EX_T(opline->op1.u.var).var.ptr_ptr) {
- /* not an array offset */
- object_ptr = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
- } else {
- object_ptr = NULL;
+ if (IS_VAR == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
}
-
- if (object_ptr && Z_TYPE_PP(object_ptr) == IS_OBJECT) {
+ if (Z_TYPE_PP(object_ptr) == IS_OBJECT) {
zend_free_op free_op2;
zval *property_name = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
zval *dim = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
zval **variable_ptr_ptr;
- if (IS_VAR == IS_VAR && !object_ptr) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
- }
zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), object_ptr, dim, 0, BP_VAR_W TSRMLS_CC);
if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
zval *value = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
zval **variable_ptr_ptr = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
- if (!variable_ptr_ptr) {
+ if (IS_VAR == IS_VAR && !variable_ptr_ptr) {
if (zend_assign_to_string_offset(&EX_T(opline->op1.u.var), value, IS_VAR TSRMLS_CC)) {
if (!RETURN_VALUE_UNUSED(&opline->result)) {
EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
zval *offset = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
long index;
- if (container) {
+ if (IS_VAR != IS_VAR || container) {
if (IS_VAR == IS_CV && container != &EG(uninitialized_zval_ptr)) {
SEPARATE_ZVAL_IF_NOT_REF(container);
}
zval **container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
zval *offset = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
- if (container) {
+ if (IS_VAR != IS_VAR || container) {
if (IS_VAR == IS_CV && container != &EG(uninitialized_zval_ptr)) {
SEPARATE_ZVAL_IF_NOT_REF(container);
}
int result = 0;
long index;
- if (container) {
+ if (IS_VAR != IS_VAR || container) {
zend_free_op free_op2;
zval *offset = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
znode *result = &opline->result;
int have_get_ptr = 0;
+ if (IS_VAR == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ }
+
make_real_object(object_ptr TSRMLS_CC);
object = *object_ptr;
if (!have_get_ptr) {
zval *z = NULL;
- switch (opline->extended_value) {
- case ZEND_ASSIGN_OBJ:
- if (Z_OBJ_HT_P(object)->read_property) {
- z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R TSRMLS_CC);
- }
- break;
- case ZEND_ASSIGN_DIM:
- if (Z_OBJ_HT_P(object)->read_dimension) {
- z = Z_OBJ_HT_P(object)->read_dimension(object, property, BP_VAR_R TSRMLS_CC);
- }
- break;
+ if (opline->extended_value == ZEND_ASSIGN_OBJ) {
+ if (Z_OBJ_HT_P(object)->read_property) {
+ z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R TSRMLS_CC);
+ }
+ } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
+ if (Z_OBJ_HT_P(object)->read_dimension) {
+ z = Z_OBJ_HT_P(object)->read_dimension(object, property, BP_VAR_R TSRMLS_CC);
+ }
}
if (z) {
if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
Z_ADDREF_P(z);
SEPARATE_ZVAL_IF_NOT_REF(&z);
binary_op(z, z, value TSRMLS_CC);
- switch (opline->extended_value) {
- case ZEND_ASSIGN_OBJ:
- Z_OBJ_HT_P(object)->write_property(object, property, z TSRMLS_CC);
- break;
- case ZEND_ASSIGN_DIM:
- Z_OBJ_HT_P(object)->write_dimension(object, property, z TSRMLS_CC);
- break;
+ if (opline->extended_value == ZEND_ASSIGN_OBJ) {
+ Z_OBJ_HT_P(object)->write_property(object, property, z TSRMLS_CC);
+ } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
+ Z_OBJ_HT_P(object)->write_dimension(object, property, z TSRMLS_CC);
}
if (!RETURN_VALUE_UNUSED(result)) {
EX_T(result->u.var).var.ptr = z;
zend_free_op free_op1, free_op_data2, free_op_data1;
zval **var_ptr;
zval *value;
- zend_bool increment_opline = 0;
switch (opline->extended_value) {
case ZEND_ASSIGN_OBJ:
return zend_binary_assign_op_obj_helper_SPEC_VAR_UNUSED(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
break;
case ZEND_ASSIGN_DIM: {
- zval **object_ptr = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
-
- if (object_ptr && IS_VAR != IS_CV && !(free_op1.var != NULL)) {
- Z_ADDREF_PP(object_ptr); /* undo the effect of get_obj_zval_ptr_ptr() */
- }
+ zval **container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
- if (object_ptr && Z_TYPE_PP(object_ptr) == IS_OBJECT) {
+ if (IS_VAR == IS_VAR && !container) {
+ zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ } else if (Z_TYPE_PP(container) == IS_OBJECT) {
+ if (IS_VAR == IS_VAR && !(free_op1.var != NULL)) {
+ Z_ADDREF_PP(container); /* undo the effect of get_obj_zval_ptr_ptr() */
+ }
return zend_binary_assign_op_obj_helper_SPEC_VAR_UNUSED(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
} else {
zend_op *op_data = opline+1;
zval *dim = NULL;
- zval **container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
- if (IS_VAR == IS_VAR && !container) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
- }
zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), container, dim, 0, BP_VAR_RW TSRMLS_CC);
value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
var_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
- increment_opline = 1;
+ ZEND_VM_INC_OPCODE();
}
}
break;
}
if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
- if (increment_opline) {
- ZEND_VM_INC_OPCODE();
- }
ZEND_VM_NEXT_OPCODE();
}
PZVAL_LOCK(*var_ptr);
}
- if (increment_opline) {
- ZEND_VM_INC_OPCODE();
+ if (opline->extended_value == ZEND_ASSIGN_DIM) {
FREE_OP(free_op_data1);
FREE_OP_VAR_PTR(free_op_data2);
}
zend_op *opline = EX(opline);
zend_op *op_data = opline+1;
zend_free_op free_op1;
- zval **object_ptr;
+ zval **object_ptr = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
- if (IS_VAR == IS_CV || EX_T(opline->op1.u.var).var.ptr_ptr) {
- /* not an array offset */
- object_ptr = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
- } else {
- object_ptr = NULL;
+ if (IS_VAR == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
}
-
- if (object_ptr && Z_TYPE_PP(object_ptr) == IS_OBJECT) {
+ if (Z_TYPE_PP(object_ptr) == IS_OBJECT) {
zval *property_name = NULL;
zval *dim = NULL;
zval **variable_ptr_ptr;
- if (IS_VAR == IS_VAR && !object_ptr) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
- }
zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), object_ptr, dim, 0, BP_VAR_W TSRMLS_CC);
value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
znode *result = &opline->result;
int have_get_ptr = 0;
+ if (IS_VAR == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ }
+
make_real_object(object_ptr TSRMLS_CC);
object = *object_ptr;
if (!have_get_ptr) {
zval *z = NULL;
- switch (opline->extended_value) {
- case ZEND_ASSIGN_OBJ:
- if (Z_OBJ_HT_P(object)->read_property) {
- z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R TSRMLS_CC);
- }
- break;
- case ZEND_ASSIGN_DIM:
- if (Z_OBJ_HT_P(object)->read_dimension) {
- z = Z_OBJ_HT_P(object)->read_dimension(object, property, BP_VAR_R TSRMLS_CC);
- }
- break;
+ if (opline->extended_value == ZEND_ASSIGN_OBJ) {
+ if (Z_OBJ_HT_P(object)->read_property) {
+ z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R TSRMLS_CC);
+ }
+ } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
+ if (Z_OBJ_HT_P(object)->read_dimension) {
+ z = Z_OBJ_HT_P(object)->read_dimension(object, property, BP_VAR_R TSRMLS_CC);
+ }
}
if (z) {
if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
Z_ADDREF_P(z);
SEPARATE_ZVAL_IF_NOT_REF(&z);
binary_op(z, z, value TSRMLS_CC);
- switch (opline->extended_value) {
- case ZEND_ASSIGN_OBJ:
- Z_OBJ_HT_P(object)->write_property(object, property, z TSRMLS_CC);
- break;
- case ZEND_ASSIGN_DIM:
- Z_OBJ_HT_P(object)->write_dimension(object, property, z TSRMLS_CC);
- break;
+ if (opline->extended_value == ZEND_ASSIGN_OBJ) {
+ Z_OBJ_HT_P(object)->write_property(object, property, z TSRMLS_CC);
+ } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
+ Z_OBJ_HT_P(object)->write_dimension(object, property, z TSRMLS_CC);
}
if (!RETURN_VALUE_UNUSED(result)) {
EX_T(result->u.var).var.ptr = z;
zend_free_op free_op1, free_op_data2, free_op_data1;
zval **var_ptr;
zval *value;
- zend_bool increment_opline = 0;
switch (opline->extended_value) {
case ZEND_ASSIGN_OBJ:
return zend_binary_assign_op_obj_helper_SPEC_VAR_CV(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
break;
case ZEND_ASSIGN_DIM: {
- zval **object_ptr = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
+ zval **container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
- if (object_ptr && IS_VAR != IS_CV && !(free_op1.var != NULL)) {
- Z_ADDREF_PP(object_ptr); /* undo the effect of get_obj_zval_ptr_ptr() */
- }
-
- if (object_ptr && Z_TYPE_PP(object_ptr) == IS_OBJECT) {
+ if (IS_VAR == IS_VAR && !container) {
+ zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ } else if (Z_TYPE_PP(container) == IS_OBJECT) {
+ if (IS_VAR == IS_VAR && !(free_op1.var != NULL)) {
+ Z_ADDREF_PP(container); /* undo the effect of get_obj_zval_ptr_ptr() */
+ }
return zend_binary_assign_op_obj_helper_SPEC_VAR_CV(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
} else {
zend_op *op_data = opline+1;
zval *dim = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
- zval **container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
- if (IS_VAR == IS_VAR && !container) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
- }
zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), container, dim, 0, BP_VAR_RW TSRMLS_CC);
value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
var_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
- increment_opline = 1;
+ ZEND_VM_INC_OPCODE();
}
}
break;
}
if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
- if (increment_opline) {
- ZEND_VM_INC_OPCODE();
- }
ZEND_VM_NEXT_OPCODE();
}
PZVAL_LOCK(*var_ptr);
}
- if (increment_opline) {
- ZEND_VM_INC_OPCODE();
+ if (opline->extended_value == ZEND_ASSIGN_DIM) {
FREE_OP(free_op_data1);
FREE_OP_VAR_PTR(free_op_data2);
}
zval **retval = &EX_T(opline->result.u.var).var.ptr;
int have_get_ptr = 0;
+ if (IS_VAR == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ }
+
make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
object = *object_ptr;
zval *retval = &EX_T(opline->result.u.var).tmp_var;
int have_get_ptr = 0;
+ if (IS_VAR == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ }
+
make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
object = *object_ptr;
zval *offset = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
- if (container == EG(error_zval_ptr)) {
- if (!RETURN_VALUE_UNUSED(&opline->result)) {
- AI_SET_PTR(EX_T(opline->result.u.var).var, EG(error_zval_ptr));
- PZVAL_LOCK(EG(error_zval_ptr));
- }
-
- if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
- ZEND_VM_NEXT_OPCODE();
- }
-
-
if (Z_TYPE_P(container) != IS_OBJECT || !Z_OBJ_HT_P(container)->read_property) {
if (type != BP_VAR_IS) {
zend_error(E_NOTICE, "Trying to get property of non-object");
zend_op *opline = EX(opline);
zend_op *op_data = opline+1;
zend_free_op free_op1;
- zval **object_ptr;
+ zval **object_ptr = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
- if (IS_VAR == IS_CV || EX_T(opline->op1.u.var).var.ptr_ptr) {
- /* not an array offset */
- object_ptr = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
- } else {
- object_ptr = NULL;
+ if (IS_VAR == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
}
-
- if (object_ptr && Z_TYPE_PP(object_ptr) == IS_OBJECT) {
+ if (Z_TYPE_PP(object_ptr) == IS_OBJECT) {
zval *property_name = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
zval *dim = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
zval **variable_ptr_ptr;
- if (IS_VAR == IS_VAR && !object_ptr) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
- }
zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), object_ptr, dim, 0, BP_VAR_W TSRMLS_CC);
value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
zval *value = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
zval **variable_ptr_ptr = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
- if (!variable_ptr_ptr) {
+ if (IS_VAR == IS_VAR && !variable_ptr_ptr) {
if (zend_assign_to_string_offset(&EX_T(opline->op1.u.var), value, IS_CV TSRMLS_CC)) {
if (!RETURN_VALUE_UNUSED(&opline->result)) {
EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
zval *offset = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
long index;
- if (container) {
+ if (IS_VAR != IS_VAR || container) {
if (IS_VAR == IS_CV && container != &EG(uninitialized_zval_ptr)) {
SEPARATE_ZVAL_IF_NOT_REF(container);
}
zval **container = _get_zval_ptr_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
zval *offset = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
- if (container) {
+ if (IS_VAR != IS_VAR || container) {
if (IS_VAR == IS_CV && container != &EG(uninitialized_zval_ptr)) {
SEPARATE_ZVAL_IF_NOT_REF(container);
}
int result = 0;
long index;
- if (container) {
+ if (IS_VAR != IS_VAR || container) {
zval *offset = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
if (!obj || Z_TYPE_P(obj) != IS_OBJECT) {
zend_error_noreturn(E_ERROR, "__clone method called on non-object");
- EX_T(opline->result.u.var).var.ptr = EG(error_zval_ptr);
- Z_ADDREF_P(EX_T(opline->result.u.var).var.ptr);
-
- ZEND_VM_NEXT_OPCODE();
}
ce = Z_OBJCE_P(obj);
} else {
zend_error_noreturn(E_ERROR, "Trying to clone an uncloneable object");
}
- EX_T(opline->result.u.var).var.ptr = EG(error_zval_ptr);
- Z_ADDREF_P(EX_T(opline->result.u.var).var.ptr);
}
if (ce && clone) {
znode *result = &opline->result;
int have_get_ptr = 0;
+ if (IS_UNUSED == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ }
+
make_real_object(object_ptr TSRMLS_CC);
object = *object_ptr;
if (!have_get_ptr) {
zval *z = NULL;
- switch (opline->extended_value) {
- case ZEND_ASSIGN_OBJ:
- if (Z_OBJ_HT_P(object)->read_property) {
- z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R TSRMLS_CC);
- }
- break;
- case ZEND_ASSIGN_DIM:
- if (Z_OBJ_HT_P(object)->read_dimension) {
- z = Z_OBJ_HT_P(object)->read_dimension(object, property, BP_VAR_R TSRMLS_CC);
- }
- break;
+ if (opline->extended_value == ZEND_ASSIGN_OBJ) {
+ if (Z_OBJ_HT_P(object)->read_property) {
+ z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R TSRMLS_CC);
+ }
+ } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
+ if (Z_OBJ_HT_P(object)->read_dimension) {
+ z = Z_OBJ_HT_P(object)->read_dimension(object, property, BP_VAR_R TSRMLS_CC);
+ }
}
if (z) {
if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
Z_ADDREF_P(z);
SEPARATE_ZVAL_IF_NOT_REF(&z);
binary_op(z, z, value TSRMLS_CC);
- switch (opline->extended_value) {
- case ZEND_ASSIGN_OBJ:
- Z_OBJ_HT_P(object)->write_property(object, property, z TSRMLS_CC);
- break;
- case ZEND_ASSIGN_DIM:
- Z_OBJ_HT_P(object)->write_dimension(object, property, z TSRMLS_CC);
- break;
+ if (opline->extended_value == ZEND_ASSIGN_OBJ) {
+ Z_OBJ_HT_P(object)->write_property(object, property, z TSRMLS_CC);
+ } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
+ Z_OBJ_HT_P(object)->write_dimension(object, property, z TSRMLS_CC);
}
if (!RETURN_VALUE_UNUSED(result)) {
EX_T(result->u.var).var.ptr = z;
zend_free_op free_op_data2, free_op_data1;
zval **var_ptr;
zval *value;
- zend_bool increment_opline = 0;
switch (opline->extended_value) {
case ZEND_ASSIGN_OBJ:
return zend_binary_assign_op_obj_helper_SPEC_UNUSED_CONST(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
break;
case ZEND_ASSIGN_DIM: {
- zval **object_ptr = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
+ zval **container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
- if (object_ptr && IS_UNUSED != IS_CV && !0) {
- Z_ADDREF_PP(object_ptr); /* undo the effect of get_obj_zval_ptr_ptr() */
- }
-
- if (object_ptr && Z_TYPE_PP(object_ptr) == IS_OBJECT) {
+ if (IS_UNUSED == IS_VAR && !container) {
+ zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ } else if (Z_TYPE_PP(container) == IS_OBJECT) {
+ if (IS_UNUSED == IS_VAR && !0) {
+ Z_ADDREF_PP(container); /* undo the effect of get_obj_zval_ptr_ptr() */
+ }
return zend_binary_assign_op_obj_helper_SPEC_UNUSED_CONST(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
} else {
zend_op *op_data = opline+1;
zval *dim = &opline->op2.u.constant;
- zval **container = NULL;
- if (IS_UNUSED == IS_VAR && !container) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
- }
zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), container, dim, 0, BP_VAR_RW TSRMLS_CC);
value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
var_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
- increment_opline = 1;
+ ZEND_VM_INC_OPCODE();
}
}
break;
}
- if (increment_opline) {
- ZEND_VM_INC_OPCODE();
- }
ZEND_VM_NEXT_OPCODE();
}
PZVAL_LOCK(*var_ptr);
}
- if (increment_opline) {
- ZEND_VM_INC_OPCODE();
+ if (opline->extended_value == ZEND_ASSIGN_DIM) {
FREE_OP(free_op_data1);
FREE_OP_VAR_PTR(free_op_data2);
}
zval **retval = &EX_T(opline->result.u.var).var.ptr;
int have_get_ptr = 0;
+ if (IS_UNUSED == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ }
+
make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
object = *object_ptr;
zval *retval = &EX_T(opline->result.u.var).tmp_var;
int have_get_ptr = 0;
+ if (IS_UNUSED == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ }
+
make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
object = *object_ptr;
zval *offset = &opline->op2.u.constant;
- if (container == EG(error_zval_ptr)) {
- if (!RETURN_VALUE_UNUSED(&opline->result)) {
- AI_SET_PTR(EX_T(opline->result.u.var).var, EG(error_zval_ptr));
- PZVAL_LOCK(EG(error_zval_ptr));
- }
-
-
- ZEND_VM_NEXT_OPCODE();
- }
-
-
if (Z_TYPE_P(container) != IS_OBJECT || !Z_OBJ_HT_P(container)->read_property) {
if (type != BP_VAR_IS) {
zend_error(E_NOTICE, "Trying to get property of non-object");
zval *offset = &opline->op2.u.constant;
long index;
- if (container) {
+ if (IS_UNUSED != IS_VAR || container) {
if (IS_UNUSED == IS_CV && container != &EG(uninitialized_zval_ptr)) {
SEPARATE_ZVAL_IF_NOT_REF(container);
}
zval **container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
zval *offset = &opline->op2.u.constant;
- if (container) {
+ if (IS_UNUSED != IS_VAR || container) {
if (IS_UNUSED == IS_CV && container != &EG(uninitialized_zval_ptr)) {
SEPARATE_ZVAL_IF_NOT_REF(container);
}
int result = 0;
long index;
- if (container) {
+ if (IS_UNUSED != IS_VAR || container) {
zval *offset = &opline->op2.u.constant;
znode *result = &opline->result;
int have_get_ptr = 0;
+ if (IS_UNUSED == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ }
+
make_real_object(object_ptr TSRMLS_CC);
object = *object_ptr;
if (!have_get_ptr) {
zval *z = NULL;
- switch (opline->extended_value) {
- case ZEND_ASSIGN_OBJ:
- if (Z_OBJ_HT_P(object)->read_property) {
- z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R TSRMLS_CC);
- }
- break;
- case ZEND_ASSIGN_DIM:
- if (Z_OBJ_HT_P(object)->read_dimension) {
- z = Z_OBJ_HT_P(object)->read_dimension(object, property, BP_VAR_R TSRMLS_CC);
- }
- break;
+ if (opline->extended_value == ZEND_ASSIGN_OBJ) {
+ if (Z_OBJ_HT_P(object)->read_property) {
+ z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R TSRMLS_CC);
+ }
+ } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
+ if (Z_OBJ_HT_P(object)->read_dimension) {
+ z = Z_OBJ_HT_P(object)->read_dimension(object, property, BP_VAR_R TSRMLS_CC);
+ }
}
if (z) {
if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
Z_ADDREF_P(z);
SEPARATE_ZVAL_IF_NOT_REF(&z);
binary_op(z, z, value TSRMLS_CC);
- switch (opline->extended_value) {
- case ZEND_ASSIGN_OBJ:
- Z_OBJ_HT_P(object)->write_property(object, property, z TSRMLS_CC);
- break;
- case ZEND_ASSIGN_DIM:
- Z_OBJ_HT_P(object)->write_dimension(object, property, z TSRMLS_CC);
- break;
+ if (opline->extended_value == ZEND_ASSIGN_OBJ) {
+ Z_OBJ_HT_P(object)->write_property(object, property, z TSRMLS_CC);
+ } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
+ Z_OBJ_HT_P(object)->write_dimension(object, property, z TSRMLS_CC);
}
if (!RETURN_VALUE_UNUSED(result)) {
EX_T(result->u.var).var.ptr = z;
zend_free_op free_op2, free_op_data2, free_op_data1;
zval **var_ptr;
zval *value;
- zend_bool increment_opline = 0;
switch (opline->extended_value) {
case ZEND_ASSIGN_OBJ:
return zend_binary_assign_op_obj_helper_SPEC_UNUSED_TMP(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
break;
case ZEND_ASSIGN_DIM: {
- zval **object_ptr = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
+ zval **container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
- if (object_ptr && IS_UNUSED != IS_CV && !0) {
- Z_ADDREF_PP(object_ptr); /* undo the effect of get_obj_zval_ptr_ptr() */
- }
-
- if (object_ptr && Z_TYPE_PP(object_ptr) == IS_OBJECT) {
+ if (IS_UNUSED == IS_VAR && !container) {
+ zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ } else if (Z_TYPE_PP(container) == IS_OBJECT) {
+ if (IS_UNUSED == IS_VAR && !0) {
+ Z_ADDREF_PP(container); /* undo the effect of get_obj_zval_ptr_ptr() */
+ }
return zend_binary_assign_op_obj_helper_SPEC_UNUSED_TMP(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
} else {
zend_op *op_data = opline+1;
zval *dim = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
- zval **container = NULL;
- if (IS_UNUSED == IS_VAR && !container) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
- }
zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), container, dim, 1, BP_VAR_RW TSRMLS_CC);
value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
var_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
- increment_opline = 1;
+ ZEND_VM_INC_OPCODE();
}
}
break;
}
zval_dtor(free_op2.var);
- if (increment_opline) {
- ZEND_VM_INC_OPCODE();
- }
ZEND_VM_NEXT_OPCODE();
}
}
zval_dtor(free_op2.var);
- if (increment_opline) {
- ZEND_VM_INC_OPCODE();
+ if (opline->extended_value == ZEND_ASSIGN_DIM) {
FREE_OP(free_op_data1);
FREE_OP_VAR_PTR(free_op_data2);
}
zval **retval = &EX_T(opline->result.u.var).var.ptr;
int have_get_ptr = 0;
+ if (IS_UNUSED == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ }
+
make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
object = *object_ptr;
zval *retval = &EX_T(opline->result.u.var).tmp_var;
int have_get_ptr = 0;
+ if (IS_UNUSED == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ }
+
make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
object = *object_ptr;
zend_free_op free_op2;
zval *offset = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
- if (container == EG(error_zval_ptr)) {
- if (!RETURN_VALUE_UNUSED(&opline->result)) {
- AI_SET_PTR(EX_T(opline->result.u.var).var, EG(error_zval_ptr));
- PZVAL_LOCK(EG(error_zval_ptr));
- }
- zval_dtor(free_op2.var);
-
- ZEND_VM_NEXT_OPCODE();
- }
-
-
if (Z_TYPE_P(container) != IS_OBJECT || !Z_OBJ_HT_P(container)->read_property) {
if (type != BP_VAR_IS) {
zend_error(E_NOTICE, "Trying to get property of non-object");
zval *offset = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
long index;
- if (container) {
+ if (IS_UNUSED != IS_VAR || container) {
if (IS_UNUSED == IS_CV && container != &EG(uninitialized_zval_ptr)) {
SEPARATE_ZVAL_IF_NOT_REF(container);
}
zval **container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
zval *offset = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
- if (container) {
+ if (IS_UNUSED != IS_VAR || container) {
if (IS_UNUSED == IS_CV && container != &EG(uninitialized_zval_ptr)) {
SEPARATE_ZVAL_IF_NOT_REF(container);
}
int result = 0;
long index;
- if (container) {
+ if (IS_UNUSED != IS_VAR || container) {
zend_free_op free_op2;
zval *offset = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
znode *result = &opline->result;
int have_get_ptr = 0;
+ if (IS_UNUSED == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ }
+
make_real_object(object_ptr TSRMLS_CC);
object = *object_ptr;
if (!have_get_ptr) {
zval *z = NULL;
- switch (opline->extended_value) {
- case ZEND_ASSIGN_OBJ:
- if (Z_OBJ_HT_P(object)->read_property) {
- z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R TSRMLS_CC);
- }
- break;
- case ZEND_ASSIGN_DIM:
- if (Z_OBJ_HT_P(object)->read_dimension) {
- z = Z_OBJ_HT_P(object)->read_dimension(object, property, BP_VAR_R TSRMLS_CC);
- }
- break;
+ if (opline->extended_value == ZEND_ASSIGN_OBJ) {
+ if (Z_OBJ_HT_P(object)->read_property) {
+ z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R TSRMLS_CC);
+ }
+ } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
+ if (Z_OBJ_HT_P(object)->read_dimension) {
+ z = Z_OBJ_HT_P(object)->read_dimension(object, property, BP_VAR_R TSRMLS_CC);
+ }
}
if (z) {
if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
Z_ADDREF_P(z);
SEPARATE_ZVAL_IF_NOT_REF(&z);
binary_op(z, z, value TSRMLS_CC);
- switch (opline->extended_value) {
- case ZEND_ASSIGN_OBJ:
- Z_OBJ_HT_P(object)->write_property(object, property, z TSRMLS_CC);
- break;
- case ZEND_ASSIGN_DIM:
- Z_OBJ_HT_P(object)->write_dimension(object, property, z TSRMLS_CC);
- break;
+ if (opline->extended_value == ZEND_ASSIGN_OBJ) {
+ Z_OBJ_HT_P(object)->write_property(object, property, z TSRMLS_CC);
+ } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
+ Z_OBJ_HT_P(object)->write_dimension(object, property, z TSRMLS_CC);
}
if (!RETURN_VALUE_UNUSED(result)) {
EX_T(result->u.var).var.ptr = z;
zend_free_op free_op2, free_op_data2, free_op_data1;
zval **var_ptr;
zval *value;
- zend_bool increment_opline = 0;
switch (opline->extended_value) {
case ZEND_ASSIGN_OBJ:
return zend_binary_assign_op_obj_helper_SPEC_UNUSED_VAR(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
break;
case ZEND_ASSIGN_DIM: {
- zval **object_ptr = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
+ zval **container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
- if (object_ptr && IS_UNUSED != IS_CV && !0) {
- Z_ADDREF_PP(object_ptr); /* undo the effect of get_obj_zval_ptr_ptr() */
- }
-
- if (object_ptr && Z_TYPE_PP(object_ptr) == IS_OBJECT) {
+ if (IS_UNUSED == IS_VAR && !container) {
+ zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ } else if (Z_TYPE_PP(container) == IS_OBJECT) {
+ if (IS_UNUSED == IS_VAR && !0) {
+ Z_ADDREF_PP(container); /* undo the effect of get_obj_zval_ptr_ptr() */
+ }
return zend_binary_assign_op_obj_helper_SPEC_UNUSED_VAR(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
} else {
zend_op *op_data = opline+1;
zval *dim = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
- zval **container = NULL;
- if (IS_UNUSED == IS_VAR && !container) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
- }
zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), container, dim, 0, BP_VAR_RW TSRMLS_CC);
value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
var_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
- increment_opline = 1;
+ ZEND_VM_INC_OPCODE();
}
}
break;
}
if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
- if (increment_opline) {
- ZEND_VM_INC_OPCODE();
- }
ZEND_VM_NEXT_OPCODE();
}
}
if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
- if (increment_opline) {
- ZEND_VM_INC_OPCODE();
+ if (opline->extended_value == ZEND_ASSIGN_DIM) {
FREE_OP(free_op_data1);
FREE_OP_VAR_PTR(free_op_data2);
}
zval **retval = &EX_T(opline->result.u.var).var.ptr;
int have_get_ptr = 0;
+ if (IS_UNUSED == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ }
+
make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
object = *object_ptr;
zval *retval = &EX_T(opline->result.u.var).tmp_var;
int have_get_ptr = 0;
+ if (IS_UNUSED == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ }
+
make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
object = *object_ptr;
zend_free_op free_op2;
zval *offset = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
- if (container == EG(error_zval_ptr)) {
- if (!RETURN_VALUE_UNUSED(&opline->result)) {
- AI_SET_PTR(EX_T(opline->result.u.var).var, EG(error_zval_ptr));
- PZVAL_LOCK(EG(error_zval_ptr));
- }
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
-
- ZEND_VM_NEXT_OPCODE();
- }
-
-
if (Z_TYPE_P(container) != IS_OBJECT || !Z_OBJ_HT_P(container)->read_property) {
if (type != BP_VAR_IS) {
zend_error(E_NOTICE, "Trying to get property of non-object");
zval *offset = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
long index;
- if (container) {
+ if (IS_UNUSED != IS_VAR || container) {
if (IS_UNUSED == IS_CV && container != &EG(uninitialized_zval_ptr)) {
SEPARATE_ZVAL_IF_NOT_REF(container);
}
zval **container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
zval *offset = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
- if (container) {
+ if (IS_UNUSED != IS_VAR || container) {
if (IS_UNUSED == IS_CV && container != &EG(uninitialized_zval_ptr)) {
SEPARATE_ZVAL_IF_NOT_REF(container);
}
int result = 0;
long index;
- if (container) {
+ if (IS_UNUSED != IS_VAR || container) {
zend_free_op free_op2;
zval *offset = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
znode *result = &opline->result;
int have_get_ptr = 0;
+ if (IS_UNUSED == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ }
+
make_real_object(object_ptr TSRMLS_CC);
object = *object_ptr;
if (!have_get_ptr) {
zval *z = NULL;
- switch (opline->extended_value) {
- case ZEND_ASSIGN_OBJ:
- if (Z_OBJ_HT_P(object)->read_property) {
- z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R TSRMLS_CC);
- }
- break;
- case ZEND_ASSIGN_DIM:
- if (Z_OBJ_HT_P(object)->read_dimension) {
- z = Z_OBJ_HT_P(object)->read_dimension(object, property, BP_VAR_R TSRMLS_CC);
- }
- break;
+ if (opline->extended_value == ZEND_ASSIGN_OBJ) {
+ if (Z_OBJ_HT_P(object)->read_property) {
+ z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R TSRMLS_CC);
+ }
+ } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
+ if (Z_OBJ_HT_P(object)->read_dimension) {
+ z = Z_OBJ_HT_P(object)->read_dimension(object, property, BP_VAR_R TSRMLS_CC);
+ }
}
if (z) {
if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
Z_ADDREF_P(z);
SEPARATE_ZVAL_IF_NOT_REF(&z);
binary_op(z, z, value TSRMLS_CC);
- switch (opline->extended_value) {
- case ZEND_ASSIGN_OBJ:
- Z_OBJ_HT_P(object)->write_property(object, property, z TSRMLS_CC);
- break;
- case ZEND_ASSIGN_DIM:
- Z_OBJ_HT_P(object)->write_dimension(object, property, z TSRMLS_CC);
- break;
+ if (opline->extended_value == ZEND_ASSIGN_OBJ) {
+ Z_OBJ_HT_P(object)->write_property(object, property, z TSRMLS_CC);
+ } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
+ Z_OBJ_HT_P(object)->write_dimension(object, property, z TSRMLS_CC);
}
if (!RETURN_VALUE_UNUSED(result)) {
EX_T(result->u.var).var.ptr = z;
zend_free_op free_op_data2, free_op_data1;
zval **var_ptr;
zval *value;
- zend_bool increment_opline = 0;
switch (opline->extended_value) {
case ZEND_ASSIGN_OBJ:
return zend_binary_assign_op_obj_helper_SPEC_UNUSED_UNUSED(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
break;
case ZEND_ASSIGN_DIM: {
- zval **object_ptr = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
+ zval **container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
- if (object_ptr && IS_UNUSED != IS_CV && !0) {
- Z_ADDREF_PP(object_ptr); /* undo the effect of get_obj_zval_ptr_ptr() */
- }
-
- if (object_ptr && Z_TYPE_PP(object_ptr) == IS_OBJECT) {
+ if (IS_UNUSED == IS_VAR && !container) {
+ zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ } else if (Z_TYPE_PP(container) == IS_OBJECT) {
+ if (IS_UNUSED == IS_VAR && !0) {
+ Z_ADDREF_PP(container); /* undo the effect of get_obj_zval_ptr_ptr() */
+ }
return zend_binary_assign_op_obj_helper_SPEC_UNUSED_UNUSED(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
} else {
zend_op *op_data = opline+1;
zval *dim = NULL;
- zval **container = NULL;
- if (IS_UNUSED == IS_VAR && !container) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
- }
zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), container, dim, 0, BP_VAR_RW TSRMLS_CC);
value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
var_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
- increment_opline = 1;
+ ZEND_VM_INC_OPCODE();
}
}
break;
}
- if (increment_opline) {
- ZEND_VM_INC_OPCODE();
- }
ZEND_VM_NEXT_OPCODE();
}
PZVAL_LOCK(*var_ptr);
}
- if (increment_opline) {
- ZEND_VM_INC_OPCODE();
+ if (opline->extended_value == ZEND_ASSIGN_DIM) {
FREE_OP(free_op_data1);
FREE_OP_VAR_PTR(free_op_data2);
}
znode *result = &opline->result;
int have_get_ptr = 0;
+ if (IS_UNUSED == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ }
+
make_real_object(object_ptr TSRMLS_CC);
object = *object_ptr;
if (!have_get_ptr) {
zval *z = NULL;
- switch (opline->extended_value) {
- case ZEND_ASSIGN_OBJ:
- if (Z_OBJ_HT_P(object)->read_property) {
- z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R TSRMLS_CC);
- }
- break;
- case ZEND_ASSIGN_DIM:
- if (Z_OBJ_HT_P(object)->read_dimension) {
- z = Z_OBJ_HT_P(object)->read_dimension(object, property, BP_VAR_R TSRMLS_CC);
- }
- break;
+ if (opline->extended_value == ZEND_ASSIGN_OBJ) {
+ if (Z_OBJ_HT_P(object)->read_property) {
+ z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R TSRMLS_CC);
+ }
+ } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
+ if (Z_OBJ_HT_P(object)->read_dimension) {
+ z = Z_OBJ_HT_P(object)->read_dimension(object, property, BP_VAR_R TSRMLS_CC);
+ }
}
if (z) {
if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
Z_ADDREF_P(z);
SEPARATE_ZVAL_IF_NOT_REF(&z);
binary_op(z, z, value TSRMLS_CC);
- switch (opline->extended_value) {
- case ZEND_ASSIGN_OBJ:
- Z_OBJ_HT_P(object)->write_property(object, property, z TSRMLS_CC);
- break;
- case ZEND_ASSIGN_DIM:
- Z_OBJ_HT_P(object)->write_dimension(object, property, z TSRMLS_CC);
- break;
+ if (opline->extended_value == ZEND_ASSIGN_OBJ) {
+ Z_OBJ_HT_P(object)->write_property(object, property, z TSRMLS_CC);
+ } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
+ Z_OBJ_HT_P(object)->write_dimension(object, property, z TSRMLS_CC);
}
if (!RETURN_VALUE_UNUSED(result)) {
EX_T(result->u.var).var.ptr = z;
zend_free_op free_op_data2, free_op_data1;
zval **var_ptr;
zval *value;
- zend_bool increment_opline = 0;
switch (opline->extended_value) {
case ZEND_ASSIGN_OBJ:
return zend_binary_assign_op_obj_helper_SPEC_UNUSED_CV(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
break;
case ZEND_ASSIGN_DIM: {
- zval **object_ptr = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
+ zval **container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
- if (object_ptr && IS_UNUSED != IS_CV && !0) {
- Z_ADDREF_PP(object_ptr); /* undo the effect of get_obj_zval_ptr_ptr() */
- }
-
- if (object_ptr && Z_TYPE_PP(object_ptr) == IS_OBJECT) {
+ if (IS_UNUSED == IS_VAR && !container) {
+ zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ } else if (Z_TYPE_PP(container) == IS_OBJECT) {
+ if (IS_UNUSED == IS_VAR && !0) {
+ Z_ADDREF_PP(container); /* undo the effect of get_obj_zval_ptr_ptr() */
+ }
return zend_binary_assign_op_obj_helper_SPEC_UNUSED_CV(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
} else {
zend_op *op_data = opline+1;
zval *dim = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
- zval **container = NULL;
- if (IS_UNUSED == IS_VAR && !container) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
- }
zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), container, dim, 0, BP_VAR_RW TSRMLS_CC);
value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
var_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
- increment_opline = 1;
+ ZEND_VM_INC_OPCODE();
}
}
break;
}
- if (increment_opline) {
- ZEND_VM_INC_OPCODE();
- }
ZEND_VM_NEXT_OPCODE();
}
PZVAL_LOCK(*var_ptr);
}
- if (increment_opline) {
- ZEND_VM_INC_OPCODE();
+ if (opline->extended_value == ZEND_ASSIGN_DIM) {
FREE_OP(free_op_data1);
FREE_OP_VAR_PTR(free_op_data2);
}
zval **retval = &EX_T(opline->result.u.var).var.ptr;
int have_get_ptr = 0;
+ if (IS_UNUSED == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ }
+
make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
object = *object_ptr;
zval *retval = &EX_T(opline->result.u.var).tmp_var;
int have_get_ptr = 0;
+ if (IS_UNUSED == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ }
+
make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
object = *object_ptr;
zval *offset = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
- if (container == EG(error_zval_ptr)) {
- if (!RETURN_VALUE_UNUSED(&opline->result)) {
- AI_SET_PTR(EX_T(opline->result.u.var).var, EG(error_zval_ptr));
- PZVAL_LOCK(EG(error_zval_ptr));
- }
-
-
- ZEND_VM_NEXT_OPCODE();
- }
-
-
if (Z_TYPE_P(container) != IS_OBJECT || !Z_OBJ_HT_P(container)->read_property) {
if (type != BP_VAR_IS) {
zend_error(E_NOTICE, "Trying to get property of non-object");
zval *offset = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
long index;
- if (container) {
+ if (IS_UNUSED != IS_VAR || container) {
if (IS_UNUSED == IS_CV && container != &EG(uninitialized_zval_ptr)) {
SEPARATE_ZVAL_IF_NOT_REF(container);
}
zval **container = _get_obj_zval_ptr_ptr_unused(TSRMLS_C);
zval *offset = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
- if (container) {
+ if (IS_UNUSED != IS_VAR || container) {
if (IS_UNUSED == IS_CV && container != &EG(uninitialized_zval_ptr)) {
SEPARATE_ZVAL_IF_NOT_REF(container);
}
int result = 0;
long index;
- if (container) {
+ if (IS_UNUSED != IS_VAR || container) {
zval *offset = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
if (IS_CV == IS_VAR && !var_ptr) {
zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
}
- if (*var_ptr == EG(error_zval_ptr)) {
+ if (IS_CV == IS_VAR && *var_ptr == EG(error_zval_ptr)) {
if (!RETURN_VALUE_UNUSED(&opline->result)) {
AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
PZVAL_LOCK(EG(uninitialized_zval_ptr));
if (IS_CV == IS_VAR && !var_ptr) {
zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
}
- if (*var_ptr == EG(error_zval_ptr)) {
+ if (IS_CV == IS_VAR && *var_ptr == EG(error_zval_ptr)) {
if (!RETURN_VALUE_UNUSED(&opline->result)) {
AI_SET_PTR(EX_T(opline->result.u.var).var, EG(uninitialized_zval_ptr));
PZVAL_LOCK(EG(uninitialized_zval_ptr));
if (IS_CV == IS_VAR && !var_ptr) {
zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
}
- if (*var_ptr == EG(error_zval_ptr)) {
+ if (IS_CV == IS_VAR && *var_ptr == EG(error_zval_ptr)) {
if (!RETURN_VALUE_UNUSED(&opline->result)) {
EX_T(opline->result.u.var).tmp_var = *EG(uninitialized_zval_ptr);
}
if (IS_CV == IS_VAR && !var_ptr) {
zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
}
- if (*var_ptr == EG(error_zval_ptr)) {
+ if (IS_CV == IS_VAR && *var_ptr == EG(error_zval_ptr)) {
if (!RETURN_VALUE_UNUSED(&opline->result)) {
EX_T(opline->result.u.var).tmp_var = *EG(uninitialized_zval_ptr);
}
if (!obj || Z_TYPE_P(obj) != IS_OBJECT) {
zend_error_noreturn(E_ERROR, "__clone method called on non-object");
- EX_T(opline->result.u.var).var.ptr = EG(error_zval_ptr);
- Z_ADDREF_P(EX_T(opline->result.u.var).var.ptr);
-
- ZEND_VM_NEXT_OPCODE();
}
ce = Z_OBJCE_P(obj);
} else {
zend_error_noreturn(E_ERROR, "Trying to clone an uncloneable object");
}
- EX_T(opline->result.u.var).var.ptr = EG(error_zval_ptr);
- Z_ADDREF_P(EX_T(opline->result.u.var).var.ptr);
}
if (ce && clone) {
znode *result = &opline->result;
int have_get_ptr = 0;
+ if (IS_CV == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ }
+
make_real_object(object_ptr TSRMLS_CC);
object = *object_ptr;
if (!have_get_ptr) {
zval *z = NULL;
- switch (opline->extended_value) {
- case ZEND_ASSIGN_OBJ:
- if (Z_OBJ_HT_P(object)->read_property) {
- z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R TSRMLS_CC);
- }
- break;
- case ZEND_ASSIGN_DIM:
- if (Z_OBJ_HT_P(object)->read_dimension) {
- z = Z_OBJ_HT_P(object)->read_dimension(object, property, BP_VAR_R TSRMLS_CC);
- }
- break;
+ if (opline->extended_value == ZEND_ASSIGN_OBJ) {
+ if (Z_OBJ_HT_P(object)->read_property) {
+ z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R TSRMLS_CC);
+ }
+ } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
+ if (Z_OBJ_HT_P(object)->read_dimension) {
+ z = Z_OBJ_HT_P(object)->read_dimension(object, property, BP_VAR_R TSRMLS_CC);
+ }
}
if (z) {
if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
Z_ADDREF_P(z);
SEPARATE_ZVAL_IF_NOT_REF(&z);
binary_op(z, z, value TSRMLS_CC);
- switch (opline->extended_value) {
- case ZEND_ASSIGN_OBJ:
- Z_OBJ_HT_P(object)->write_property(object, property, z TSRMLS_CC);
- break;
- case ZEND_ASSIGN_DIM:
- Z_OBJ_HT_P(object)->write_dimension(object, property, z TSRMLS_CC);
- break;
+ if (opline->extended_value == ZEND_ASSIGN_OBJ) {
+ Z_OBJ_HT_P(object)->write_property(object, property, z TSRMLS_CC);
+ } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
+ Z_OBJ_HT_P(object)->write_dimension(object, property, z TSRMLS_CC);
}
if (!RETURN_VALUE_UNUSED(result)) {
EX_T(result->u.var).var.ptr = z;
zend_free_op free_op_data2, free_op_data1;
zval **var_ptr;
zval *value;
- zend_bool increment_opline = 0;
switch (opline->extended_value) {
case ZEND_ASSIGN_OBJ:
return zend_binary_assign_op_obj_helper_SPEC_CV_CONST(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
break;
case ZEND_ASSIGN_DIM: {
- zval **object_ptr = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
+ zval **container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_RW TSRMLS_CC);
- if (object_ptr && IS_CV != IS_CV && !0) {
- Z_ADDREF_PP(object_ptr); /* undo the effect of get_obj_zval_ptr_ptr() */
- }
-
- if (object_ptr && Z_TYPE_PP(object_ptr) == IS_OBJECT) {
+ if (IS_CV == IS_VAR && !container) {
+ zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ } else if (Z_TYPE_PP(container) == IS_OBJECT) {
+ if (IS_CV == IS_VAR && !0) {
+ Z_ADDREF_PP(container); /* undo the effect of get_obj_zval_ptr_ptr() */
+ }
return zend_binary_assign_op_obj_helper_SPEC_CV_CONST(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
} else {
zend_op *op_data = opline+1;
zval *dim = &opline->op2.u.constant;
- zval **container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_RW TSRMLS_CC);
- if (IS_CV == IS_VAR && !container) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
- }
zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), container, dim, 0, BP_VAR_RW TSRMLS_CC);
value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
var_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
- increment_opline = 1;
+ ZEND_VM_INC_OPCODE();
}
}
break;
}
- if (increment_opline) {
- ZEND_VM_INC_OPCODE();
- }
ZEND_VM_NEXT_OPCODE();
}
PZVAL_LOCK(*var_ptr);
}
- if (increment_opline) {
- ZEND_VM_INC_OPCODE();
+ if (opline->extended_value == ZEND_ASSIGN_DIM) {
FREE_OP(free_op_data1);
FREE_OP_VAR_PTR(free_op_data2);
}
zval **retval = &EX_T(opline->result.u.var).var.ptr;
int have_get_ptr = 0;
+ if (IS_CV == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ }
+
make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
object = *object_ptr;
zval *retval = &EX_T(opline->result.u.var).tmp_var;
int have_get_ptr = 0;
+ if (IS_CV == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ }
+
make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
object = *object_ptr;
zval *offset = &opline->op2.u.constant;
- if (container == EG(error_zval_ptr)) {
- if (!RETURN_VALUE_UNUSED(&opline->result)) {
- AI_SET_PTR(EX_T(opline->result.u.var).var, EG(error_zval_ptr));
- PZVAL_LOCK(EG(error_zval_ptr));
- }
-
-
- ZEND_VM_NEXT_OPCODE();
- }
-
-
if (Z_TYPE_P(container) != IS_OBJECT || !Z_OBJ_HT_P(container)->read_property) {
if (type != BP_VAR_IS) {
zend_error(E_NOTICE, "Trying to get property of non-object");
zend_op *opline = EX(opline);
zend_op *op_data = opline+1;
- zval **object_ptr;
+ zval **object_ptr = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
- if (IS_CV == IS_CV || EX_T(opline->op1.u.var).var.ptr_ptr) {
- /* not an array offset */
- object_ptr = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
- } else {
- object_ptr = NULL;
+ if (IS_CV == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
}
-
- if (object_ptr && Z_TYPE_PP(object_ptr) == IS_OBJECT) {
+ if (Z_TYPE_PP(object_ptr) == IS_OBJECT) {
zval *property_name = &opline->op2.u.constant;
zval *dim = &opline->op2.u.constant;
zval **variable_ptr_ptr;
- if (IS_CV == IS_VAR && !object_ptr) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
- }
zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), object_ptr, dim, 0, BP_VAR_W TSRMLS_CC);
value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
zval *value = &opline->op2.u.constant;
zval **variable_ptr_ptr = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
- if (!variable_ptr_ptr) {
+ if (IS_CV == IS_VAR && !variable_ptr_ptr) {
if (zend_assign_to_string_offset(&EX_T(opline->op1.u.var), value, IS_CONST TSRMLS_CC)) {
if (!RETURN_VALUE_UNUSED(&opline->result)) {
EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
zval *offset = &opline->op2.u.constant;
long index;
- if (container) {
+ if (IS_CV != IS_VAR || container) {
if (IS_CV == IS_CV && container != &EG(uninitialized_zval_ptr)) {
SEPARATE_ZVAL_IF_NOT_REF(container);
}
zval **container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_UNSET TSRMLS_CC);
zval *offset = &opline->op2.u.constant;
- if (container) {
+ if (IS_CV != IS_VAR || container) {
if (IS_CV == IS_CV && container != &EG(uninitialized_zval_ptr)) {
SEPARATE_ZVAL_IF_NOT_REF(container);
}
int result = 0;
long index;
- if (container) {
+ if (IS_CV != IS_VAR || container) {
zval *offset = &opline->op2.u.constant;
znode *result = &opline->result;
int have_get_ptr = 0;
+ if (IS_CV == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ }
+
make_real_object(object_ptr TSRMLS_CC);
object = *object_ptr;
if (!have_get_ptr) {
zval *z = NULL;
- switch (opline->extended_value) {
- case ZEND_ASSIGN_OBJ:
- if (Z_OBJ_HT_P(object)->read_property) {
- z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R TSRMLS_CC);
- }
- break;
- case ZEND_ASSIGN_DIM:
- if (Z_OBJ_HT_P(object)->read_dimension) {
- z = Z_OBJ_HT_P(object)->read_dimension(object, property, BP_VAR_R TSRMLS_CC);
- }
- break;
+ if (opline->extended_value == ZEND_ASSIGN_OBJ) {
+ if (Z_OBJ_HT_P(object)->read_property) {
+ z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R TSRMLS_CC);
+ }
+ } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
+ if (Z_OBJ_HT_P(object)->read_dimension) {
+ z = Z_OBJ_HT_P(object)->read_dimension(object, property, BP_VAR_R TSRMLS_CC);
+ }
}
if (z) {
if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
Z_ADDREF_P(z);
SEPARATE_ZVAL_IF_NOT_REF(&z);
binary_op(z, z, value TSRMLS_CC);
- switch (opline->extended_value) {
- case ZEND_ASSIGN_OBJ:
- Z_OBJ_HT_P(object)->write_property(object, property, z TSRMLS_CC);
- break;
- case ZEND_ASSIGN_DIM:
- Z_OBJ_HT_P(object)->write_dimension(object, property, z TSRMLS_CC);
- break;
+ if (opline->extended_value == ZEND_ASSIGN_OBJ) {
+ Z_OBJ_HT_P(object)->write_property(object, property, z TSRMLS_CC);
+ } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
+ Z_OBJ_HT_P(object)->write_dimension(object, property, z TSRMLS_CC);
}
if (!RETURN_VALUE_UNUSED(result)) {
EX_T(result->u.var).var.ptr = z;
zend_free_op free_op2, free_op_data2, free_op_data1;
zval **var_ptr;
zval *value;
- zend_bool increment_opline = 0;
switch (opline->extended_value) {
case ZEND_ASSIGN_OBJ:
return zend_binary_assign_op_obj_helper_SPEC_CV_TMP(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
break;
case ZEND_ASSIGN_DIM: {
- zval **object_ptr = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
-
- if (object_ptr && IS_CV != IS_CV && !0) {
- Z_ADDREF_PP(object_ptr); /* undo the effect of get_obj_zval_ptr_ptr() */
- }
+ zval **container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_RW TSRMLS_CC);
- if (object_ptr && Z_TYPE_PP(object_ptr) == IS_OBJECT) {
+ if (IS_CV == IS_VAR && !container) {
+ zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ } else if (Z_TYPE_PP(container) == IS_OBJECT) {
+ if (IS_CV == IS_VAR && !0) {
+ Z_ADDREF_PP(container); /* undo the effect of get_obj_zval_ptr_ptr() */
+ }
return zend_binary_assign_op_obj_helper_SPEC_CV_TMP(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
} else {
zend_op *op_data = opline+1;
zval *dim = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
- zval **container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_RW TSRMLS_CC);
- if (IS_CV == IS_VAR && !container) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
- }
zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), container, dim, 1, BP_VAR_RW TSRMLS_CC);
value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
var_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
- increment_opline = 1;
+ ZEND_VM_INC_OPCODE();
}
}
break;
}
zval_dtor(free_op2.var);
- if (increment_opline) {
- ZEND_VM_INC_OPCODE();
- }
ZEND_VM_NEXT_OPCODE();
}
}
zval_dtor(free_op2.var);
- if (increment_opline) {
- ZEND_VM_INC_OPCODE();
+ if (opline->extended_value == ZEND_ASSIGN_DIM) {
FREE_OP(free_op_data1);
FREE_OP_VAR_PTR(free_op_data2);
}
zval **retval = &EX_T(opline->result.u.var).var.ptr;
int have_get_ptr = 0;
+ if (IS_CV == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ }
+
make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
object = *object_ptr;
zval *retval = &EX_T(opline->result.u.var).tmp_var;
int have_get_ptr = 0;
+ if (IS_CV == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ }
+
make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
object = *object_ptr;
zend_free_op free_op2;
zval *offset = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
- if (container == EG(error_zval_ptr)) {
- if (!RETURN_VALUE_UNUSED(&opline->result)) {
- AI_SET_PTR(EX_T(opline->result.u.var).var, EG(error_zval_ptr));
- PZVAL_LOCK(EG(error_zval_ptr));
- }
- zval_dtor(free_op2.var);
-
- ZEND_VM_NEXT_OPCODE();
- }
-
-
if (Z_TYPE_P(container) != IS_OBJECT || !Z_OBJ_HT_P(container)->read_property) {
if (type != BP_VAR_IS) {
zend_error(E_NOTICE, "Trying to get property of non-object");
zend_op *opline = EX(opline);
zend_op *op_data = opline+1;
- zval **object_ptr;
+ zval **object_ptr = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
- if (IS_CV == IS_CV || EX_T(opline->op1.u.var).var.ptr_ptr) {
- /* not an array offset */
- object_ptr = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
- } else {
- object_ptr = NULL;
+ if (IS_CV == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
}
-
- if (object_ptr && Z_TYPE_PP(object_ptr) == IS_OBJECT) {
+ if (Z_TYPE_PP(object_ptr) == IS_OBJECT) {
zend_free_op free_op2;
zval *property_name = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
zval *dim = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
zval **variable_ptr_ptr;
- if (IS_CV == IS_VAR && !object_ptr) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
- }
zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), object_ptr, dim, 1, BP_VAR_W TSRMLS_CC);
zval_dtor(free_op2.var);
zval *value = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
zval **variable_ptr_ptr = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
- if (!variable_ptr_ptr) {
+ if (IS_CV == IS_VAR && !variable_ptr_ptr) {
if (zend_assign_to_string_offset(&EX_T(opline->op1.u.var), value, IS_TMP_VAR TSRMLS_CC)) {
if (!RETURN_VALUE_UNUSED(&opline->result)) {
EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
zval *offset = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
long index;
- if (container) {
+ if (IS_CV != IS_VAR || container) {
if (IS_CV == IS_CV && container != &EG(uninitialized_zval_ptr)) {
SEPARATE_ZVAL_IF_NOT_REF(container);
}
zval **container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_UNSET TSRMLS_CC);
zval *offset = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
- if (container) {
+ if (IS_CV != IS_VAR || container) {
if (IS_CV == IS_CV && container != &EG(uninitialized_zval_ptr)) {
SEPARATE_ZVAL_IF_NOT_REF(container);
}
int result = 0;
long index;
- if (container) {
+ if (IS_CV != IS_VAR || container) {
zend_free_op free_op2;
zval *offset = _get_zval_ptr_tmp(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
znode *result = &opline->result;
int have_get_ptr = 0;
+ if (IS_CV == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ }
+
make_real_object(object_ptr TSRMLS_CC);
object = *object_ptr;
if (!have_get_ptr) {
zval *z = NULL;
- switch (opline->extended_value) {
- case ZEND_ASSIGN_OBJ:
- if (Z_OBJ_HT_P(object)->read_property) {
- z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R TSRMLS_CC);
- }
- break;
- case ZEND_ASSIGN_DIM:
- if (Z_OBJ_HT_P(object)->read_dimension) {
- z = Z_OBJ_HT_P(object)->read_dimension(object, property, BP_VAR_R TSRMLS_CC);
- }
- break;
+ if (opline->extended_value == ZEND_ASSIGN_OBJ) {
+ if (Z_OBJ_HT_P(object)->read_property) {
+ z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R TSRMLS_CC);
+ }
+ } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
+ if (Z_OBJ_HT_P(object)->read_dimension) {
+ z = Z_OBJ_HT_P(object)->read_dimension(object, property, BP_VAR_R TSRMLS_CC);
+ }
}
if (z) {
if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
Z_ADDREF_P(z);
SEPARATE_ZVAL_IF_NOT_REF(&z);
binary_op(z, z, value TSRMLS_CC);
- switch (opline->extended_value) {
- case ZEND_ASSIGN_OBJ:
- Z_OBJ_HT_P(object)->write_property(object, property, z TSRMLS_CC);
- break;
- case ZEND_ASSIGN_DIM:
- Z_OBJ_HT_P(object)->write_dimension(object, property, z TSRMLS_CC);
- break;
+ if (opline->extended_value == ZEND_ASSIGN_OBJ) {
+ Z_OBJ_HT_P(object)->write_property(object, property, z TSRMLS_CC);
+ } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
+ Z_OBJ_HT_P(object)->write_dimension(object, property, z TSRMLS_CC);
}
if (!RETURN_VALUE_UNUSED(result)) {
EX_T(result->u.var).var.ptr = z;
zend_free_op free_op2, free_op_data2, free_op_data1;
zval **var_ptr;
zval *value;
- zend_bool increment_opline = 0;
switch (opline->extended_value) {
case ZEND_ASSIGN_OBJ:
return zend_binary_assign_op_obj_helper_SPEC_CV_VAR(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
break;
case ZEND_ASSIGN_DIM: {
- zval **object_ptr = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
+ zval **container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_RW TSRMLS_CC);
- if (object_ptr && IS_CV != IS_CV && !0) {
- Z_ADDREF_PP(object_ptr); /* undo the effect of get_obj_zval_ptr_ptr() */
- }
-
- if (object_ptr && Z_TYPE_PP(object_ptr) == IS_OBJECT) {
+ if (IS_CV == IS_VAR && !container) {
+ zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ } else if (Z_TYPE_PP(container) == IS_OBJECT) {
+ if (IS_CV == IS_VAR && !0) {
+ Z_ADDREF_PP(container); /* undo the effect of get_obj_zval_ptr_ptr() */
+ }
return zend_binary_assign_op_obj_helper_SPEC_CV_VAR(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
} else {
zend_op *op_data = opline+1;
zval *dim = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
- zval **container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_RW TSRMLS_CC);
- if (IS_CV == IS_VAR && !container) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
- }
zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), container, dim, 0, BP_VAR_RW TSRMLS_CC);
value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
var_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
- increment_opline = 1;
+ ZEND_VM_INC_OPCODE();
}
}
break;
}
if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
- if (increment_opline) {
- ZEND_VM_INC_OPCODE();
- }
ZEND_VM_NEXT_OPCODE();
}
}
if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
- if (increment_opline) {
- ZEND_VM_INC_OPCODE();
+ if (opline->extended_value == ZEND_ASSIGN_DIM) {
FREE_OP(free_op_data1);
FREE_OP_VAR_PTR(free_op_data2);
}
zval **retval = &EX_T(opline->result.u.var).var.ptr;
int have_get_ptr = 0;
+ if (IS_CV == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ }
+
make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
object = *object_ptr;
zval *retval = &EX_T(opline->result.u.var).tmp_var;
int have_get_ptr = 0;
+ if (IS_CV == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ }
+
make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
object = *object_ptr;
zend_free_op free_op2;
zval *offset = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
- if (container == EG(error_zval_ptr)) {
- if (!RETURN_VALUE_UNUSED(&opline->result)) {
- AI_SET_PTR(EX_T(opline->result.u.var).var, EG(error_zval_ptr));
- PZVAL_LOCK(EG(error_zval_ptr));
- }
- if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
-
- ZEND_VM_NEXT_OPCODE();
- }
-
-
if (Z_TYPE_P(container) != IS_OBJECT || !Z_OBJ_HT_P(container)->read_property) {
if (type != BP_VAR_IS) {
zend_error(E_NOTICE, "Trying to get property of non-object");
zend_op *opline = EX(opline);
zend_op *op_data = opline+1;
- zval **object_ptr;
+ zval **object_ptr = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
- if (IS_CV == IS_CV || EX_T(opline->op1.u.var).var.ptr_ptr) {
- /* not an array offset */
- object_ptr = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
- } else {
- object_ptr = NULL;
+ if (IS_CV == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
}
-
- if (object_ptr && Z_TYPE_PP(object_ptr) == IS_OBJECT) {
+ if (Z_TYPE_PP(object_ptr) == IS_OBJECT) {
zend_free_op free_op2;
zval *property_name = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
zval *dim = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
zval **variable_ptr_ptr;
- if (IS_CV == IS_VAR && !object_ptr) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
- }
zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), object_ptr, dim, 0, BP_VAR_W TSRMLS_CC);
if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
zval *value = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
zval **variable_ptr_ptr = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
- if (!variable_ptr_ptr) {
+ if (IS_CV == IS_VAR && !variable_ptr_ptr) {
if (zend_assign_to_string_offset(&EX_T(opline->op1.u.var), value, IS_VAR TSRMLS_CC)) {
if (!RETURN_VALUE_UNUSED(&opline->result)) {
EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
zval *offset = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
long index;
- if (container) {
+ if (IS_CV != IS_VAR || container) {
if (IS_CV == IS_CV && container != &EG(uninitialized_zval_ptr)) {
SEPARATE_ZVAL_IF_NOT_REF(container);
}
zval **container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_UNSET TSRMLS_CC);
zval *offset = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
- if (container) {
+ if (IS_CV != IS_VAR || container) {
if (IS_CV == IS_CV && container != &EG(uninitialized_zval_ptr)) {
SEPARATE_ZVAL_IF_NOT_REF(container);
}
int result = 0;
long index;
- if (container) {
+ if (IS_CV != IS_VAR || container) {
zend_free_op free_op2;
zval *offset = _get_zval_ptr_var(&opline->op2, EX(Ts), &free_op2 TSRMLS_CC);
znode *result = &opline->result;
int have_get_ptr = 0;
+ if (IS_CV == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ }
+
make_real_object(object_ptr TSRMLS_CC);
object = *object_ptr;
if (!have_get_ptr) {
zval *z = NULL;
- switch (opline->extended_value) {
- case ZEND_ASSIGN_OBJ:
- if (Z_OBJ_HT_P(object)->read_property) {
- z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R TSRMLS_CC);
- }
- break;
- case ZEND_ASSIGN_DIM:
- if (Z_OBJ_HT_P(object)->read_dimension) {
- z = Z_OBJ_HT_P(object)->read_dimension(object, property, BP_VAR_R TSRMLS_CC);
- }
- break;
+ if (opline->extended_value == ZEND_ASSIGN_OBJ) {
+ if (Z_OBJ_HT_P(object)->read_property) {
+ z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R TSRMLS_CC);
+ }
+ } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
+ if (Z_OBJ_HT_P(object)->read_dimension) {
+ z = Z_OBJ_HT_P(object)->read_dimension(object, property, BP_VAR_R TSRMLS_CC);
+ }
}
if (z) {
if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
Z_ADDREF_P(z);
SEPARATE_ZVAL_IF_NOT_REF(&z);
binary_op(z, z, value TSRMLS_CC);
- switch (opline->extended_value) {
- case ZEND_ASSIGN_OBJ:
- Z_OBJ_HT_P(object)->write_property(object, property, z TSRMLS_CC);
- break;
- case ZEND_ASSIGN_DIM:
- Z_OBJ_HT_P(object)->write_dimension(object, property, z TSRMLS_CC);
- break;
+ if (opline->extended_value == ZEND_ASSIGN_OBJ) {
+ Z_OBJ_HT_P(object)->write_property(object, property, z TSRMLS_CC);
+ } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
+ Z_OBJ_HT_P(object)->write_dimension(object, property, z TSRMLS_CC);
}
if (!RETURN_VALUE_UNUSED(result)) {
EX_T(result->u.var).var.ptr = z;
zend_free_op free_op_data2, free_op_data1;
zval **var_ptr;
zval *value;
- zend_bool increment_opline = 0;
switch (opline->extended_value) {
case ZEND_ASSIGN_OBJ:
return zend_binary_assign_op_obj_helper_SPEC_CV_UNUSED(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
break;
case ZEND_ASSIGN_DIM: {
- zval **object_ptr = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
-
- if (object_ptr && IS_CV != IS_CV && !0) {
- Z_ADDREF_PP(object_ptr); /* undo the effect of get_obj_zval_ptr_ptr() */
- }
+ zval **container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_RW TSRMLS_CC);
- if (object_ptr && Z_TYPE_PP(object_ptr) == IS_OBJECT) {
+ if (IS_CV == IS_VAR && !container) {
+ zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ } else if (Z_TYPE_PP(container) == IS_OBJECT) {
+ if (IS_CV == IS_VAR && !0) {
+ Z_ADDREF_PP(container); /* undo the effect of get_obj_zval_ptr_ptr() */
+ }
return zend_binary_assign_op_obj_helper_SPEC_CV_UNUSED(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
} else {
zend_op *op_data = opline+1;
zval *dim = NULL;
- zval **container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_RW TSRMLS_CC);
- if (IS_CV == IS_VAR && !container) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
- }
zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), container, dim, 0, BP_VAR_RW TSRMLS_CC);
value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
var_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
- increment_opline = 1;
+ ZEND_VM_INC_OPCODE();
}
}
break;
}
- if (increment_opline) {
- ZEND_VM_INC_OPCODE();
- }
ZEND_VM_NEXT_OPCODE();
}
PZVAL_LOCK(*var_ptr);
}
- if (increment_opline) {
- ZEND_VM_INC_OPCODE();
+ if (opline->extended_value == ZEND_ASSIGN_DIM) {
FREE_OP(free_op_data1);
FREE_OP_VAR_PTR(free_op_data2);
}
zend_op *opline = EX(opline);
zend_op *op_data = opline+1;
- zval **object_ptr;
+ zval **object_ptr = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
- if (IS_CV == IS_CV || EX_T(opline->op1.u.var).var.ptr_ptr) {
- /* not an array offset */
- object_ptr = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
- } else {
- object_ptr = NULL;
+ if (IS_CV == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
}
-
- if (object_ptr && Z_TYPE_PP(object_ptr) == IS_OBJECT) {
+ if (Z_TYPE_PP(object_ptr) == IS_OBJECT) {
zval *property_name = NULL;
zval *dim = NULL;
zval **variable_ptr_ptr;
- if (IS_CV == IS_VAR && !object_ptr) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
- }
zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), object_ptr, dim, 0, BP_VAR_W TSRMLS_CC);
value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
znode *result = &opline->result;
int have_get_ptr = 0;
+ if (IS_CV == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ }
+
make_real_object(object_ptr TSRMLS_CC);
object = *object_ptr;
if (!have_get_ptr) {
zval *z = NULL;
- switch (opline->extended_value) {
- case ZEND_ASSIGN_OBJ:
- if (Z_OBJ_HT_P(object)->read_property) {
- z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R TSRMLS_CC);
- }
- break;
- case ZEND_ASSIGN_DIM:
- if (Z_OBJ_HT_P(object)->read_dimension) {
- z = Z_OBJ_HT_P(object)->read_dimension(object, property, BP_VAR_R TSRMLS_CC);
- }
- break;
+ if (opline->extended_value == ZEND_ASSIGN_OBJ) {
+ if (Z_OBJ_HT_P(object)->read_property) {
+ z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R TSRMLS_CC);
+ }
+ } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
+ if (Z_OBJ_HT_P(object)->read_dimension) {
+ z = Z_OBJ_HT_P(object)->read_dimension(object, property, BP_VAR_R TSRMLS_CC);
+ }
}
if (z) {
if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
Z_ADDREF_P(z);
SEPARATE_ZVAL_IF_NOT_REF(&z);
binary_op(z, z, value TSRMLS_CC);
- switch (opline->extended_value) {
- case ZEND_ASSIGN_OBJ:
- Z_OBJ_HT_P(object)->write_property(object, property, z TSRMLS_CC);
- break;
- case ZEND_ASSIGN_DIM:
- Z_OBJ_HT_P(object)->write_dimension(object, property, z TSRMLS_CC);
- break;
+ if (opline->extended_value == ZEND_ASSIGN_OBJ) {
+ Z_OBJ_HT_P(object)->write_property(object, property, z TSRMLS_CC);
+ } else /* if (opline->extended_value == ZEND_ASSIGN_DIM) */ {
+ Z_OBJ_HT_P(object)->write_dimension(object, property, z TSRMLS_CC);
}
if (!RETURN_VALUE_UNUSED(result)) {
EX_T(result->u.var).var.ptr = z;
zend_free_op free_op_data2, free_op_data1;
zval **var_ptr;
zval *value;
- zend_bool increment_opline = 0;
switch (opline->extended_value) {
case ZEND_ASSIGN_OBJ:
return zend_binary_assign_op_obj_helper_SPEC_CV_CV(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
break;
case ZEND_ASSIGN_DIM: {
- zval **object_ptr = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
+ zval **container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_RW TSRMLS_CC);
- if (object_ptr && IS_CV != IS_CV && !0) {
- Z_ADDREF_PP(object_ptr); /* undo the effect of get_obj_zval_ptr_ptr() */
- }
-
- if (object_ptr && Z_TYPE_PP(object_ptr) == IS_OBJECT) {
+ if (IS_CV == IS_VAR && !container) {
+ zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
+ } else if (Z_TYPE_PP(container) == IS_OBJECT) {
+ if (IS_CV == IS_VAR && !0) {
+ Z_ADDREF_PP(container); /* undo the effect of get_obj_zval_ptr_ptr() */
+ }
return zend_binary_assign_op_obj_helper_SPEC_CV_CV(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
} else {
zend_op *op_data = opline+1;
zval *dim = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
- zval **container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_RW TSRMLS_CC);
- if (IS_CV == IS_VAR && !container) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
- }
zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), container, dim, 0, BP_VAR_RW TSRMLS_CC);
value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
var_ptr = _get_zval_ptr_ptr_var(&op_data->op2, EX(Ts), &free_op_data2 TSRMLS_CC);
- increment_opline = 1;
+ ZEND_VM_INC_OPCODE();
}
}
break;
}
- if (increment_opline) {
- ZEND_VM_INC_OPCODE();
- }
ZEND_VM_NEXT_OPCODE();
}
PZVAL_LOCK(*var_ptr);
}
- if (increment_opline) {
- ZEND_VM_INC_OPCODE();
+ if (opline->extended_value == ZEND_ASSIGN_DIM) {
FREE_OP(free_op_data1);
FREE_OP_VAR_PTR(free_op_data2);
}
zval **retval = &EX_T(opline->result.u.var).var.ptr;
int have_get_ptr = 0;
+ if (IS_CV == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ }
+
make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
object = *object_ptr;
zval *retval = &EX_T(opline->result.u.var).tmp_var;
int have_get_ptr = 0;
+ if (IS_CV == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot increment/decrement overloaded objects nor string offsets");
+ }
+
make_real_object(object_ptr TSRMLS_CC); /* this should modify object only if it's empty */
object = *object_ptr;
zval *offset = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
- if (container == EG(error_zval_ptr)) {
- if (!RETURN_VALUE_UNUSED(&opline->result)) {
- AI_SET_PTR(EX_T(opline->result.u.var).var, EG(error_zval_ptr));
- PZVAL_LOCK(EG(error_zval_ptr));
- }
-
-
- ZEND_VM_NEXT_OPCODE();
- }
-
-
if (Z_TYPE_P(container) != IS_OBJECT || !Z_OBJ_HT_P(container)->read_property) {
if (type != BP_VAR_IS) {
zend_error(E_NOTICE, "Trying to get property of non-object");
zend_op *opline = EX(opline);
zend_op *op_data = opline+1;
- zval **object_ptr;
+ zval **object_ptr = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
- if (IS_CV == IS_CV || EX_T(opline->op1.u.var).var.ptr_ptr) {
- /* not an array offset */
- object_ptr = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
- } else {
- object_ptr = NULL;
+ if (IS_CV == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
}
-
- if (object_ptr && Z_TYPE_PP(object_ptr) == IS_OBJECT) {
+ if (Z_TYPE_PP(object_ptr) == IS_OBJECT) {
zval *property_name = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
zval *dim = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
zval **variable_ptr_ptr;
- if (IS_CV == IS_VAR && !object_ptr) {
- zend_error_noreturn(E_ERROR, "Cannot use string offset as an array");
- }
zend_fetch_dimension_address(&EX_T(op_data->op2.u.var), object_ptr, dim, 0, BP_VAR_W TSRMLS_CC);
value = get_zval_ptr(&op_data->op1, EX(Ts), &free_op_data1, BP_VAR_R);
zval *value = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
zval **variable_ptr_ptr = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
- if (!variable_ptr_ptr) {
+ if (IS_CV == IS_VAR && !variable_ptr_ptr) {
if (zend_assign_to_string_offset(&EX_T(opline->op1.u.var), value, IS_CV TSRMLS_CC)) {
if (!RETURN_VALUE_UNUSED(&opline->result)) {
EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
zval *offset = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
long index;
- if (container) {
+ if (IS_CV != IS_VAR || container) {
if (IS_CV == IS_CV && container != &EG(uninitialized_zval_ptr)) {
SEPARATE_ZVAL_IF_NOT_REF(container);
}
zval **container = _get_zval_ptr_ptr_cv(&opline->op1, EX(Ts), BP_VAR_UNSET TSRMLS_CC);
zval *offset = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);
- if (container) {
+ if (IS_CV != IS_VAR || container) {
if (IS_CV == IS_CV && container != &EG(uninitialized_zval_ptr)) {
SEPARATE_ZVAL_IF_NOT_REF(container);
}
int result = 0;
long index;
- if (container) {
+ if (IS_CV != IS_VAR || container) {
zval *offset = _get_zval_ptr_cv(&opline->op2, EX(Ts), BP_VAR_R TSRMLS_CC);