]> granicus.if.org Git - php/commitdiff
Separate slow path with make_real_object() and related code into "cold" function.
authorDmitry Stogov <dmitry@zend.com>
Tue, 20 Feb 2018 14:22:11 +0000 (17:22 +0300)
committerDmitry Stogov <dmitry@zend.com>
Tue, 20 Feb 2018 14:22:11 +0000 (17:22 +0300)
Zend/tests/bug72911.phpt
Zend/zend_execute.c
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

index 84f04eff1e1ca25f5e03bd39fb973b2aa03f4fec..0d290caca7b12216770f41bd5a1f4429a089ce4a 100644 (file)
@@ -12,6 +12,4 @@ var_dump($b);
 ?>
 --EXPECTF--
 Warning: Attempt to modify property 'b' of non-object in %sbug72911.php on line %d
-
-Warning: Attempt to assign property 'i' of non-object in %sbug72911.php on line %d
 NULL
index ee653c9029824f15bfe1f6052c5052c306767bfb..da548d8a2406de91a7120f6358b86cc7b19456ff 100644 (file)
@@ -633,20 +633,55 @@ static inline void zend_assign_to_variable_reference(zval *variable_ptr, zval *v
        ZVAL_REF(variable_ptr, ref);
 }
 
+static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_wrong_property_assignment(zval *property)
+{
+       zend_string *tmp_property_name;
+       zend_string *property_name = zval_get_tmp_string(property, &tmp_property_name);
+       zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
+       zend_tmp_string_release(property_name);
+}
+
 /* this should modify object only if it's empty */
-static inline int make_real_object(zval *object)
+static zend_never_inline ZEND_COLD int ZEND_FASTCALL make_real_object(zval *object, zval *property OPLINE_DC)
 {
-       if (UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
-               if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE)) {
-                       /* nothing to destroy */
-               } else if (EXPECTED((Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
-                       zval_ptr_dtor_nogc(object);
-               } else {
-                       return 0;
+       zend_object *obj;
+
+       if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE)) {
+               /* nothing to destroy */
+       } else if (EXPECTED((Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
+               zval_ptr_dtor_nogc(object);
+       } else {
+               if (opline->op1_type != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
+                       if (opline->opcode == ZEND_PRE_INC_OBJ
+                        || opline->opcode == ZEND_PRE_DEC_OBJ
+                        || opline->opcode == ZEND_POST_INC_OBJ
+                        || opline->opcode == ZEND_POST_DEC_OBJ) {
+                               zend_string *tmp_property_name;
+                               zend_string *property_name = zval_get_tmp_string(property, &tmp_property_name);
+                               zend_error(E_WARNING, "Attempt to increment/decrement property '%s' of non-object", ZSTR_VAL(property_name));
+                               zend_tmp_string_release(property_name);
+                       } else {
+                               zend_wrong_property_assignment(property);
+                       }
+               }
+               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+                       ZVAL_NULL(EX_VAR(opline->result.var));
                }
-               object_init(object);
-               zend_error(E_WARNING, "Creating default object from empty value");
+               return 0;
        }
+       object_init(object);
+       Z_ADDREF_P(object);
+       obj = Z_OBJ_P(object);
+       zend_error(E_WARNING, "Creating default object from empty value");
+       if (GC_REFCOUNT(obj) == 1) {
+               /* the enclosing container was deleted, obj is unreferenced */
+               OBJ_RELEASE(obj);
+               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+                       ZVAL_NULL(EX_VAR(opline->result.var));
+               }
+               return 0;
+       }
+       Z_DELREF_P(object);
        return 1;
 }
 
@@ -1261,22 +1296,6 @@ static zend_never_inline ZEND_COLD void zend_wrong_string_offset(EXECUTE_DATA_D)
        zend_throw_error(NULL, "%s", msg);
 }
 
-static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_wrong_property_assignment(zval *property)
-{
-       zend_string *tmp_property_name;
-       zend_string *property_name = zval_get_tmp_string(property, &tmp_property_name);
-       zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name));
-       zend_tmp_string_release(property_name);
-}
-
-static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_wrong_property_inc_dec(zval *property)
-{
-       zend_string *tmp_property_name;
-       zend_string *property_name = zval_get_tmp_string(property, &tmp_property_name);
-       zend_error(E_WARNING, "Attempt to increment/decrement property '%s' of non-object", ZSTR_VAL(property_name));
-       zend_tmp_string_release(property_name);
-}
-
 static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_wrong_property_read(zval *property)
 {
        zend_string *tmp_property_name;
index 83d46863be862edaa639f99b48ac254b7a3e0c3c..0f61fcd52fa596dd7deb1775ddc7eb9e33b3759d 100644 (file)
@@ -811,17 +811,19 @@ ZEND_VM_HELPER(zend_binary_assign_op_obj_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV,
                value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1);
 
                if (OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
-                       ZVAL_DEREF(object);
-                       if (UNEXPECTED(!make_real_object(object))) {
-                               zend_wrong_property_assignment(property);
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
+                       if (Z_ISREF_P(object)) {
+                               object = Z_REFVAL_P(object);
+                               if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+                                       ZEND_VM_C_GOTO(assign_op_object);
                                }
+                       }
+                       if (UNEXPECTED(!make_real_object(object, property OPLINE_CC))) {
                                break;
                        }
                }
 
                /* here we are sure we are dealing with an object */
+ZEND_VM_C_LABEL(assign_op_object):
                if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr)
                        && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : NULL))) != NULL)) {
                        if (UNEXPECTED(Z_ISERROR_P(zptr))) {
@@ -1068,17 +1070,19 @@ ZEND_VM_HELPER(zend_pre_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV,
 
        do {
                if (OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
-                       ZVAL_DEREF(object);
-                       if (UNEXPECTED(!make_real_object(object))) {
-                               zend_wrong_property_inc_dec(property);
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
+                       if (Z_ISREF_P(object)) {
+                               object = Z_REFVAL_P(object);
+                               if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+                                       ZEND_VM_C_GOTO(pre_incdec_object);
                                }
+                       }
+                       if (UNEXPECTED(!make_real_object(object, property OPLINE_CC))) {
                                break;
                        }
                }
 
                /* here we are sure we are dealing with an object */
+ZEND_VM_C_LABEL(pre_incdec_object):
                if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr)
                        && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL))) != NULL)) {
                        if (UNEXPECTED(Z_ISERROR_P(zptr))) {
@@ -1144,16 +1148,19 @@ ZEND_VM_HELPER(zend_post_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV,
 
        do {
                if (OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
-                       ZVAL_DEREF(object);
-                       if (UNEXPECTED(!make_real_object(object))) {
-                               zend_wrong_property_inc_dec(property);
-                               ZVAL_NULL(EX_VAR(opline->result.var));
+                       if (Z_ISREF_P(object)) {
+                               object = Z_REFVAL_P(object);
+                               if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+                                       ZEND_VM_C_GOTO(post_incdec_object);
+                               }
+                       }
+                       if (UNEXPECTED(!make_real_object(object, property OPLINE_CC))) {
                                break;
                        }
                }
 
                /* here we are sure we are dealing with an object */
-
+ZEND_VM_C_LABEL(post_incdec_object):
                if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr)
                        && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL))) != NULL)) {
                        if (UNEXPECTED(Z_ISERROR_P(zptr))) {
@@ -2125,45 +2132,19 @@ ZEND_VM_HANDLER(136, ZEND_ASSIGN_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE
        value = GET_OP_DATA_ZVAL_PTR(BP_VAR_R);
 
        if (OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
-               do {
-                       if (Z_ISREF_P(object)) {
-                               object = Z_REFVAL_P(object);
-                               if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
-                                       break;
-                               }
+               if (Z_ISREF_P(object)) {
+                       object = Z_REFVAL_P(object);
+                       if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+                               ZEND_VM_C_GOTO(assign_object);
                        }
-                       if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE ||
-                           (Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
-                               zend_object *obj;
-
-                               zval_ptr_dtor_nogc(object);
-                               object_init(object);
-                               Z_ADDREF_P(object);
-                               obj = Z_OBJ_P(object);
-                               zend_error(E_WARNING, "Creating default object from empty value");
-                               if (GC_REFCOUNT(obj) == 1) {
-                                       /* the enclosing container was deleted, obj is unreferenced */
-                                       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                               ZVAL_NULL(EX_VAR(opline->result.var));
-                                       }
-                                       FREE_OP_DATA();
-                                       OBJ_RELEASE(obj);
-                                       ZEND_VM_C_GOTO(exit_assign_obj);
-                               }
-                               Z_DELREF_P(object);
-                       } else {
-                               if (OP1_TYPE != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
-                                       zend_wrong_property_assignment(property);
-                               }
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
-                               }
-                               FREE_OP_DATA();
-                               ZEND_VM_C_GOTO(exit_assign_obj);
-                       }
-               } while (0);
+               }
+               if (UNEXPECTED(!make_real_object(object, property OPLINE_CC))) {
+                       FREE_OP_DATA();
+                       ZEND_VM_C_GOTO(exit_assign_obj);
+               }
        }
 
+ZEND_VM_C_LABEL(assign_object):
        if (OP2_TYPE == IS_CONST &&
            EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) {
                uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*));
index 789c800591f41f4eaae1029d1375fca74020ea6a..a27da3bb665e7bd879774951d1b1c7215d6b1d2b 100644 (file)
@@ -22509,17 +22509,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP
                value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1);
 
                if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
-                       ZVAL_DEREF(object);
-                       if (UNEXPECTED(!make_real_object(object))) {
-                               zend_wrong_property_assignment(property);
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
+                       if (Z_ISREF_P(object)) {
+                               object = Z_REFVAL_P(object);
+                               if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+                                       goto assign_op_object;
                                }
+                       }
+                       if (UNEXPECTED(!make_real_object(object, property OPLINE_CC))) {
                                break;
                        }
                }
 
                /* here we are sure we are dealing with an object */
