summaryrefslogtreecommitdiff
path: root/Zend/zend_vm_execute.h
diff options
context:
space:
mode:
Diffstat (limited to 'Zend/zend_vm_execute.h')
-rw-r--r--Zend/zend_vm_execute.h220
1 files changed, 193 insertions, 27 deletions
diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h
index 50176ad13..37b493bb8 100644
--- a/Zend/zend_vm_execute.h
+++ b/Zend/zend_vm_execute.h
@@ -302,7 +302,7 @@ static int zend_do_fcall_common_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS)
EG(This) = current_this;
EG(scope) = current_scope;
}
- zend_ptr_stack_2_pop(&EG(arg_types_stack), (void**)&EX(object), (void**)&EX(fbc));
+ zend_arg_types_stack_2_pop(&EG(arg_types_stack), &EX(object), &EX(fbc));
zend_ptr_stack_clear_multiple(TSRMLS_C);
@@ -562,7 +562,7 @@ static int ZEND_HANDLE_EXCEPTION_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
}
zval_ptr_dtor(&EX(object));
}
- zend_ptr_stack_2_pop(&EG(arg_types_stack), (void**)&EX(object), (void**)&EX(fbc));
+ zend_arg_types_stack_2_pop(&EG(arg_types_stack), &EX(object), &EX(fbc));
}
for (i=0; i<EX(op_array)->last_brk_cont; i++) {
@@ -667,7 +667,7 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_A
ce = EX_T(opline->op1.u.var).class_entry;
if(IS_CONST != IS_UNUSED) {
- char *function_name_strval;
+ char *function_name_strval = NULL;
int function_name_strlen;
zend_bool is_const = (IS_CONST == IS_CONST);
@@ -680,15 +680,17 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_A
if (Z_TYPE_P(function_name) != IS_STRING) {
zend_error_noreturn(E_ERROR, "Function name must be a string");
+ } else {
+ function_name_strval = Z_STRVAL_P(function_name);
+ function_name_strlen = Z_STRLEN_P(function_name);
}
- function_name_strval = zend_str_tolower_dup(function_name->value.str.val, function_name->value.str.len);
- function_name_strlen = function_name->value.str.len;
}
- EX(fbc) = zend_std_get_static_method(ce, function_name_strval, function_name_strlen TSRMLS_CC);
+ if (function_name_strval) {
+ EX(fbc) = zend_std_get_static_method(ce, function_name_strval, function_name_strlen TSRMLS_CC);
+ }
if (!is_const) {
- efree(function_name_strval);
}
} else {
@@ -878,7 +880,7 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARG
ce = EX_T(opline->op1.u.var).class_entry;
if(IS_TMP_VAR != IS_UNUSED) {
- char *function_name_strval;
+ char *function_name_strval = NULL;
int function_name_strlen;
zend_bool is_const = (IS_TMP_VAR == IS_CONST);
zend_free_op free_op2;
@@ -891,15 +893,17 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARG
if (Z_TYPE_P(function_name) != IS_STRING) {
zend_error_noreturn(E_ERROR, "Function name must be a string");
+ } else {
+ function_name_strval = Z_STRVAL_P(function_name);
+ function_name_strlen = Z_STRLEN_P(function_name);
}
- function_name_strval = zend_str_tolower_dup(function_name->value.str.val, function_name->value.str.len);
- function_name_strlen = function_name->value.str.len;
}
- EX(fbc) = zend_std_get_static_method(ce, function_name_strval, function_name_strlen TSRMLS_CC);
+ if (function_name_strval) {
+ EX(fbc) = zend_std_get_static_method(ce, function_name_strval, function_name_strlen TSRMLS_CC);
+ }
if (!is_const) {
- efree(function_name_strval);
zval_dtor(free_op2.var);
}
} else {
@@ -1049,7 +1053,7 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
ce = EX_T(opline->op1.u.var).class_entry;
if(IS_VAR != IS_UNUSED) {
- char *function_name_strval;
+ char *function_name_strval = NULL;
int function_name_strlen;
zend_bool is_const = (IS_VAR == IS_CONST);
zend_free_op free_op2;
@@ -1062,15 +1066,17 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
if (Z_TYPE_P(function_name) != IS_STRING) {
zend_error_noreturn(E_ERROR, "Function name must be a string");
+ } else {
+ function_name_strval = Z_STRVAL_P(function_name);
+ function_name_strlen = Z_STRLEN_P(function_name);
}
- function_name_strval = zend_str_tolower_dup(function_name->value.str.val, function_name->value.str.len);
- function_name_strlen = function_name->value.str.len;
}
- EX(fbc) = zend_std_get_static_method(ce, function_name_strval, function_name_strlen TSRMLS_CC);
+ if (function_name_strval) {
+ EX(fbc) = zend_std_get_static_method(ce, function_name_strval, function_name_strlen TSRMLS_CC);
+ }
if (!is_const) {
- efree(function_name_strval);
if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
}
} else {
@@ -1219,7 +1225,7 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_
ce = EX_T(opline->op1.u.var).class_entry;
if(IS_UNUSED != IS_UNUSED) {
- char *function_name_strval;
+ char *function_name_strval = NULL;
int function_name_strlen;
zend_bool is_const = (IS_UNUSED == IS_CONST);
@@ -1232,15 +1238,17 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_
if (Z_TYPE_P(function_name) != IS_STRING) {
zend_error_noreturn(E_ERROR, "Function name must be a string");
+ } else {
+ function_name_strval = Z_STRVAL_P(function_name);
+ function_name_strlen = Z_STRLEN_P(function_name);
}
- function_name_strval = zend_str_tolower_dup(function_name->value.str.val, function_name->value.str.len);
- function_name_strlen = function_name->value.str.len;
}
- EX(fbc) = zend_std_get_static_method(ce, function_name_strval, function_name_strlen TSRMLS_CC);
+ if (function_name_strval) {
+ EX(fbc) = zend_std_get_static_method(ce, function_name_strval, function_name_strlen TSRMLS_CC);
+ }
if (!is_const) {
- efree(function_name_strval);
}
} else {
@@ -1322,7 +1330,7 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS
ce = EX_T(opline->op1.u.var).class_entry;
if(IS_CV != IS_UNUSED) {
- char *function_name_strval;
+ char *function_name_strval = NULL;
int function_name_strlen;
zend_bool is_const = (IS_CV == IS_CONST);
@@ -1335,15 +1343,17 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS
if (Z_TYPE_P(function_name) != IS_STRING) {
zend_error_noreturn(E_ERROR, "Function name must be a string");
+ } else {
+ function_name_strval = Z_STRVAL_P(function_name);
+ function_name_strlen = Z_STRLEN_P(function_name);
}
- function_name_strval = zend_str_tolower_dup(function_name->value.str.val, function_name->value.str.len);
- function_name_strlen = function_name->value.str.len;
}
- EX(fbc) = zend_std_get_static_method(ce, function_name_strval, function_name_strlen TSRMLS_CC);
+ if (function_name_strval) {
+ EX(fbc) = zend_std_get_static_method(ce, function_name_strval, function_name_strlen TSRMLS_CC);
+ }
if (!is_const) {
- efree(function_name_strval);
}
} else {
@@ -8553,6 +8563,10 @@ static int zend_binary_assign_op_obj_helper_SPEC_VAR_CONST(int (*binary_op)(zval
zval **retval = &EX_T(result->u.var).var.ptr;
int have_get_ptr = 0;
+ if (IS_VAR == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ }
+
EX_T(result->u.var).var.ptr_ptr = NULL;
make_real_object(object_ptr TSRMLS_CC);
object = *object_ptr;
@@ -8803,6 +8817,10 @@ static int zend_pre_incdec_property_helper_SPEC_VAR_CONST(incdec_t incdec_op, ZE
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;
@@ -8895,6 +8913,10 @@ static int zend_post_incdec_property_helper_SPEC_VAR_CONST(incdec_t incdec_op, Z
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;
@@ -10070,6 +10092,10 @@ static int zend_binary_assign_op_obj_helper_SPEC_VAR_TMP(int (*binary_op)(zval *
zval **retval = &EX_T(result->u.var).var.ptr;
int have_get_ptr = 0;
+ if (IS_VAR == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ }
+
EX_T(result->u.var).var.ptr_ptr = NULL;
make_real_object(object_ptr TSRMLS_CC);
object = *object_ptr;
@@ -10321,6 +10347,10 @@ static int zend_pre_incdec_property_helper_SPEC_VAR_TMP(incdec_t incdec_op, ZEND
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;
@@ -10413,6 +10443,10 @@ static int zend_post_incdec_property_helper_SPEC_VAR_TMP(incdec_t incdec_op, ZEN
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;
@@ -11591,6 +11625,10 @@ static int zend_binary_assign_op_obj_helper_SPEC_VAR_VAR(int (*binary_op)(zval *
zval **retval = &EX_T(result->u.var).var.ptr;
int have_get_ptr = 0;
+ if (IS_VAR == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ }
+
EX_T(result->u.var).var.ptr_ptr = NULL;
make_real_object(object_ptr TSRMLS_CC);
object = *object_ptr;
@@ -11842,6 +11880,10 @@ static int zend_pre_incdec_property_helper_SPEC_VAR_VAR(incdec_t incdec_op, ZEND
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;
@@ -11934,6 +11976,10 @@ static int zend_post_incdec_property_helper_SPEC_VAR_VAR(incdec_t incdec_op, ZEN
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;
@@ -12926,6 +12972,10 @@ static int zend_binary_assign_op_obj_helper_SPEC_VAR_UNUSED(int (*binary_op)(zva
zval **retval = &EX_T(result->u.var).var.ptr;
int have_get_ptr = 0;
+ if (IS_VAR == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ }
+
EX_T(result->u.var).var.ptr_ptr = NULL;
make_real_object(object_ptr TSRMLS_CC);
object = *object_ptr;
@@ -13607,6 +13657,10 @@ static int zend_binary_assign_op_obj_helper_SPEC_VAR_CV(int (*binary_op)(zval *r
zval **retval = &EX_T(result->u.var).var.ptr;
int have_get_ptr = 0;
+ if (IS_VAR == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ }
+
EX_T(result->u.var).var.ptr_ptr = NULL;
make_real_object(object_ptr TSRMLS_CC);
object = *object_ptr;
@@ -13857,6 +13911,10 @@ static int zend_pre_incdec_property_helper_SPEC_VAR_CV(incdec_t incdec_op, ZEND_
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;
@@ -13949,6 +14007,10 @@ static int zend_post_incdec_property_helper_SPEC_VAR_CV(incdec_t incdec_op, ZEND
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;
@@ -15017,6 +15079,10 @@ static int zend_binary_assign_op_obj_helper_SPEC_UNUSED_CONST(int (*binary_op)(z
zval **retval = &EX_T(result->u.var).var.ptr;
int have_get_ptr = 0;
+ if (IS_UNUSED == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ }
+
EX_T(result->u.var).var.ptr_ptr = NULL;
make_real_object(object_ptr TSRMLS_CC);
object = *object_ptr;
@@ -15266,6 +15332,10 @@ static int zend_pre_incdec_property_helper_SPEC_UNUSED_CONST(incdec_t incdec_op,
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;
@@ -15358,6 +15428,10 @@ static int zend_post_incdec_property_helper_SPEC_UNUSED_CONST(incdec_t incdec_op
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;
@@ -16041,6 +16115,10 @@ static int zend_binary_assign_op_obj_helper_SPEC_UNUSED_TMP(int (*binary_op)(zva
zval **retval = &EX_T(result->u.var).var.ptr;
int have_get_ptr = 0;
+ if (IS_UNUSED == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ }
+
EX_T(result->u.var).var.ptr_ptr = NULL;
make_real_object(object_ptr TSRMLS_CC);
object = *object_ptr;
@@ -16291,6 +16369,10 @@ static int zend_pre_incdec_property_helper_SPEC_UNUSED_TMP(incdec_t incdec_op, Z
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;
@@ -16383,6 +16465,10 @@ static int zend_post_incdec_property_helper_SPEC_UNUSED_TMP(incdec_t incdec_op,
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;
@@ -17022,6 +17108,10 @@ static int zend_binary_assign_op_obj_helper_SPEC_UNUSED_VAR(int (*binary_op)(zva
zval **retval = &EX_T(result->u.var).var.ptr;
int have_get_ptr = 0;
+ if (IS_UNUSED == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ }
+
EX_T(result->u.var).var.ptr_ptr = NULL;
make_real_object(object_ptr TSRMLS_CC);
object = *object_ptr;
@@ -17272,6 +17362,10 @@ static int zend_pre_incdec_property_helper_SPEC_UNUSED_VAR(incdec_t incdec_op, Z
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;
@@ -17364,6 +17458,10 @@ static int zend_post_incdec_property_helper_SPEC_UNUSED_VAR(incdec_t incdec_op,
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;
@@ -18003,6 +18101,10 @@ static int zend_binary_assign_op_obj_helper_SPEC_UNUSED_UNUSED(int (*binary_op)(
zval **retval = &EX_T(result->u.var).var.ptr;
int have_get_ptr = 0;
+ if (IS_UNUSED == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ }
+
EX_T(result->u.var).var.ptr_ptr = NULL;
make_real_object(object_ptr TSRMLS_CC);
object = *object_ptr;
@@ -18269,6 +18371,10 @@ static int zend_binary_assign_op_obj_helper_SPEC_UNUSED_CV(int (*binary_op)(zval
zval **retval = &EX_T(result->u.var).var.ptr;
int have_get_ptr = 0;
+ if (IS_UNUSED == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ }
+
EX_T(result->u.var).var.ptr_ptr = NULL;
make_real_object(object_ptr TSRMLS_CC);
object = *object_ptr;
@@ -18518,6 +18624,10 @@ static int zend_pre_incdec_property_helper_SPEC_UNUSED_CV(incdec_t incdec_op, ZE
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;
@@ -18610,6 +18720,10 @@ static int zend_post_incdec_property_helper_SPEC_UNUSED_CV(incdec_t incdec_op, Z
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;
@@ -20711,6 +20825,10 @@ static int zend_binary_assign_op_obj_helper_SPEC_CV_CONST(int (*binary_op)(zval
zval **retval = &EX_T(result->u.var).var.ptr;
int have_get_ptr = 0;
+ if (IS_CV == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ }
+
EX_T(result->u.var).var.ptr_ptr = NULL;
make_real_object(object_ptr TSRMLS_CC);
object = *object_ptr;
@@ -20960,6 +21078,10 @@ static int zend_pre_incdec_property_helper_SPEC_CV_CONST(incdec_t incdec_op, ZEN
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;
@@ -21052,6 +21174,10 @@ static int zend_post_incdec_property_helper_SPEC_CV_CONST(incdec_t incdec_op, ZE
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;
@@ -22220,6 +22346,10 @@ static int zend_binary_assign_op_obj_helper_SPEC_CV_TMP(int (*binary_op)(zval *r
zval **retval = &EX_T(result->u.var).var.ptr;
int have_get_ptr = 0;
+ if (IS_CV == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ }
+
EX_T(result->u.var).var.ptr_ptr = NULL;
make_real_object(object_ptr TSRMLS_CC);
object = *object_ptr;
@@ -22470,6 +22600,10 @@ static int zend_pre_incdec_property_helper_SPEC_CV_TMP(incdec_t incdec_op, ZEND_
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;
@@ -22562,6 +22696,10 @@ static int zend_post_incdec_property_helper_SPEC_CV_TMP(incdec_t incdec_op, ZEND
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;
@@ -23733,6 +23871,10 @@ static int zend_binary_assign_op_obj_helper_SPEC_CV_VAR(int (*binary_op)(zval *r
zval **retval = &EX_T(result->u.var).var.ptr;
int have_get_ptr = 0;
+ if (IS_CV == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ }
+
EX_T(result->u.var).var.ptr_ptr = NULL;
make_real_object(object_ptr TSRMLS_CC);
object = *object_ptr;
@@ -23983,6 +24125,10 @@ static int zend_pre_incdec_property_helper_SPEC_CV_VAR(incdec_t incdec_op, ZEND_
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;
@@ -24075,6 +24221,10 @@ static int zend_post_incdec_property_helper_SPEC_CV_VAR(incdec_t incdec_op, ZEND
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;
@@ -25059,6 +25209,10 @@ static int zend_binary_assign_op_obj_helper_SPEC_CV_UNUSED(int (*binary_op)(zval
zval **retval = &EX_T(result->u.var).var.ptr;
int have_get_ptr = 0;
+ if (IS_CV == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ }
+
EX_T(result->u.var).var.ptr_ptr = NULL;
make_real_object(object_ptr TSRMLS_CC);
object = *object_ptr;
@@ -25739,6 +25893,10 @@ static int zend_binary_assign_op_obj_helper_SPEC_CV_CV(int (*binary_op)(zval *re
zval **retval = &EX_T(result->u.var).var.ptr;
int have_get_ptr = 0;
+ if (IS_CV == IS_VAR && !object_ptr) {
+ zend_error_noreturn(E_ERROR, "Cannot use string offset as an object");
+ }
+
EX_T(result->u.var).var.ptr_ptr = NULL;
make_real_object(object_ptr TSRMLS_CC);
object = *object_ptr;
@@ -25988,6 +26146,10 @@ static int zend_pre_incdec_property_helper_SPEC_CV_CV(incdec_t incdec_op, ZEND_O
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;
@@ -26080,6 +26242,10 @@ static int zend_post_incdec_property_helper_SPEC_CV_CV(incdec_t incdec_op, ZEND_
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;