+assign_op_object:
                if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr)
                        && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : NULL))) != NULL)) {
                        if (UNEXPECTED(Z_ISERROR_P(zptr))) {
@@ -22930,17 +22932,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
 
        do {
                if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
-                       ZVAL_DEREF(object);
-                       if (UNEXPECTED(!make_real_object(object))) {
-                               zend_wrong_property_inc_dec(property);
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
+                       if (Z_ISREF_P(object)) {
+                               object = Z_REFVAL_P(object);
+                               if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+                                       goto pre_incdec_object;
                                }
+                       }
+                       if (UNEXPECTED(!make_real_object(object, property OPLINE_CC))) {
                                break;
                        }
                }
 
                /* here we are sure we are dealing with an object */
+pre_incdec_object:
                if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr)
                        && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL))) != NULL)) {
                        if (UNEXPECTED(Z_ISERROR_P(zptr))) {
@@ -23005,16 +23009,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
 
        do {
                if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
-                       ZVAL_DEREF(object);
-                       if (UNEXPECTED(!make_real_object(object))) {
-                               zend_wrong_property_inc_dec(property);
-                               ZVAL_NULL(EX_VAR(opline->result.var));
+                       if (Z_ISREF_P(object)) {
+                               object = Z_REFVAL_P(object);
+                               if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+                                       goto post_incdec_object;
+                               }
+                       }
+                       if (UNEXPECTED(!make_real_object(object, property OPLINE_CC))) {
                                break;
                        }
                }
 
                /* here we are sure we are dealing with an object */
-
+post_incdec_object:
                if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr)
                        && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL))) != NULL)) {
                        if (UNEXPECTED(Z_ISERROR_P(zptr))) {
@@ -23264,45 +23271,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D
        value = RT_CONSTANT((opline+1), (opline+1)->op1);
 
        if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
-               do {
-                       if (Z_ISREF_P(object)) {
-                               object = Z_REFVAL_P(object);
-                               if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
-                                       break;
-                               }
+               if (Z_ISREF_P(object)) {
+                       object = Z_REFVAL_P(object);
+                       if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+                               goto assign_object;
                        }
-                       if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE ||
-                           (Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
-                               zend_object *obj;
-
-                               zval_ptr_dtor_nogc(object);
-                               object_init(object);
-                               Z_ADDREF_P(object);
-                               obj = Z_OBJ_P(object);
-                               zend_error(E_WARNING, "Creating default object from empty value");
-                               if (GC_REFCOUNT(obj) == 1) {
-                                       /* the enclosing container was deleted, obj is unreferenced */
-                                       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                               ZVAL_NULL(EX_VAR(opline->result.var));
-                                       }
-
-                                       OBJ_RELEASE(obj);
-                                       goto exit_assign_obj;
-                               }
-                               Z_DELREF_P(object);
-                       } else {
-                               if (IS_VAR != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
-                                       zend_wrong_property_assignment(property);
-                               }
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
-                               }
+               }
+               if (UNEXPECTED(!make_real_object(object, property OPLINE_CC))) {
 
-                               goto exit_assign_obj;
-                       }
-               } while (0);
+                       goto exit_assign_obj;
+               }
        }
 
+assign_object:
        if (IS_CONST == IS_CONST &&
            EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) {
                uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*));
@@ -23414,45 +23395,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D
        value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
 
        if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
-               do {
-                       if (Z_ISREF_P(object)) {
-                               object = Z_REFVAL_P(object);
-                               if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
-                                       break;
-                               }
-                       }
-                       if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE ||
-                           (Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
-                               zend_object *obj;
-
-                               zval_ptr_dtor_nogc(object);
-                               object_init(object);
-                               Z_ADDREF_P(object);
-                               obj = Z_OBJ_P(object);
-                               zend_error(E_WARNING, "Creating default object from empty value");
-                               if (GC_REFCOUNT(obj) == 1) {
-                                       /* the enclosing container was deleted, obj is unreferenced */
-                                       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                               ZVAL_NULL(EX_VAR(opline->result.var));
-                                       }
-                                       zval_ptr_dtor_nogc(free_op_data);
-                                       OBJ_RELEASE(obj);
-                                       goto exit_assign_obj;
-                               }
-                               Z_DELREF_P(object);
-                       } else {
-                               if (IS_VAR != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
-                                       zend_wrong_property_assignment(property);
-                               }
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
-                               }
-                               zval_ptr_dtor_nogc(free_op_data);
-                               goto exit_assign_obj;
+               if (Z_ISREF_P(object)) {
+                       object = Z_REFVAL_P(object);
+                       if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+                               goto assign_object;
                        }
-               } while (0);
+               }
+               if (UNEXPECTED(!make_real_object(object, property OPLINE_CC))) {
+                       zval_ptr_dtor_nogc(free_op_data);
+                       goto exit_assign_obj;
+               }
        }
 
+assign_object:
        if (IS_CONST == IS_CONST &&
            EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) {
                uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*));
@@ -23564,45 +23519,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D
        value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
 
        if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
-               do {
-                       if (Z_ISREF_P(object)) {
-                               object = Z_REFVAL_P(object);
-                               if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
-                                       break;
-                               }
+               if (Z_ISREF_P(object)) {
+                       object = Z_REFVAL_P(object);
+                       if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+                               goto assign_object;
                        }
-                       if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE ||
-                           (Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
-                               zend_object *obj;
-
-                               zval_ptr_dtor_nogc(object);
-                               object_init(object);
-                               Z_ADDREF_P(object);
-                               obj = Z_OBJ_P(object);
-                               zend_error(E_WARNING, "Creating default object from empty value");
-                               if (GC_REFCOUNT(obj) == 1) {
-                                       /* the enclosing container was deleted, obj is unreferenced */
-                                       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                               ZVAL_NULL(EX_VAR(opline->result.var));
-                                       }
-                                       zval_ptr_dtor_nogc(free_op_data);
-                                       OBJ_RELEASE(obj);
-                                       goto exit_assign_obj;
-                               }
-                               Z_DELREF_P(object);
-                       } else {
-                               if (IS_VAR != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
-                                       zend_wrong_property_assignment(property);
-                               }
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
-                               }
-                               zval_ptr_dtor_nogc(free_op_data);
-                               goto exit_assign_obj;
-                       }
-               } while (0);
+               }
+               if (UNEXPECTED(!make_real_object(object, property OPLINE_CC))) {
+                       zval_ptr_dtor_nogc(free_op_data);
+                       goto exit_assign_obj;
+               }
        }
 
+assign_object:
        if (IS_CONST == IS_CONST &&
            EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) {
                uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*));
@@ -23714,45 +23643,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D
        value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
 
        if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
-               do {
-                       if (Z_ISREF_P(object)) {
-                               object = Z_REFVAL_P(object);
-                               if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
-                                       break;
-                               }
+               if (Z_ISREF_P(object)) {
+                       object = Z_REFVAL_P(object);
+                       if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+                               goto assign_object;
                        }
-                       if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE ||
-                           (Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
-                               zend_object *obj;
-
-                               zval_ptr_dtor_nogc(object);
-                               object_init(object);
-                               Z_ADDREF_P(object);
-                               obj = Z_OBJ_P(object);
-                               zend_error(E_WARNING, "Creating default object from empty value");
-                               if (GC_REFCOUNT(obj) == 1) {
-                                       /* the enclosing container was deleted, obj is unreferenced */
-                                       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                               ZVAL_NULL(EX_VAR(opline->result.var));
-                                       }
-
-                                       OBJ_RELEASE(obj);
-                                       goto exit_assign_obj;
-                               }
-                               Z_DELREF_P(object);
-                       } else {
-                               if (IS_VAR != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
-                                       zend_wrong_property_assignment(property);
-                               }
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
-                               }
+               }
+               if (UNEXPECTED(!make_real_object(object, property OPLINE_CC))) {
 
-                               goto exit_assign_obj;
-                       }
-               } while (0);
+                       goto exit_assign_obj;
+               }
        }
 
+assign_object:
        if (IS_CONST == IS_CONST &&
            EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) {
                uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*));
@@ -24925,17 +24828,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP
                value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1);
 
                if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
-                       ZVAL_DEREF(object);
-                       if (UNEXPECTED(!make_real_object(object))) {
-                               zend_wrong_property_assignment(property);
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
+                       if (Z_ISREF_P(object)) {
+                               object = Z_REFVAL_P(object);
+                               if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+                                       goto assign_op_object;
                                }
+                       }
+                       if (UNEXPECTED(!make_real_object(object, property OPLINE_CC))) {
                                break;
                        }
                }
 
                /* here we are sure we are dealing with an object */
+assign_op_object:
                if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr)
                        && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : NULL))) != NULL)) {
                        if (UNEXPECTED(Z_ISERROR_P(zptr))) {
@@ -25348,17 +25253,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
 
        do {
                if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
-                       ZVAL_DEREF(object);
-                       if (UNEXPECTED(!make_real_object(object))) {
-                               zend_wrong_property_inc_dec(property);
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
+                       if (Z_ISREF_P(object)) {
+                               object = Z_REFVAL_P(object);
+                               if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+                                       goto pre_incdec_object;
                                }
+                       }
+                       if (UNEXPECTED(!make_real_object(object, property OPLINE_CC))) {
                                break;
                        }
                }
 
                /* here we are sure we are dealing with an object */
+pre_incdec_object:
                if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr)
                        && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL))) != NULL)) {
                        if (UNEXPECTED(Z_ISERROR_P(zptr))) {
@@ -25424,16 +25331,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
 
        do {
                if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
-                       ZVAL_DEREF(object);
-                       if (UNEXPECTED(!make_real_object(object))) {
-                               zend_wrong_property_inc_dec(property);
-                               ZVAL_NULL(EX_VAR(opline->result.var));
+                       if (Z_ISREF_P(object)) {
+                               object = Z_REFVAL_P(object);
+                               if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+                                       goto post_incdec_object;
+                               }
+                       }
+                       if (UNEXPECTED(!make_real_object(object, property OPLINE_CC))) {
                                break;
                        }
                }
 
                /* here we are sure we are dealing with an object */
-
+post_incdec_object:
                if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr)
                        && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL))) != NULL)) {
                        if (UNEXPECTED(Z_ISERROR_P(zptr))) {
@@ -25685,45 +25595,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_
        value = RT_CONSTANT((opline+1), (opline+1)->op1);
 
        if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
-               do {
-                       if (Z_ISREF_P(object)) {
-                               object = Z_REFVAL_P(object);
-                               if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
-                                       break;
-                               }
+               if (Z_ISREF_P(object)) {
+                       object = Z_REFVAL_P(object);
+                       if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+                               goto assign_object;
                        }
-                       if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE ||
-                           (Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
-                               zend_object *obj;
-
-                               zval_ptr_dtor_nogc(object);
-                               object_init(object);
-                               Z_ADDREF_P(object);
-                               obj = Z_OBJ_P(object);
-                               zend_error(E_WARNING, "Creating default object from empty value");
-                               if (GC_REFCOUNT(obj) == 1) {
-                                       /* the enclosing container was deleted, obj is unreferenced */
-                                       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                               ZVAL_NULL(EX_VAR(opline->result.var));
-                                       }
-
-                                       OBJ_RELEASE(obj);
-                                       goto exit_assign_obj;
-                               }
-                               Z_DELREF_P(object);
-                       } else {
-                               if (IS_VAR != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
-                                       zend_wrong_property_assignment(property);
-                               }
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
-                               }
+               }
+               if (UNEXPECTED(!make_real_object(object, property OPLINE_CC))) {
 
-                               goto exit_assign_obj;
-                       }
-               } while (0);
+                       goto exit_assign_obj;
+               }
        }
 
+assign_object:
        if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
            EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) {
                uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*));
@@ -25835,45 +25719,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_
        value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
 
        if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
-               do {
-                       if (Z_ISREF_P(object)) {
-                               object = Z_REFVAL_P(object);
-                               if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
-                                       break;
-                               }
-                       }
-                       if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE ||
-                           (Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
-                               zend_object *obj;
-
-                               zval_ptr_dtor_nogc(object);
-                               object_init(object);
-                               Z_ADDREF_P(object);
-                               obj = Z_OBJ_P(object);
-                               zend_error(E_WARNING, "Creating default object from empty value");
-                               if (GC_REFCOUNT(obj) == 1) {
-                                       /* the enclosing container was deleted, obj is unreferenced */
-                                       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                               ZVAL_NULL(EX_VAR(opline->result.var));
-                                       }
-                                       zval_ptr_dtor_nogc(free_op_data);
-                                       OBJ_RELEASE(obj);
-                                       goto exit_assign_obj;
-                               }
-                               Z_DELREF_P(object);
-                       } else {
-                               if (IS_VAR != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
-                                       zend_wrong_property_assignment(property);
-                               }
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
-                               }
-                               zval_ptr_dtor_nogc(free_op_data);
-                               goto exit_assign_obj;
+               if (Z_ISREF_P(object)) {
+                       object = Z_REFVAL_P(object);
+                       if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+                               goto assign_object;
                        }
-               } while (0);
+               }
+               if (UNEXPECTED(!make_real_object(object, property OPLINE_CC))) {
+                       zval_ptr_dtor_nogc(free_op_data);
+                       goto exit_assign_obj;
+               }
        }
 
+assign_object:
        if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
            EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) {
                uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*));
@@ -25985,45 +25843,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_
        value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
 
        if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
-               do {
-                       if (Z_ISREF_P(object)) {
-                               object = Z_REFVAL_P(object);
-                               if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
-                                       break;
-                               }
-                       }
-                       if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE ||
-                           (Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
-                               zend_object *obj;
-
-                               zval_ptr_dtor_nogc(object);
-                               object_init(object);
-                               Z_ADDREF_P(object);
-                               obj = Z_OBJ_P(object);
-                               zend_error(E_WARNING, "Creating default object from empty value");
-                               if (GC_REFCOUNT(obj) == 1) {
-                                       /* the enclosing container was deleted, obj is unreferenced */
-                                       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                               ZVAL_NULL(EX_VAR(opline->result.var));
-                                       }
-                                       zval_ptr_dtor_nogc(free_op_data);
-                                       OBJ_RELEASE(obj);
-                                       goto exit_assign_obj;
-                               }
-                               Z_DELREF_P(object);
-                       } else {
-                               if (IS_VAR != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
-                                       zend_wrong_property_assignment(property);
-                               }
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
-                               }
-                               zval_ptr_dtor_nogc(free_op_data);
-                               goto exit_assign_obj;
+               if (Z_ISREF_P(object)) {
+                       object = Z_REFVAL_P(object);
+                       if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+                               goto assign_object;
                        }
-               } while (0);
+               }
+               if (UNEXPECTED(!make_real_object(object, property OPLINE_CC))) {
+                       zval_ptr_dtor_nogc(free_op_data);
+                       goto exit_assign_obj;
+               }
        }
 
+assign_object:
        if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
            EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) {
                uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*));
@@ -26135,45 +25967,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_
        value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
 
        if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
-               do {
-                       if (Z_ISREF_P(object)) {
-                               object = Z_REFVAL_P(object);
-                               if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
-                                       break;
-                               }
+               if (Z_ISREF_P(object)) {
+                       object = Z_REFVAL_P(object);
+                       if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+                               goto assign_object;
                        }
-                       if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE ||
-                           (Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
-                               zend_object *obj;
-
-                               zval_ptr_dtor_nogc(object);
-                               object_init(object);
-                               Z_ADDREF_P(object);
-                               obj = Z_OBJ_P(object);
-                               zend_error(E_WARNING, "Creating default object from empty value");
-                               if (GC_REFCOUNT(obj) == 1) {
-                                       /* the enclosing container was deleted, obj is unreferenced */
-                                       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                               ZVAL_NULL(EX_VAR(opline->result.var));
-                                       }
-
-                                       OBJ_RELEASE(obj);
-                                       goto exit_assign_obj;
-                               }
-                               Z_DELREF_P(object);
-                       } else {
-                               if (IS_VAR != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
-                                       zend_wrong_property_assignment(property);
-                               }
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
-                               }
+               }
+               if (UNEXPECTED(!make_real_object(object, property OPLINE_CC))) {
 
-                               goto exit_assign_obj;
-                       }
-               } while (0);
+                       goto exit_assign_obj;
+               }
        }
 
+assign_object:
        if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
            EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) {
                uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*));
@@ -28824,17 +28630,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP
                value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1);
 
                if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
-                       ZVAL_DEREF(object);
-                       if (UNEXPECTED(!make_real_object(object))) {
-                               zend_wrong_property_assignment(property);
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
+                       if (Z_ISREF_P(object)) {
+                               object = Z_REFVAL_P(object);
+                               if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+                                       goto assign_op_object;
                                }
+                       }
+                       if (UNEXPECTED(!make_real_object(object, property OPLINE_CC))) {
                                break;
                        }
                }
 
                /* here we are sure we are dealing with an object */
+assign_op_object:
                if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr)
                        && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : NULL))) != NULL)) {
                        if (UNEXPECTED(Z_ISERROR_P(zptr))) {
@@ -29245,17 +29053,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
 
        do {
                if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
-                       ZVAL_DEREF(object);
-                       if (UNEXPECTED(!make_real_object(object))) {
-                               zend_wrong_property_inc_dec(property);
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
+                       if (Z_ISREF_P(object)) {
+                               object = Z_REFVAL_P(object);
+                               if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+                                       goto pre_incdec_object;
                                }
+                       }
+                       if (UNEXPECTED(!make_real_object(object, property OPLINE_CC))) {
                                break;
                        }
                }
 
                /* here we are sure we are dealing with an object */
+pre_incdec_object:
                if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr)
                        && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL))) != NULL)) {
                        if (UNEXPECTED(Z_ISERROR_P(zptr))) {
@@ -29320,16 +29130,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
 
        do {
                if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
-                       ZVAL_DEREF(object);
-                       if (UNEXPECTED(!make_real_object(object))) {
-                               zend_wrong_property_inc_dec(property);
-                               ZVAL_NULL(EX_VAR(opline->result.var));
+                       if (Z_ISREF_P(object)) {
+                               object = Z_REFVAL_P(object);
+                               if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+                                       goto post_incdec_object;
+                               }
+                       }
+                       if (UNEXPECTED(!make_real_object(object, property OPLINE_CC))) {
                                break;
                        }
                }
 
                /* here we are sure we are dealing with an object */
-
+post_incdec_object:
                if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr)
                        && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL))) != NULL)) {
                        if (UNEXPECTED(Z_ISERROR_P(zptr))) {
@@ -29579,45 +29392,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA
        value = RT_CONSTANT((opline+1), (opline+1)->op1);
 
        if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
-               do {
-                       if (Z_ISREF_P(object)) {
-                               object = Z_REFVAL_P(object);
-                               if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
-                                       break;
-                               }
+               if (Z_ISREF_P(object)) {
+                       object = Z_REFVAL_P(object);
+                       if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+                               goto assign_object;
                        }
-                       if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE ||
-                           (Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
-                               zend_object *obj;
-
-                               zval_ptr_dtor_nogc(object);
-                               object_init(object);
-                               Z_ADDREF_P(object);
-                               obj = Z_OBJ_P(object);
-                               zend_error(E_WARNING, "Creating default object from empty value");
-                               if (GC_REFCOUNT(obj) == 1) {
-                                       /* the enclosing container was deleted, obj is unreferenced */
-                                       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                               ZVAL_NULL(EX_VAR(opline->result.var));
-                                       }
-
-                                       OBJ_RELEASE(obj);
-                                       goto exit_assign_obj;
-                               }
-                               Z_DELREF_P(object);
-                       } else {
-                               if (IS_VAR != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
-                                       zend_wrong_property_assignment(property);
-                               }
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
-                               }
+               }
+               if (UNEXPECTED(!make_real_object(object, property OPLINE_CC))) {
 
-                               goto exit_assign_obj;
-                       }
-               } while (0);
+                       goto exit_assign_obj;
+               }
        }
 
+assign_object:
        if (IS_CV == IS_CONST &&
            EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) {
                uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*));
@@ -29729,45 +29516,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA
        value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
 
        if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
-               do {
-                       if (Z_ISREF_P(object)) {
-                               object = Z_REFVAL_P(object);
-                               if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
-                                       break;
-                               }
+               if (Z_ISREF_P(object)) {
+                       object = Z_REFVAL_P(object);
+                       if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+                               goto assign_object;
                        }
-                       if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE ||
-                           (Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
-                               zend_object *obj;
-
-                               zval_ptr_dtor_nogc(object);
-                               object_init(object);
-                               Z_ADDREF_P(object);
-                               obj = Z_OBJ_P(object);
-                               zend_error(E_WARNING, "Creating default object from empty value");
-                               if (GC_REFCOUNT(obj) == 1) {
-                                       /* the enclosing container was deleted, obj is unreferenced */
-                                       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                               ZVAL_NULL(EX_VAR(opline->result.var));
-                                       }
-                                       zval_ptr_dtor_nogc(free_op_data);
-                                       OBJ_RELEASE(obj);
-                                       goto exit_assign_obj;
-                               }
-                               Z_DELREF_P(object);
-                       } else {
-                               if (IS_VAR != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
-                                       zend_wrong_property_assignment(property);
-                               }
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
-                               }
-                               zval_ptr_dtor_nogc(free_op_data);
-                               goto exit_assign_obj;
-                       }
-               } while (0);
+               }
+               if (UNEXPECTED(!make_real_object(object, property OPLINE_CC))) {
+                       zval_ptr_dtor_nogc(free_op_data);
+                       goto exit_assign_obj;
+               }
        }
 
+assign_object:
        if (IS_CV == IS_CONST &&
            EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) {
                uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*));
@@ -29879,45 +29640,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA
        value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
 
        if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
-               do {
-                       if (Z_ISREF_P(object)) {
-                               object = Z_REFVAL_P(object);
-                               if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
-                                       break;
-                               }
-                       }
-                       if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE ||
-                           (Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
-                               zend_object *obj;
-
-                               zval_ptr_dtor_nogc(object);
-                               object_init(object);
-                               Z_ADDREF_P(object);
-                               obj = Z_OBJ_P(object);
-                               zend_error(E_WARNING, "Creating default object from empty value");
-                               if (GC_REFCOUNT(obj) == 1) {
-                                       /* the enclosing container was deleted, obj is unreferenced */
-                                       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                               ZVAL_NULL(EX_VAR(opline->result.var));
-                                       }
-                                       zval_ptr_dtor_nogc(free_op_data);
-                                       OBJ_RELEASE(obj);
-                                       goto exit_assign_obj;
-                               }
-                               Z_DELREF_P(object);
-                       } else {
-                               if (IS_VAR != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
-                                       zend_wrong_property_assignment(property);
-                               }
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
-                               }
-                               zval_ptr_dtor_nogc(free_op_data);
-                               goto exit_assign_obj;
+               if (Z_ISREF_P(object)) {
+                       object = Z_REFVAL_P(object);
+                       if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+                               goto assign_object;
                        }
-               } while (0);
+               }
+               if (UNEXPECTED(!make_real_object(object, property OPLINE_CC))) {
+                       zval_ptr_dtor_nogc(free_op_data);
+                       goto exit_assign_obj;
+               }
        }
 
+assign_object:
        if (IS_CV == IS_CONST &&
            EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) {
                uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*));
@@ -30029,45 +29764,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA
        value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
 
        if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
-               do {
-                       if (Z_ISREF_P(object)) {
-                               object = Z_REFVAL_P(object);
-                               if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
-                                       break;
-                               }
+               if (Z_ISREF_P(object)) {
+                       object = Z_REFVAL_P(object);
+                       if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+                               goto assign_object;
                        }
-                       if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE ||
-                           (Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
-                               zend_object *obj;
-
-                               zval_ptr_dtor_nogc(object);
-                               object_init(object);
-                               Z_ADDREF_P(object);
-                               obj = Z_OBJ_P(object);
-                               zend_error(E_WARNING, "Creating default object from empty value");
-                               if (GC_REFCOUNT(obj) == 1) {
-                                       /* the enclosing container was deleted, obj is unreferenced */
-                                       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                               ZVAL_NULL(EX_VAR(opline->result.var));
-                                       }
-
-                                       OBJ_RELEASE(obj);
-                                       goto exit_assign_obj;
-                               }
-                               Z_DELREF_P(object);
-                       } else {
-                               if (IS_VAR != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
-                                       zend_wrong_property_assignment(property);
-                               }
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
-                               }
+               }
+               if (UNEXPECTED(!make_real_object(object, property OPLINE_CC))) {
 
-                               goto exit_assign_obj;
-                       }
-               } while (0);
+                       goto exit_assign_obj;
+               }
        }
 
+assign_object:
        if (IS_CV == IS_CONST &&
            EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) {
                uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*));
@@ -31479,17 +31188,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP
                value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1);
 
                if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
-                       ZVAL_DEREF(object);
-                       if (UNEXPECTED(!make_real_object(object))) {
-                               zend_wrong_property_assignment(property);
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
+                       if (Z_ISREF_P(object)) {
+                               object = Z_REFVAL_P(object);
+                               if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+                                       goto assign_op_object;
                                }
+                       }
+                       if (UNEXPECTED(!make_real_object(object, property OPLINE_CC))) {
                                break;
                        }
                }
 
                /* here we are sure we are dealing with an object */
+assign_op_object:
                if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr)
                        && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : NULL))) != NULL)) {
                        if (UNEXPECTED(Z_ISERROR_P(zptr))) {
@@ -31618,17 +31329,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
 
        do {
                if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
-                       ZVAL_DEREF(object);
-                       if (UNEXPECTED(!make_real_object(object))) {
-                               zend_wrong_property_inc_dec(property);
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
+                       if (Z_ISREF_P(object)) {
+                               object = Z_REFVAL_P(object);
+                               if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+                                       goto pre_incdec_object;
                                }
+                       }
+                       if (UNEXPECTED(!make_real_object(object, property OPLINE_CC))) {
                                break;
                        }
                }
 
                /* here we are sure we are dealing with an object */
+pre_incdec_object:
                if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr)
                        && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL))) != NULL)) {
                        if (UNEXPECTED(Z_ISERROR_P(zptr))) {
@@ -31693,16 +31406,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
 
        do {
                if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
-                       ZVAL_DEREF(object);
-                       if (UNEXPECTED(!make_real_object(object))) {
-                               zend_wrong_property_inc_dec(property);
-                               ZVAL_NULL(EX_VAR(opline->result.var));
+                       if (Z_ISREF_P(object)) {
+                               object = Z_REFVAL_P(object);
+                               if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+                                       goto post_incdec_object;
+                               }
+                       }
+                       if (UNEXPECTED(!make_real_object(object, property OPLINE_CC))) {
                                break;
                        }
                }
 
                /* here we are sure we are dealing with an object */
-
+post_incdec_object:
                if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr)
                        && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL))) != NULL)) {
                        if (UNEXPECTED(Z_ISERROR_P(zptr))) {
@@ -32046,45 +31762,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O
        value = RT_CONSTANT((opline+1), (opline+1)->op1);
 
        if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
-               do {
-                       if (Z_ISREF_P(object)) {
-                               object = Z_REFVAL_P(object);
-                               if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
-                                       break;
-                               }
+               if (Z_ISREF_P(object)) {
+                       object = Z_REFVAL_P(object);
+                       if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+                               goto assign_object;
                        }
-                       if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE ||
-                           (Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
-                               zend_object *obj;
-
-                               zval_ptr_dtor_nogc(object);
-                               object_init(object);
-                               Z_ADDREF_P(object);
-                               obj = Z_OBJ_P(object);
-                               zend_error(E_WARNING, "Creating default object from empty value");
-                               if (GC_REFCOUNT(obj) == 1) {
-                                       /* the enclosing container was deleted, obj is unreferenced */
-                                       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                               ZVAL_NULL(EX_VAR(opline->result.var));
-                                       }
-
-                                       OBJ_RELEASE(obj);
-                                       goto exit_assign_obj;
-                               }
-                               Z_DELREF_P(object);
-                       } else {
-                               if (IS_UNUSED != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
-                                       zend_wrong_property_assignment(property);
-                               }
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
-                               }
+               }
+               if (UNEXPECTED(!make_real_object(object, property OPLINE_CC))) {
 
-                               goto exit_assign_obj;
-                       }
-               } while (0);
+                       goto exit_assign_obj;
+               }
        }
 
+assign_object:
        if (IS_CONST == IS_CONST &&
            EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) {
                uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*));
@@ -32196,45 +31886,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O
        value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
 
        if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
-               do {
-                       if (Z_ISREF_P(object)) {
-                               object = Z_REFVAL_P(object);
-                               if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
-                                       break;
-                               }
-                       }
-                       if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE ||
-                           (Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
-                               zend_object *obj;
-
-                               zval_ptr_dtor_nogc(object);
-                               object_init(object);
-                               Z_ADDREF_P(object);
-                               obj = Z_OBJ_P(object);
-                               zend_error(E_WARNING, "Creating default object from empty value");
-                               if (GC_REFCOUNT(obj) == 1) {
-                                       /* the enclosing container was deleted, obj is unreferenced */
-                                       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                               ZVAL_NULL(EX_VAR(opline->result.var));
-                                       }
-                                       zval_ptr_dtor_nogc(free_op_data);
-                                       OBJ_RELEASE(obj);
-                                       goto exit_assign_obj;
-                               }
-                               Z_DELREF_P(object);
-                       } else {
-                               if (IS_UNUSED != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
-                                       zend_wrong_property_assignment(property);
-                               }
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
-                               }
-                               zval_ptr_dtor_nogc(free_op_data);
-                               goto exit_assign_obj;
+               if (Z_ISREF_P(object)) {
+                       object = Z_REFVAL_P(object);
+                       if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+                               goto assign_object;
                        }
-               } while (0);
+               }
+               if (UNEXPECTED(!make_real_object(object, property OPLINE_CC))) {
+                       zval_ptr_dtor_nogc(free_op_data);
+                       goto exit_assign_obj;
+               }
        }
 
+assign_object:
        if (IS_CONST == IS_CONST &&
            EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) {
                uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*));
@@ -32346,45 +32010,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O
        value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
 
        if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
-               do {
-                       if (Z_ISREF_P(object)) {
-                               object = Z_REFVAL_P(object);
-                               if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
-                                       break;
-                               }
-                       }
-                       if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE ||
-                           (Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
-                               zend_object *obj;
-
-                               zval_ptr_dtor_nogc(object);
-                               object_init(object);
-                               Z_ADDREF_P(object);
-                               obj = Z_OBJ_P(object);
-                               zend_error(E_WARNING, "Creating default object from empty value");
-                               if (GC_REFCOUNT(obj) == 1) {
-                                       /* the enclosing container was deleted, obj is unreferenced */
-                                       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                               ZVAL_NULL(EX_VAR(opline->result.var));
-                                       }
-                                       zval_ptr_dtor_nogc(free_op_data);
-                                       OBJ_RELEASE(obj);
-                                       goto exit_assign_obj;
-                               }
-                               Z_DELREF_P(object);
-                       } else {
-                               if (IS_UNUSED != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
-                                       zend_wrong_property_assignment(property);
-                               }
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
-                               }
-                               zval_ptr_dtor_nogc(free_op_data);
-                               goto exit_assign_obj;
+               if (Z_ISREF_P(object)) {
+                       object = Z_REFVAL_P(object);
+                       if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+                               goto assign_object;
                        }
-               } while (0);
+               }
+               if (UNEXPECTED(!make_real_object(object, property OPLINE_CC))) {
+                       zval_ptr_dtor_nogc(free_op_data);
+                       goto exit_assign_obj;
+               }
        }
 
+assign_object:
        if (IS_CONST == IS_CONST &&
            EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) {
                uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*));
@@ -32496,45 +32134,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O
        value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
 
        if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
-               do {
-                       if (Z_ISREF_P(object)) {
-                               object = Z_REFVAL_P(object);
-                               if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
-                                       break;
-                               }
+               if (Z_ISREF_P(object)) {
+                       object = Z_REFVAL_P(object);
+                       if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+                               goto assign_object;
                        }
-                       if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE ||
-                           (Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
-                               zend_object *obj;
-
-                               zval_ptr_dtor_nogc(object);
-                               object_init(object);
-                               Z_ADDREF_P(object);
-                               obj = Z_OBJ_P(object);
-                               zend_error(E_WARNING, "Creating default object from empty value");
-                               if (GC_REFCOUNT(obj) == 1) {
-                                       /* the enclosing container was deleted, obj is unreferenced */
-                                       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                               ZVAL_NULL(EX_VAR(opline->result.var));
-                                       }
-
-                                       OBJ_RELEASE(obj);
-                                       goto exit_assign_obj;
-                               }
-                               Z_DELREF_P(object);
-                       } else {
-                               if (IS_UNUSED != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
-                                       zend_wrong_property_assignment(property);
-                               }
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
-                               }
+               }
+               if (UNEXPECTED(!make_real_object(object, property OPLINE_CC))) {
 
-                               goto exit_assign_obj;
-                       }
-               } while (0);
+                       goto exit_assign_obj;
+               }
        }
 
+assign_object:
        if (IS_CONST == IS_CONST &&
            EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) {
                uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*));
@@ -33334,17 +32946,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP
                value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1);
 
                if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
-                       ZVAL_DEREF(object);
-                       if (UNEXPECTED(!make_real_object(object))) {
-                               zend_wrong_property_assignment(property);
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
+                       if (Z_ISREF_P(object)) {
+                               object = Z_REFVAL_P(object);
+                               if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+                                       goto assign_op_object;
                                }
+                       }
+                       if (UNEXPECTED(!make_real_object(object, property OPLINE_CC))) {
                                break;
                        }
                }
 
                /* here we are sure we are dealing with an object */
+assign_op_object:
                if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr)
                        && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : NULL))) != NULL)) {
                        if (UNEXPECTED(Z_ISERROR_P(zptr))) {
@@ -33473,17 +33087,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
 
        do {
                if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
-                       ZVAL_DEREF(object);
-                       if (UNEXPECTED(!make_real_object(object))) {
-                               zend_wrong_property_inc_dec(property);
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
+                       if (Z_ISREF_P(object)) {
+                               object = Z_REFVAL_P(object);
+                               if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+                                       goto pre_incdec_object;
                                }
+                       }
+                       if (UNEXPECTED(!make_real_object(object, property OPLINE_CC))) {
                                break;
                        }
                }
 
                /* here we are sure we are dealing with an object */
+pre_incdec_object:
                if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr)
                        && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL))) != NULL)) {
                        if (UNEXPECTED(Z_ISERROR_P(zptr))) {
@@ -33549,16 +33165,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
 
        do {
                if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
-                       ZVAL_DEREF(object);
-                       if (UNEXPECTED(!make_real_object(object))) {
-                               zend_wrong_property_inc_dec(property);
-                               ZVAL_NULL(EX_VAR(opline->result.var));
+                       if (Z_ISREF_P(object)) {
+                               object = Z_REFVAL_P(object);
+                               if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+                                       goto post_incdec_object;
+                               }
+                       }
+                       if (UNEXPECTED(!make_real_object(object, property OPLINE_CC))) {
                                break;
                        }
                }
 
                /* here we are sure we are dealing with an object */
-
+post_incdec_object:
                if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr)
                        && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL))) != NULL)) {
                        if (UNEXPECTED(Z_ISERROR_P(zptr))) {
@@ -33905,45 +33524,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_
        value = RT_CONSTANT((opline+1), (opline+1)->op1);
 
        if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
-               do {
-                       if (Z_ISREF_P(object)) {
-                               object = Z_REFVAL_P(object);
-                               if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
-                                       break;
-                               }
+               if (Z_ISREF_P(object)) {
+                       object = Z_REFVAL_P(object);
+                       if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+                               goto assign_object;
                        }
-                       if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE ||
-                           (Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
-                               zend_object *obj;
-
-                               zval_ptr_dtor_nogc(object);
-                               object_init(object);
-                               Z_ADDREF_P(object);
-                               obj = Z_OBJ_P(object);
-                               zend_error(E_WARNING, "Creating default object from empty value");
-                               if (GC_REFCOUNT(obj) == 1) {
-                                       /* the enclosing container was deleted, obj is unreferenced */
-                                       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                               ZVAL_NULL(EX_VAR(opline->result.var));
-                                       }
-
-                                       OBJ_RELEASE(obj);
-                                       goto exit_assign_obj;
-                               }
-                               Z_DELREF_P(object);
-                       } else {
-                               if (IS_UNUSED != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
-                                       zend_wrong_property_assignment(property);
-                               }
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
-                               }
+               }
+               if (UNEXPECTED(!make_real_object(object, property OPLINE_CC))) {
 
-                               goto exit_assign_obj;
-                       }
-               } while (0);
+                       goto exit_assign_obj;
+               }
        }
 
+assign_object:
        if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
            EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) {
                uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*));
@@ -34055,45 +33648,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_
        value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
 
        if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
-               do {
-                       if (Z_ISREF_P(object)) {
-                               object = Z_REFVAL_P(object);
-                               if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
-                                       break;
-                               }
-                       }
-                       if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE ||
-                           (Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
-                               zend_object *obj;
-
-                               zval_ptr_dtor_nogc(object);
-                               object_init(object);
-                               Z_ADDREF_P(object);
-                               obj = Z_OBJ_P(object);
-                               zend_error(E_WARNING, "Creating default object from empty value");
-                               if (GC_REFCOUNT(obj) == 1) {
-                                       /* the enclosing container was deleted, obj is unreferenced */
-                                       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                               ZVAL_NULL(EX_VAR(opline->result.var));
-                                       }
-                                       zval_ptr_dtor_nogc(free_op_data);
-                                       OBJ_RELEASE(obj);
-                                       goto exit_assign_obj;
-                               }
-                               Z_DELREF_P(object);
-                       } else {
-                               if (IS_UNUSED != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
-                                       zend_wrong_property_assignment(property);
-                               }
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
-                               }
-                               zval_ptr_dtor_nogc(free_op_data);
-                               goto exit_assign_obj;
+               if (Z_ISREF_P(object)) {
+                       object = Z_REFVAL_P(object);
+                       if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+                               goto assign_object;
                        }
-               } while (0);
+               }
+               if (UNEXPECTED(!make_real_object(object, property OPLINE_CC))) {
+                       zval_ptr_dtor_nogc(free_op_data);
+                       goto exit_assign_obj;
+               }
        }
 
+assign_object:
        if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
            EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) {
                uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*));
@@ -34205,45 +33772,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_
        value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
 
        if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
-               do {
-                       if (Z_ISREF_P(object)) {
-                               object = Z_REFVAL_P(object);
-                               if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
-                                       break;
-                               }
-                       }
-                       if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE ||
-                           (Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
-                               zend_object *obj;
-
-                               zval_ptr_dtor_nogc(object);
-                               object_init(object);
-                               Z_ADDREF_P(object);
-                               obj = Z_OBJ_P(object);
-                               zend_error(E_WARNING, "Creating default object from empty value");
-                               if (GC_REFCOUNT(obj) == 1) {
-                                       /* the enclosing container was deleted, obj is unreferenced */
-                                       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                               ZVAL_NULL(EX_VAR(opline->result.var));
-                                       }
-                                       zval_ptr_dtor_nogc(free_op_data);
-                                       OBJ_RELEASE(obj);
-                                       goto exit_assign_obj;
-                               }
-                               Z_DELREF_P(object);
-                       } else {
-                               if (IS_UNUSED != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
-                                       zend_wrong_property_assignment(property);
-                               }
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
-                               }
-                               zval_ptr_dtor_nogc(free_op_data);
-                               goto exit_assign_obj;
+               if (Z_ISREF_P(object)) {
+                       object = Z_REFVAL_P(object);
+                       if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+                               goto assign_object;
                        }
-               } while (0);
+               }
+               if (UNEXPECTED(!make_real_object(object, property OPLINE_CC))) {
+                       zval_ptr_dtor_nogc(free_op_data);
+                       goto exit_assign_obj;
+               }
        }
 
+assign_object:
        if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
            EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) {
                uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*));
@@ -34355,45 +33896,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_
        value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
 
        if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
-               do {
-                       if (Z_ISREF_P(object)) {
-                               object = Z_REFVAL_P(object);
-                               if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
-                                       break;
-                               }
+               if (Z_ISREF_P(object)) {
+                       object = Z_REFVAL_P(object);
+                       if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+                               goto assign_object;
                        }
-                       if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE ||
-                           (Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
-                               zend_object *obj;
-
-                               zval_ptr_dtor_nogc(object);
-                               object_init(object);
-                               Z_ADDREF_P(object);
-                               obj = Z_OBJ_P(object);
-                               zend_error(E_WARNING, "Creating default object from empty value");
-                               if (GC_REFCOUNT(obj) == 1) {
-                                       /* the enclosing container was deleted, obj is unreferenced */
-                                       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                               ZVAL_NULL(EX_VAR(opline->result.var));
-                                       }
-
-                                       OBJ_RELEASE(obj);
-                                       goto exit_assign_obj;
-                               }
-                               Z_DELREF_P(object);
-                       } else {
-                               if (IS_UNUSED != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
-                                       zend_wrong_property_assignment(property);
-                               }
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
-                               }
+               }
+               if (UNEXPECTED(!make_real_object(object, property OPLINE_CC))) {
 
-                               goto exit_assign_obj;
-                       }
-               } while (0);
+                       goto exit_assign_obj;
+               }
        }
 
+assign_object:
        if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
            EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) {
                uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*));
@@ -35832,17 +35347,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP
                value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1);
 
                if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
-                       ZVAL_DEREF(object);
-                       if (UNEXPECTED(!make_real_object(object))) {
-                               zend_wrong_property_assignment(property);
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
+                       if (Z_ISREF_P(object)) {
+                               object = Z_REFVAL_P(object);
+                               if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+                                       goto assign_op_object;
                                }
+                       }
+                       if (UNEXPECTED(!make_real_object(object, property OPLINE_CC))) {
                                break;
                        }
                }
 
                /* here we are sure we are dealing with an object */
+assign_op_object:
                if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr)
                        && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : NULL))) != NULL)) {
                        if (UNEXPECTED(Z_ISERROR_P(zptr))) {
@@ -35971,17 +35488,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
 
        do {
                if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
-                       ZVAL_DEREF(object);
-                       if (UNEXPECTED(!make_real_object(object))) {
-                               zend_wrong_property_inc_dec(property);
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
+                       if (Z_ISREF_P(object)) {
+                               object = Z_REFVAL_P(object);
+                               if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+                                       goto pre_incdec_object;
                                }
+                       }
+                       if (UNEXPECTED(!make_real_object(object, property OPLINE_CC))) {
                                break;
                        }
                }
 
                /* here we are sure we are dealing with an object */
+pre_incdec_object:
                if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr)
                        && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL))) != NULL)) {
                        if (UNEXPECTED(Z_ISERROR_P(zptr))) {
@@ -36046,16 +35565,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
 
        do {
                if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
-                       ZVAL_DEREF(object);
-                       if (UNEXPECTED(!make_real_object(object))) {
-                               zend_wrong_property_inc_dec(property);
-                               ZVAL_NULL(EX_VAR(opline->result.var));
+                       if (Z_ISREF_P(object)) {
+                               object = Z_REFVAL_P(object);
+                               if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+                                       goto post_incdec_object;
+                               }
+                       }
+                       if (UNEXPECTED(!make_real_object(object, property OPLINE_CC))) {
                                break;
                        }
                }
 
                /* here we are sure we are dealing with an object */
-
+post_incdec_object:
                if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr)
                        && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL))) != NULL)) {
                        if (UNEXPECTED(Z_ISERROR_P(zptr))) {
@@ -36399,45 +35921,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D
        value = RT_CONSTANT((opline+1), (opline+1)->op1);
 
        if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
-               do {
-                       if (Z_ISREF_P(object)) {
-                               object = Z_REFVAL_P(object);
-                               if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
-                                       break;
-                               }
+               if (Z_ISREF_P(object)) {
+                       object = Z_REFVAL_P(object);
+                       if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+                               goto assign_object;
                        }
-                       if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE ||
-                           (Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
-                               zend_object *obj;
-
-                               zval_ptr_dtor_nogc(object);
-                               object_init(object);
-                               Z_ADDREF_P(object);
-                               obj = Z_OBJ_P(object);
-                               zend_error(E_WARNING, "Creating default object from empty value");
-                               if (GC_REFCOUNT(obj) == 1) {
-                                       /* the enclosing container was deleted, obj is unreferenced */
-                                       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                               ZVAL_NULL(EX_VAR(opline->result.var));
-                                       }
-
-                                       OBJ_RELEASE(obj);
-                                       goto exit_assign_obj;
-                               }
-                               Z_DELREF_P(object);
-                       } else {
-                               if (IS_UNUSED != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
-                                       zend_wrong_property_assignment(property);
-                               }
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
-                               }
+               }
+               if (UNEXPECTED(!make_real_object(object, property OPLINE_CC))) {
 
-                               goto exit_assign_obj;
-                       }
-               } while (0);
+                       goto exit_assign_obj;
+               }
        }
 
+assign_object:
        if (IS_CV == IS_CONST &&
            EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) {
                uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*));
@@ -36549,45 +36045,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D
        value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
 
        if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
-               do {
-                       if (Z_ISREF_P(object)) {
-                               object = Z_REFVAL_P(object);
-                               if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
-                                       break;
-                               }
-                       }
-                       if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE ||
-                           (Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
-                               zend_object *obj;
-
-                               zval_ptr_dtor_nogc(object);
-                               object_init(object);
-                               Z_ADDREF_P(object);
-                               obj = Z_OBJ_P(object);
-                               zend_error(E_WARNING, "Creating default object from empty value");
-                               if (GC_REFCOUNT(obj) == 1) {
-                                       /* the enclosing container was deleted, obj is unreferenced */
-                                       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                               ZVAL_NULL(EX_VAR(opline->result.var));
-                                       }
-                                       zval_ptr_dtor_nogc(free_op_data);
-                                       OBJ_RELEASE(obj);
-                                       goto exit_assign_obj;
-                               }
-                               Z_DELREF_P(object);
-                       } else {
-                               if (IS_UNUSED != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
-                                       zend_wrong_property_assignment(property);
-                               }
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
-                               }
-                               zval_ptr_dtor_nogc(free_op_data);
-                               goto exit_assign_obj;
+               if (Z_ISREF_P(object)) {
+                       object = Z_REFVAL_P(object);
+                       if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+                               goto assign_object;
                        }
-               } while (0);
+               }
+               if (UNEXPECTED(!make_real_object(object, property OPLINE_CC))) {
+                       zval_ptr_dtor_nogc(free_op_data);
+                       goto exit_assign_obj;
+               }
        }
 
+assign_object:
        if (IS_CV == IS_CONST &&
            EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) {
                uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*));
@@ -36699,45 +36169,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D
        value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
 
        if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
-               do {
-                       if (Z_ISREF_P(object)) {
-                               object = Z_REFVAL_P(object);
-                               if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
-                                       break;
-                               }
-                       }
-                       if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE ||
-                           (Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
-                               zend_object *obj;
-
-                               zval_ptr_dtor_nogc(object);
-                               object_init(object);
-                               Z_ADDREF_P(object);
-                               obj = Z_OBJ_P(object);
-                               zend_error(E_WARNING, "Creating default object from empty value");
-                               if (GC_REFCOUNT(obj) == 1) {
-                                       /* the enclosing container was deleted, obj is unreferenced */
-                                       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                               ZVAL_NULL(EX_VAR(opline->result.var));
-                                       }
-                                       zval_ptr_dtor_nogc(free_op_data);
-                                       OBJ_RELEASE(obj);
-                                       goto exit_assign_obj;
-                               }
-                               Z_DELREF_P(object);
-                       } else {
-                               if (IS_UNUSED != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
-                                       zend_wrong_property_assignment(property);
-                               }
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
-                               }
-                               zval_ptr_dtor_nogc(free_op_data);
-                               goto exit_assign_obj;
+               if (Z_ISREF_P(object)) {
+                       object = Z_REFVAL_P(object);
+                       if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+                               goto assign_object;
                        }
-               } while (0);
+               }
+               if (UNEXPECTED(!make_real_object(object, property OPLINE_CC))) {
+                       zval_ptr_dtor_nogc(free_op_data);
+                       goto exit_assign_obj;
+               }
        }
 
+assign_object:
        if (IS_CV == IS_CONST &&
            EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) {
                uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*));
@@ -36849,45 +36293,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D
        value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
 
        if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
-               do {
-                       if (Z_ISREF_P(object)) {
-                               object = Z_REFVAL_P(object);
-                               if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
-                                       break;
-                               }
+               if (Z_ISREF_P(object)) {
+                       object = Z_REFVAL_P(object);
+                       if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+                               goto assign_object;
                        }
-                       if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE ||
-                           (Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
-                               zend_object *obj;
-
-                               zval_ptr_dtor_nogc(object);
-                               object_init(object);
-                               Z_ADDREF_P(object);
-                               obj = Z_OBJ_P(object);
-                               zend_error(E_WARNING, "Creating default object from empty value");
-                               if (GC_REFCOUNT(obj) == 1) {
-                                       /* the enclosing container was deleted, obj is unreferenced */
-                                       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                               ZVAL_NULL(EX_VAR(opline->result.var));
-                                       }
-
-                                       OBJ_RELEASE(obj);
-                                       goto exit_assign_obj;
-                               }
-                               Z_DELREF_P(object);
-                       } else {
-                               if (IS_UNUSED != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
-                                       zend_wrong_property_assignment(property);
-                               }
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
-                               }
+               }
+               if (UNEXPECTED(!make_real_object(object, property OPLINE_CC))) {
 
-                               goto exit_assign_obj;
-                       }
-               } while (0);
+                       goto exit_assign_obj;
+               }
        }
 
+assign_object:
        if (IS_CV == IS_CONST &&
            EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) {
                uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*));
@@ -39988,17 +39406,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP
                value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1);
 
                if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
-                       ZVAL_DEREF(object);
-                       if (UNEXPECTED(!make_real_object(object))) {
-                               zend_wrong_property_assignment(property);
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
+                       if (Z_ISREF_P(object)) {
+                               object = Z_REFVAL_P(object);
+                               if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+                                       goto assign_op_object;
                                }
+                       }
+                       if (UNEXPECTED(!make_real_object(object, property OPLINE_CC))) {
                                break;
                        }
                }
 
                /* here we are sure we are dealing with an object */
+assign_op_object:
                if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr)
                        && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : NULL))) != NULL)) {
                        if (UNEXPECTED(Z_ISERROR_P(zptr))) {
@@ -40409,17 +39829,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
 
        do {
                if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
-                       ZVAL_DEREF(object);
-                       if (UNEXPECTED(!make_real_object(object))) {
-                               zend_wrong_property_inc_dec(property);
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
+                       if (Z_ISREF_P(object)) {
+                               object = Z_REFVAL_P(object);
+                               if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+                                       goto pre_incdec_object;
                                }
+                       }
+                       if (UNEXPECTED(!make_real_object(object, property OPLINE_CC))) {
                                break;
                        }
                }
 
                /* here we are sure we are dealing with an object */
+pre_incdec_object:
                if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr)
                        && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL))) != NULL)) {
                        if (UNEXPECTED(Z_ISERROR_P(zptr))) {
@@ -40484,16 +39906,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
 
        do {
                if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
-                       ZVAL_DEREF(object);
-                       if (UNEXPECTED(!make_real_object(object))) {
-                               zend_wrong_property_inc_dec(property);
-                               ZVAL_NULL(EX_VAR(opline->result.var));
+                       if (Z_ISREF_P(object)) {
+                               object = Z_REFVAL_P(object);
+                               if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+                                       goto post_incdec_object;
+                               }
+                       }
+                       if (UNEXPECTED(!make_real_object(object, property OPLINE_CC))) {
                                break;
                        }
                }
 
                /* here we are sure we are dealing with an object */
-
+post_incdec_object:
                if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr)
                        && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL))) != NULL)) {
                        if (UNEXPECTED(Z_ISERROR_P(zptr))) {
@@ -41115,45 +40540,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA
        value = RT_CONSTANT((opline+1), (opline+1)->op1);
 
        if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
-               do {
-                       if (Z_ISREF_P(object)) {
-                               object = Z_REFVAL_P(object);
-                               if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
-                                       break;
-                               }
+               if (Z_ISREF_P(object)) {
+                       object = Z_REFVAL_P(object);
+                       if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+                               goto assign_object;
                        }
-                       if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE ||
-                           (Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
-                               zend_object *obj;
-
-                               zval_ptr_dtor_nogc(object);
-                               object_init(object);
-                               Z_ADDREF_P(object);
-                               obj = Z_OBJ_P(object);
-                               zend_error(E_WARNING, "Creating default object from empty value");
-                               if (GC_REFCOUNT(obj) == 1) {
-                                       /* the enclosing container was deleted, obj is unreferenced */
-                                       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                               ZVAL_NULL(EX_VAR(opline->result.var));
-                                       }
-
-                                       OBJ_RELEASE(obj);
-                                       goto exit_assign_obj;
-                               }
-                               Z_DELREF_P(object);
-                       } else {
-                               if (IS_CV != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
-                                       zend_wrong_property_assignment(property);
-                               }
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
-                               }
+               }
+               if (UNEXPECTED(!make_real_object(object, property OPLINE_CC))) {
 
-                               goto exit_assign_obj;
-                       }
-               } while (0);
+                       goto exit_assign_obj;
+               }
        }
 
+assign_object:
        if (IS_CONST == IS_CONST &&
            EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) {
                uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*));
@@ -41256,54 +40655,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA
 
        SAVE_OPLINE();
        object = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC);
-
-       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
-               ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
-       }
-
-       property = RT_CONSTANT(opline, opline->op2);
-       value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
-
-       if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
-               do {
-                       if (Z_ISREF_P(object)) {
-                               object = Z_REFVAL_P(object);
-                               if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
-                                       break;
-                               }
-                       }
-                       if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE ||
-                           (Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
-                               zend_object *obj;
-
-                               zval_ptr_dtor_nogc(object);
-                               object_init(object);
-                               Z_ADDREF_P(object);
-                               obj = Z_OBJ_P(object);
-                               zend_error(E_WARNING, "Creating default object from empty value");
-                               if (GC_REFCOUNT(obj) == 1) {
-                                       /* the enclosing container was deleted, obj is unreferenced */
-                                       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                               ZVAL_NULL(EX_VAR(opline->result.var));
-                                       }
-                                       zval_ptr_dtor_nogc(free_op_data);
-                                       OBJ_RELEASE(obj);
-                                       goto exit_assign_obj;
-                               }
-                               Z_DELREF_P(object);
-                       } else {
-                               if (IS_CV != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
-                                       zend_wrong_property_assignment(property);
-                               }
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
-                               }
-                               zval_ptr_dtor_nogc(free_op_data);
-                               goto exit_assign_obj;
+
+       if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) == IS_UNDEF)) {
+               ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU));
+       }
+
+       property = RT_CONSTANT(opline, opline->op2);
+       value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
+
+       if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
+               if (Z_ISREF_P(object)) {
+                       object = Z_REFVAL_P(object);
+                       if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+                               goto assign_object;
                        }
-               } while (0);
+               }
+               if (UNEXPECTED(!make_real_object(object, property OPLINE_CC))) {
+                       zval_ptr_dtor_nogc(free_op_data);
+                       goto exit_assign_obj;
+               }
        }
 
+assign_object:
        if (IS_CONST == IS_CONST &&
            EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) {
                uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*));
@@ -41415,45 +40788,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA
        value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
 
        if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
-               do {
-                       if (Z_ISREF_P(object)) {
-                               object = Z_REFVAL_P(object);
-                               if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
-                                       break;
-                               }
-                       }
-                       if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE ||
-                           (Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
-                               zend_object *obj;
-
-                               zval_ptr_dtor_nogc(object);
-                               object_init(object);
-                               Z_ADDREF_P(object);
-                               obj = Z_OBJ_P(object);
-                               zend_error(E_WARNING, "Creating default object from empty value");
-                               if (GC_REFCOUNT(obj) == 1) {
-                                       /* the enclosing container was deleted, obj is unreferenced */
-                                       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                               ZVAL_NULL(EX_VAR(opline->result.var));
-                                       }
-                                       zval_ptr_dtor_nogc(free_op_data);
-                                       OBJ_RELEASE(obj);
-                                       goto exit_assign_obj;
-                               }
-                               Z_DELREF_P(object);
-                       } else {
-                               if (IS_CV != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
-                                       zend_wrong_property_assignment(property);
-                               }
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
-                               }
-                               zval_ptr_dtor_nogc(free_op_data);
-                               goto exit_assign_obj;
+               if (Z_ISREF_P(object)) {
+                       object = Z_REFVAL_P(object);
+                       if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+                               goto assign_object;
                        }
-               } while (0);
+               }
+               if (UNEXPECTED(!make_real_object(object, property OPLINE_CC))) {
+                       zval_ptr_dtor_nogc(free_op_data);
+                       goto exit_assign_obj;
+               }
        }
 
+assign_object:
        if (IS_CONST == IS_CONST &&
            EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) {
                uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*));
@@ -41565,45 +40912,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA
        value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
 
        if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
-               do {
-                       if (Z_ISREF_P(object)) {
-                               object = Z_REFVAL_P(object);
-                               if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
-                                       break;
-                               }
+               if (Z_ISREF_P(object)) {
+                       object = Z_REFVAL_P(object);
+                       if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+                               goto assign_object;
                        }
-                       if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE ||
-                           (Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
-                               zend_object *obj;
-
-                               zval_ptr_dtor_nogc(object);
-                               object_init(object);
-                               Z_ADDREF_P(object);
-                               obj = Z_OBJ_P(object);
-                               zend_error(E_WARNING, "Creating default object from empty value");
-                               if (GC_REFCOUNT(obj) == 1) {
-                                       /* the enclosing container was deleted, obj is unreferenced */
-                                       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                               ZVAL_NULL(EX_VAR(opline->result.var));
-                                       }
-
-                                       OBJ_RELEASE(obj);
-                                       goto exit_assign_obj;
-                               }
-                               Z_DELREF_P(object);
-                       } else {
-                               if (IS_CV != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
-                                       zend_wrong_property_assignment(property);
-                               }
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
-                               }
+               }
+               if (UNEXPECTED(!make_real_object(object, property OPLINE_CC))) {
 
-                               goto exit_assign_obj;
-                       }
-               } while (0);
+                       goto exit_assign_obj;
+               }
        }
 
+assign_object:
        if (IS_CONST == IS_CONST &&
            EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) {
                uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*));
@@ -43929,17 +43250,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP
                value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1);
 
                if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
-                       ZVAL_DEREF(object);
-                       if (UNEXPECTED(!make_real_object(object))) {
-                               zend_wrong_property_assignment(property);
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
+                       if (Z_ISREF_P(object)) {
+                               object = Z_REFVAL_P(object);
+                               if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+                                       goto assign_op_object;
                                }
+                       }
+                       if (UNEXPECTED(!make_real_object(object, property OPLINE_CC))) {
                                break;
                        }
                }
 
                /* here we are sure we are dealing with an object */
+assign_op_object:
                if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr)
                        && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : NULL))) != NULL)) {
                        if (UNEXPECTED(Z_ISERROR_P(zptr))) {
@@ -44352,17 +43675,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
 
        do {
                if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
-                       ZVAL_DEREF(object);
-                       if (UNEXPECTED(!make_real_object(object))) {
-                               zend_wrong_property_inc_dec(property);
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
+                       if (Z_ISREF_P(object)) {
+                               object = Z_REFVAL_P(object);
+                               if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+                                       goto pre_incdec_object;
                                }
+                       }
+                       if (UNEXPECTED(!make_real_object(object, property OPLINE_CC))) {
                                break;
                        }
                }
 
                /* here we are sure we are dealing with an object */
+pre_incdec_object:
                if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr)
                        && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL))) != NULL)) {
                        if (UNEXPECTED(Z_ISERROR_P(zptr))) {
@@ -44428,16 +43753,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
 
        do {
                if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
-                       ZVAL_DEREF(object);
-                       if (UNEXPECTED(!make_real_object(object))) {
-                               zend_wrong_property_inc_dec(property);
-                               ZVAL_NULL(EX_VAR(opline->result.var));
+                       if (Z_ISREF_P(object)) {
+                               object = Z_REFVAL_P(object);
+                               if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+                                       goto post_incdec_object;
+                               }
+                       }
+                       if (UNEXPECTED(!make_real_object(object, property OPLINE_CC))) {
                                break;
                        }
                }
 
                /* here we are sure we are dealing with an object */
-
+post_incdec_object:
                if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr)
                        && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL))) != NULL)) {
                        if (UNEXPECTED(Z_ISERROR_P(zptr))) {
@@ -44937,45 +44265,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D
        value = RT_CONSTANT((opline+1), (opline+1)->op1);
 
        if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
-               do {
-                       if (Z_ISREF_P(object)) {
-                               object = Z_REFVAL_P(object);
-                               if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
-                                       break;
-                               }
+               if (Z_ISREF_P(object)) {
+                       object = Z_REFVAL_P(object);
+                       if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+                               goto assign_object;
                        }
-                       if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE ||
-                           (Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
-                               zend_object *obj;
-
-                               zval_ptr_dtor_nogc(object);
-                               object_init(object);
-                               Z_ADDREF_P(object);
-                               obj = Z_OBJ_P(object);
-                               zend_error(E_WARNING, "Creating default object from empty value");
-                               if (GC_REFCOUNT(obj) == 1) {
-                                       /* the enclosing container was deleted, obj is unreferenced */
-                                       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                               ZVAL_NULL(EX_VAR(opline->result.var));
-                                       }
-
-                                       OBJ_RELEASE(obj);
-                                       goto exit_assign_obj;
-                               }
-                               Z_DELREF_P(object);
-                       } else {
-                               if (IS_CV != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
-                                       zend_wrong_property_assignment(property);
-                               }
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
-                               }
+               }
+               if (UNEXPECTED(!make_real_object(object, property OPLINE_CC))) {
 
-                               goto exit_assign_obj;
-                       }
-               } while (0);
+                       goto exit_assign_obj;
+               }
        }
 
+assign_object:
        if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
            EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) {
                uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*));
@@ -45087,45 +44389,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D
        value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
 
        if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
-               do {
-                       if (Z_ISREF_P(object)) {
-                               object = Z_REFVAL_P(object);
-                               if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
-                                       break;
-                               }
-                       }
-                       if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE ||
-                           (Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
-                               zend_object *obj;
-
-                               zval_ptr_dtor_nogc(object);
-                               object_init(object);
-                               Z_ADDREF_P(object);
-                               obj = Z_OBJ_P(object);
-                               zend_error(E_WARNING, "Creating default object from empty value");
-                               if (GC_REFCOUNT(obj) == 1) {
-                                       /* the enclosing container was deleted, obj is unreferenced */
-                                       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                               ZVAL_NULL(EX_VAR(opline->result.var));
-                                       }
-                                       zval_ptr_dtor_nogc(free_op_data);
-                                       OBJ_RELEASE(obj);
-                                       goto exit_assign_obj;
-                               }
-                               Z_DELREF_P(object);
-                       } else {
-                               if (IS_CV != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
-                                       zend_wrong_property_assignment(property);
-                               }
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
-                               }
-                               zval_ptr_dtor_nogc(free_op_data);
-                               goto exit_assign_obj;
+               if (Z_ISREF_P(object)) {
+                       object = Z_REFVAL_P(object);
+                       if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+                               goto assign_object;
                        }
-               } while (0);
+               }
+               if (UNEXPECTED(!make_real_object(object, property OPLINE_CC))) {
+                       zval_ptr_dtor_nogc(free_op_data);
+                       goto exit_assign_obj;
+               }
        }
 
+assign_object:
        if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
            EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) {
                uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*));
@@ -45237,45 +44513,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D
        value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
 
        if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
-               do {
-                       if (Z_ISREF_P(object)) {
-                               object = Z_REFVAL_P(object);
-                               if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
-                                       break;
-                               }
-                       }
-                       if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE ||
-                           (Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
-                               zend_object *obj;
-
-                               zval_ptr_dtor_nogc(object);
-                               object_init(object);
-                               Z_ADDREF_P(object);
-                               obj = Z_OBJ_P(object);
-                               zend_error(E_WARNING, "Creating default object from empty value");
-                               if (GC_REFCOUNT(obj) == 1) {
-                                       /* the enclosing container was deleted, obj is unreferenced */
-                                       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                               ZVAL_NULL(EX_VAR(opline->result.var));
-                                       }
-                                       zval_ptr_dtor_nogc(free_op_data);
-                                       OBJ_RELEASE(obj);
-                                       goto exit_assign_obj;
-                               }
-                               Z_DELREF_P(object);
-                       } else {
-                               if (IS_CV != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
-                                       zend_wrong_property_assignment(property);
-                               }
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
-                               }
-                               zval_ptr_dtor_nogc(free_op_data);
-                               goto exit_assign_obj;
+               if (Z_ISREF_P(object)) {
+                       object = Z_REFVAL_P(object);
+                       if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+                               goto assign_object;
                        }
-               } while (0);
+               }
+               if (UNEXPECTED(!make_real_object(object, property OPLINE_CC))) {
+                       zval_ptr_dtor_nogc(free_op_data);
+                       goto exit_assign_obj;
+               }
        }
 
+assign_object:
        if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
            EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) {
                uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*));
@@ -45387,45 +44637,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D
        value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
 
        if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
-               do {
-                       if (Z_ISREF_P(object)) {
-                               object = Z_REFVAL_P(object);
-                               if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
-                                       break;
-                               }
+               if (Z_ISREF_P(object)) {
+                       object = Z_REFVAL_P(object);
+                       if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+                               goto assign_object;
                        }
-                       if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE ||
-                           (Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
-                               zend_object *obj;
-
-                               zval_ptr_dtor_nogc(object);
-                               object_init(object);
-                               Z_ADDREF_P(object);
-                               obj = Z_OBJ_P(object);
-                               zend_error(E_WARNING, "Creating default object from empty value");
-                               if (GC_REFCOUNT(obj) == 1) {
-                                       /* the enclosing container was deleted, obj is unreferenced */
-                                       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                               ZVAL_NULL(EX_VAR(opline->result.var));
-                                       }
-
-                                       OBJ_RELEASE(obj);
-                                       goto exit_assign_obj;
-                               }
-                               Z_DELREF_P(object);
-                       } else {
-                               if (IS_CV != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
-                                       zend_wrong_property_assignment(property);
-                               }
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
-                               }
+               }
+               if (UNEXPECTED(!make_real_object(object, property OPLINE_CC))) {
 
-                               goto exit_assign_obj;
-                       }
-               } while (0);
+                       goto exit_assign_obj;
+               }
        }
 
+assign_object:
        if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
            EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) {
                uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*));
@@ -49697,17 +48921,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP
                value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1);
 
                if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
-                       ZVAL_DEREF(object);
-                       if (UNEXPECTED(!make_real_object(object))) {
-                               zend_wrong_property_assignment(property);
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
+                       if (Z_ISREF_P(object)) {
+                               object = Z_REFVAL_P(object);
+                               if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+                                       goto assign_op_object;
                                }
+                       }
+                       if (UNEXPECTED(!make_real_object(object, property OPLINE_CC))) {
                                break;
                        }
                }
 
                /* here we are sure we are dealing with an object */
+assign_op_object:
                if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr)
                        && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR((opline+1)->extended_value) : NULL))) != NULL)) {
                        if (UNEXPECTED(Z_ISERROR_P(zptr))) {
@@ -50118,17 +49344,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
 
        do {
                if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
-                       ZVAL_DEREF(object);
-                       if (UNEXPECTED(!make_real_object(object))) {
-                               zend_wrong_property_inc_dec(property);
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
+                       if (Z_ISREF_P(object)) {
+                               object = Z_REFVAL_P(object);
+                               if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+                                       goto pre_incdec_object;
                                }
+                       }
+                       if (UNEXPECTED(!make_real_object(object, property OPLINE_CC))) {
                                break;
                        }
                }
 
                /* here we are sure we are dealing with an object */
+pre_incdec_object:
                if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr)
                        && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL))) != NULL)) {
                        if (UNEXPECTED(Z_ISERROR_P(zptr))) {
@@ -50193,16 +49421,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
 
        do {
                if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
-                       ZVAL_DEREF(object);
-                       if (UNEXPECTED(!make_real_object(object))) {
-                               zend_wrong_property_inc_dec(property);
-                               ZVAL_NULL(EX_VAR(opline->result.var));
+                       if (Z_ISREF_P(object)) {
+                               object = Z_REFVAL_P(object);
+                               if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+                                       goto post_incdec_object;
+                               }
+                       }
+                       if (UNEXPECTED(!make_real_object(object, property OPLINE_CC))) {
                                break;
                        }
                }
 
                /* here we are sure we are dealing with an object */
-
+post_incdec_object:
                if (EXPECTED(Z_OBJ_HT_P(object)->get_property_ptr_ptr)
                        && EXPECTED((zptr = Z_OBJ_HT_P(object)->get_property_ptr_ptr(object, property, BP_VAR_RW, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL))) != NULL)) {
                        if (UNEXPECTED(Z_ISERROR_P(zptr))) {
@@ -50698,45 +49929,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_
        value = RT_CONSTANT((opline+1), (opline+1)->op1);
 
        if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
-               do {
-                       if (Z_ISREF_P(object)) {
-                               object = Z_REFVAL_P(object);
-                               if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
-                                       break;
-                               }
+               if (Z_ISREF_P(object)) {
+                       object = Z_REFVAL_P(object);
+                       if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+                               goto assign_object;
                        }
-                       if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE ||
-                           (Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
-                               zend_object *obj;
-
-                               zval_ptr_dtor_nogc(object);
-                               object_init(object);
-                               Z_ADDREF_P(object);
-                               obj = Z_OBJ_P(object);
-                               zend_error(E_WARNING, "Creating default object from empty value");
-                               if (GC_REFCOUNT(obj) == 1) {
-                                       /* the enclosing container was deleted, obj is unreferenced */
-                                       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                               ZVAL_NULL(EX_VAR(opline->result.var));
-                                       }
-
-                                       OBJ_RELEASE(obj);
-                                       goto exit_assign_obj;
-                               }
-                               Z_DELREF_P(object);
-                       } else {
-                               if (IS_CV != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
-                                       zend_wrong_property_assignment(property);
-                               }
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
-                               }
+               }
+               if (UNEXPECTED(!make_real_object(object, property OPLINE_CC))) {
 
-                               goto exit_assign_obj;
-                       }
-               } while (0);
+                       goto exit_assign_obj;
+               }
        }
 
+assign_object:
        if (IS_CV == IS_CONST &&
            EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) {
                uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*));
@@ -50848,45 +50053,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_
        value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
 
        if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
-               do {
-                       if (Z_ISREF_P(object)) {
-                               object = Z_REFVAL_P(object);
-                               if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
-                                       break;
-                               }
-                       }
-                       if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE ||
-                           (Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
-                               zend_object *obj;
-
-                               zval_ptr_dtor_nogc(object);
-                               object_init(object);
-                               Z_ADDREF_P(object);
-                               obj = Z_OBJ_P(object);
-                               zend_error(E_WARNING, "Creating default object from empty value");
-                               if (GC_REFCOUNT(obj) == 1) {
-                                       /* the enclosing container was deleted, obj is unreferenced */
-                                       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                               ZVAL_NULL(EX_VAR(opline->result.var));
-                                       }
-                                       zval_ptr_dtor_nogc(free_op_data);
-                                       OBJ_RELEASE(obj);
-                                       goto exit_assign_obj;
-                               }
-                               Z_DELREF_P(object);
-                       } else {
-                               if (IS_CV != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
-                                       zend_wrong_property_assignment(property);
-                               }
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
-                               }
-                               zval_ptr_dtor_nogc(free_op_data);
-                               goto exit_assign_obj;
+               if (Z_ISREF_P(object)) {
+                       object = Z_REFVAL_P(object);
+                       if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+                               goto assign_object;
                        }
-               } while (0);
+               }
+               if (UNEXPECTED(!make_real_object(object, property OPLINE_CC))) {
+                       zval_ptr_dtor_nogc(free_op_data);
+                       goto exit_assign_obj;
+               }
        }
 
+assign_object:
        if (IS_CV == IS_CONST &&
            EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) {
                uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*));
@@ -50998,45 +50177,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_
        value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC);
 
        if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
-               do {
-                       if (Z_ISREF_P(object)) {
-                               object = Z_REFVAL_P(object);
-                               if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
-                                       break;
-                               }
-                       }
-                       if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE ||
-                           (Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
-                               zend_object *obj;
-
-                               zval_ptr_dtor_nogc(object);
-                               object_init(object);
-                               Z_ADDREF_P(object);
-                               obj = Z_OBJ_P(object);
-                               zend_error(E_WARNING, "Creating default object from empty value");
-                               if (GC_REFCOUNT(obj) == 1) {
-                                       /* the enclosing container was deleted, obj is unreferenced */
-                                       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                               ZVAL_NULL(EX_VAR(opline->result.var));
-                                       }
-                                       zval_ptr_dtor_nogc(free_op_data);
-                                       OBJ_RELEASE(obj);
-                                       goto exit_assign_obj;
-                               }
-                               Z_DELREF_P(object);
-                       } else {
-                               if (IS_CV != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
-                                       zend_wrong_property_assignment(property);
-                               }
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
-                               }
-                               zval_ptr_dtor_nogc(free_op_data);
-                               goto exit_assign_obj;
+               if (Z_ISREF_P(object)) {
+                       object = Z_REFVAL_P(object);
+                       if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+                               goto assign_object;
                        }
-               } while (0);
+               }
+               if (UNEXPECTED(!make_real_object(object, property OPLINE_CC))) {
+                       zval_ptr_dtor_nogc(free_op_data);
+                       goto exit_assign_obj;
+               }
        }
 
+assign_object:
        if (IS_CV == IS_CONST &&
            EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) {
                uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*));
@@ -51148,45 +50301,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_
        value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC);
 
        if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) {
-               do {
-                       if (Z_ISREF_P(object)) {
-                               object = Z_REFVAL_P(object);
-                               if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
-                                       break;
-                               }
+               if (Z_ISREF_P(object)) {
+                       object = Z_REFVAL_P(object);
+                       if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) {
+                               goto assign_object;
                        }
-                       if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE ||
-                           (Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) {
-                               zend_object *obj;
-
-                               zval_ptr_dtor_nogc(object);
-                               object_init(object);
-                               Z_ADDREF_P(object);
-                               obj = Z_OBJ_P(object);
-                               zend_error(E_WARNING, "Creating default object from empty value");
-                               if (GC_REFCOUNT(obj) == 1) {
-                                       /* the enclosing container was deleted, obj is unreferenced */
-                                       if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                               ZVAL_NULL(EX_VAR(opline->result.var));
-                                       }
-
-                                       OBJ_RELEASE(obj);
-                                       goto exit_assign_obj;
-                               }
-                               Z_DELREF_P(object);
-                       } else {
-                               if (IS_CV != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) {
-                                       zend_wrong_property_assignment(property);
-                               }
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
-                               }
+               }
+               if (UNEXPECTED(!make_real_object(object, property OPLINE_CC))) {
 
-                               goto exit_assign_obj;
-                       }
-               } while (0);
+                       goto exit_assign_obj;
+               }
        }
 
+assign_object:
        if (IS_CV == IS_CONST &&
            EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(opline->extended_value))) {
                uintptr_t prop_offset = (uintptr_t)CACHED_PTR(opline->extended_value + sizeof(void*));