]> granicus.if.org Git - php/commitdiff
Separate rare used increment/decrement/assign_op of overloaded properies into non...
authorDmitry Stogov <dmitry@zend.com>
Wed, 3 Jun 2015 15:44:25 +0000 (18:44 +0300)
committerDmitry Stogov <dmitry@zend.com>
Wed, 3 Jun 2015 15:44:25 +0000 (18:44 +0300)
Zend/zend_execute.c
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

index 17b7ddd594740b7cc56e339045ddcfe967ce34a1..340cd9b481e30049f94402ba751438cca53ef4da 100644 (file)
@@ -1236,6 +1236,133 @@ static void zend_assign_to_string_offset(zval *str, zend_long offset, zval *valu
        }
 }
 
+static zend_never_inline void zend_post_incdec_overloaded_property(zval *object, zval *property, void **cache_slot, int inc, zval *result)
+{
+       if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
+               zval rv, obj;
+               zval *z;
+               zval z_copy;
+
+               ZVAL_OBJ(&obj, Z_OBJ_P(object));
+               Z_ADDREF(obj);
+               z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, cache_slot, &rv);
+               if (UNEXPECTED(EG(exception))) {
+                       OBJ_RELEASE(Z_OBJ(obj));
+                       return;
+               }
+
+               if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
+                       zval rv2;
+                       zval *value = Z_OBJ_HT_P(z)->get(z, &rv2);
+                       if (z == &rv) {
+                               zval_ptr_dtor(&rv);
+                       }
+                       ZVAL_COPY_VALUE(z, value);
+               }
+               ZVAL_COPY(result, z);
+               ZVAL_DUP(&z_copy, z);
+               if (inc) {
+                       increment_function(&z_copy);
+               } else {
+                       decrement_function(&z_copy);
+               }
+               if (Z_REFCOUNTED_P(z)) Z_ADDREF_P(z);
+               Z_OBJ_HT(obj)->write_property(&obj, property, &z_copy, cache_slot);
+               OBJ_RELEASE(Z_OBJ(obj));
+               zval_ptr_dtor(&z_copy);
+               zval_ptr_dtor(z);
+       } else {
+               zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
+               ZVAL_NULL(result);
+       }
+}
+
+static zend_never_inline void zend_pre_incdec_overloaded_property(zval *object, zval *property, void **cache_slot, int inc, zval *result)
+{
+       zval rv;
+
+       if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
+               zval *z, obj;
+                               
+               ZVAL_OBJ(&obj, Z_OBJ_P(object));
+               Z_ADDREF(obj);
+               z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, cache_slot, &rv);
+               if (UNEXPECTED(EG(exception))) {
+                       OBJ_RELEASE(Z_OBJ(obj));
+                       return;
+               }
+
+               if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
+                       zval rv2;
+                       zval *value = Z_OBJ_HT_P(z)->get(z, &rv2);
+
+                       if (z == &rv) {
+                               zval_ptr_dtor(&rv);
+                       }
+                       ZVAL_COPY_VALUE(z, value);
+               }
+               ZVAL_DEREF(z);
+               SEPARATE_ZVAL_NOREF(z);
+               if (inc) {
+                       increment_function(z);
+               } else {
+                       decrement_function(z);
+               }
+               if (UNEXPECTED(result)) {
+                       ZVAL_COPY(result, z);
+               }
+               Z_OBJ_HT(obj)->write_property(&obj, property, z, cache_slot);
+               OBJ_RELEASE(Z_OBJ(obj));
+               zval_ptr_dtor(z);
+       } else {
+               zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
+               if (UNEXPECTED(result)) {
+                       ZVAL_NULL(result);
+               }
+       }
+}
+
+static zend_never_inline void zend_assign_op_overloaded_property(zval *object, zval *property, void **cache_slot, zval *value, binary_op_type binary_op, zval *result)
+{
+       zval *z;
+       zval rv, obj;
+       zval *zptr;
+
+       ZVAL_OBJ(&obj, Z_OBJ_P(object));
+       Z_ADDREF(obj);
+       if (Z_OBJ_HT(obj)->read_property &&
+               (z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, cache_slot, &rv)) != NULL) {
+               if (UNEXPECTED(EG(exception))) {
+                       OBJ_RELEASE(Z_OBJ(obj));
+                       return;
+               }
+               if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
+                       zval rv2;
+                       zval *value = Z_OBJ_HT_P(z)->get(z, &rv2);
+
+                       if (z == &rv) {
+                               zval_ptr_dtor(&rv);
+                       }
+                       ZVAL_COPY_VALUE(z, value);
+               }
+               zptr = z;
+               ZVAL_DEREF(z);
+               SEPARATE_ZVAL_NOREF(z);
+               binary_op(z, z, value);
+               Z_OBJ_HT(obj)->write_property(&obj, property, z, cache_slot);
+               if (UNEXPECTED(result)) {
+                       ZVAL_COPY(result, z);
+               }
+               zval_ptr_dtor(zptr);
+       } else {
+               zend_error(E_WARNING, "Attempt to assign property of non-object");
+               if (UNEXPECTED(result)) {
+                       ZVAL_NULL(result);
+               }
+       }
+       OBJ_RELEASE(Z_OBJ(obj));
+}
+
 /* Utility Functions for Extensions */
 static void zend_extension_statement_handler(const zend_extension *extension, zend_op_array *op_array)
 {
index 8b35bacfef0ecc414577720a5d4f756b886a4528..46ce3ce008a9b3d30ed9d9109b35e77ce875741a 100644 (file)
@@ -748,42 +748,7 @@ ZEND_VM_HELPER_EX(zend_binary_assign_op_obj_helper, VAR|UNUSED|CV, CONST|TMPVAR|
                                ZVAL_COPY(EX_VAR(opline->result.var), zptr);
                        }
                } else {
-                       zval *z;
-                       zval rv, obj;
-
-                       ZVAL_OBJ(&obj, Z_OBJ_P(object));
-                       Z_ADDREF(obj);
-                       if (Z_OBJ_HT(obj)->read_property &&
-                               (z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), &rv)) != NULL) {
-                               if (UNEXPECTED(EG(exception))) {
-                                       OBJ_RELEASE(Z_OBJ(obj));
-                                       break;
-                               }
-                               if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
-                                       zval rv2;
-                                       zval *value = Z_OBJ_HT_P(z)->get(z, &rv2);
-
-                                       if (z == &rv) {
-                                               zval_ptr_dtor(&rv);
-                                       }
-                                       ZVAL_COPY_VALUE(z, value);
-                               }
-                               zptr = z;
-                               ZVAL_DEREF(z);
-                               SEPARATE_ZVAL_NOREF(z);
-                               binary_op(z, z, value);
-                               Z_OBJ_HT(obj)->write_property(&obj, property, z, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL));
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_COPY(EX_VAR(opline->result.var), z);
-                               }
-                               zval_ptr_dtor(zptr);
-                       } else {
-                               zend_error(E_WARNING, "Attempt to assign property of non-object");
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
-                               }
-                       }
-                       OBJ_RELEASE(Z_OBJ(obj));
+                       zend_assign_op_overloaded_property(object, property, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL));
                }
        } while (0);
 
@@ -1131,7 +1096,7 @@ ZEND_VM_HANDLER(33, ZEND_ASSIGN_BW_XOR, VAR|UNUSED|CV, CONST|TMPVAR|UNUSED|CV)
 #endif
 }
 
-ZEND_VM_HELPER_EX(zend_pre_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, incdec_t incdec_op)
+ZEND_VM_HELPER_EX(zend_pre_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, int inc)
 {
        USE_OPLINE
        zend_free_op free_op1, free_op2;
@@ -1174,51 +1139,27 @@ ZEND_VM_HELPER_EX(zend_pre_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|C
                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(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) {
 
-                       ZVAL_DEREF(zptr);
-                       SEPARATE_ZVAL_NOREF(zptr);
+                       if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) {
+                               if (inc) {
+                                       fast_long_increment_function(zptr);
+                               } else {
+                                       fast_long_decrement_function(zptr);
+                               }
+                       } else {
+                               ZVAL_DEREF(zptr);
+                               SEPARATE_ZVAL_NOREF(zptr);
 
-                       incdec_op(zptr);
+                               if (inc) {
+                                       increment_function(zptr);
+                               } else {
+                                       decrement_function(zptr);
+                               }
+                       }
                        if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                                ZVAL_COPY(EX_VAR(opline->result.var), zptr);
                        }
                } else {
-                       zval rv;
-
-                       if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
-                               zval *z, obj;
-                               
-                               ZVAL_OBJ(&obj, Z_OBJ_P(object));
-                               Z_ADDREF(obj);
-                               z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), &rv);
-                               if (UNEXPECTED(EG(exception))) {
-                                       OBJ_RELEASE(Z_OBJ(obj));
-                                       break;
-                               }
-
-                               if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
-                                       zval rv2;
-                                       zval *value = Z_OBJ_HT_P(z)->get(z, &rv2);
-
-                                       if (z == &rv) {
-                                               zval_ptr_dtor(&rv);
-                                       }
-                                       ZVAL_COPY_VALUE(z, value);
-                               }
-                               ZVAL_DEREF(z);
-                               SEPARATE_ZVAL_NOREF(z);
-                               incdec_op(z);
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_COPY(EX_VAR(opline->result.var), z);
-                               }
-                               Z_OBJ_HT(obj)->write_property(&obj, property, z, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL));
-                               OBJ_RELEASE(Z_OBJ(obj));
-                               zval_ptr_dtor(z);
-                       } else {
-                               zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
-                               }
-                       }
+                       zend_pre_incdec_overloaded_property(object, property, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL));
                }
        } while (0);
 
@@ -1230,15 +1171,15 @@ ZEND_VM_HELPER_EX(zend_pre_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|C
 
 ZEND_VM_HANDLER(132, ZEND_PRE_INC_OBJ, VAR|UNUSED|CV, CONST|TMPVAR|CV)
 {
-       ZEND_VM_DISPATCH_TO_HELPER_EX(zend_pre_incdec_property_helper, incdec_op, increment_function);
+       ZEND_VM_DISPATCH_TO_HELPER_EX(zend_pre_incdec_property_helper, inc, 1);
 }
 
 ZEND_VM_HANDLER(133, ZEND_PRE_DEC_OBJ, VAR|UNUSED|CV, CONST|TMPVAR|CV)
 {
-       ZEND_VM_DISPATCH_TO_HELPER_EX(zend_pre_incdec_property_helper, incdec_op, decrement_function);
+       ZEND_VM_DISPATCH_TO_HELPER_EX(zend_pre_incdec_property_helper, inc, 0);
 }
 
-ZEND_VM_HELPER_EX(zend_post_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, incdec_t incdec_op)
+ZEND_VM_HELPER_EX(zend_post_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, int inc)
 {
        USE_OPLINE
        zend_free_op free_op1, free_op2;
@@ -1279,44 +1220,25 @@ ZEND_VM_HELPER_EX(zend_post_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|
                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(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) {
 
-                       ZVAL_DEREF(zptr);
-                       ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr);
-                       zval_opt_copy_ctor(zptr);
-                       incdec_op(zptr);
-               } else {
-                       if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
-                               zval rv, obj;
-                               zval *z;
-                               zval z_copy;
-
-                               ZVAL_OBJ(&obj, Z_OBJ_P(object));
-                               Z_ADDREF(obj);
-                               z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), &rv);
-                               if (UNEXPECTED(EG(exception))) {
-                                       OBJ_RELEASE(Z_OBJ(obj));
-                                       break;
+                       if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) {
+                               ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr);
+                               if (inc) {
+                                       fast_long_increment_function(zptr);
+                               } else {
+                                       fast_long_decrement_function(zptr);
                                }
-
-                               if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
-                                       zval rv2;
-                                       zval *value = Z_OBJ_HT_P(z)->get(z, &rv2);
-                                       if (z == &rv) {
-                                               zval_ptr_dtor(&rv);
-                                       }
-                                       ZVAL_COPY_VALUE(z, value);
-                               }
-                               ZVAL_DUP(EX_VAR(opline->result.var), z);
-                               ZVAL_DUP(&z_copy, z);
-                               incdec_op(&z_copy);
-                               if (Z_REFCOUNTED_P(z)) Z_ADDREF_P(z);
-                               Z_OBJ_HT(obj)->write_property(&obj, property, &z_copy, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL));
-                               OBJ_RELEASE(Z_OBJ(obj));
-                               zval_ptr_dtor(&z_copy);
-                               zval_ptr_dtor(z);
                        } else {
-                               zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
-                               ZVAL_NULL(EX_VAR(opline->result.var));
+                               ZVAL_DEREF(zptr);
+                               ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr);
+                               zval_opt_copy_ctor(zptr);
+                               if (inc) {
+                                       increment_function(zptr);
+                               } else {
+                                       decrement_function(zptr);
+                               }
                        }
+               } else {
+                       zend_post_incdec_overloaded_property(object, property, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var));
                }
        } while (0);
 
@@ -1328,12 +1250,12 @@ ZEND_VM_HELPER_EX(zend_post_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|
 
 ZEND_VM_HANDLER(134, ZEND_POST_INC_OBJ, VAR|UNUSED|CV, CONST|TMPVAR|CV)
 {
-       ZEND_VM_DISPATCH_TO_HELPER_EX(zend_post_incdec_property_helper, incdec_op, increment_function);
+       ZEND_VM_DISPATCH_TO_HELPER_EX(zend_post_incdec_property_helper, inc, 1);
 }
 
 ZEND_VM_HANDLER(135, ZEND_POST_DEC_OBJ, VAR|UNUSED|CV, CONST|TMPVAR|CV)
 {
-       ZEND_VM_DISPATCH_TO_HELPER_EX(zend_post_incdec_property_helper, incdec_op, decrement_function);
+       ZEND_VM_DISPATCH_TO_HELPER_EX(zend_post_incdec_property_helper, inc, 0);
 }
 
 ZEND_VM_HANDLER(34, ZEND_PRE_INC, VAR|CV, ANY)
@@ -1894,7 +1816,8 @@ ZEND_VM_HANDLER(82, ZEND_FETCH_OBJ_R, CONST|TMP|VAR|UNUSED|CV, CONST|TMPVAR|CV)
 
        offset = GET_OP2_ZVAL_PTR(BP_VAR_R);
 
-       if (OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
+       if (OP1_TYPE == IS_CONST ||
+           (OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
                if ((OP1_TYPE & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
                        container = Z_REFVAL_P(container);
                        if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
@@ -2032,7 +1955,8 @@ ZEND_VM_HANDLER(91, ZEND_FETCH_OBJ_IS, CONST|TMPVAR|UNUSED|CV, CONST|TMPVAR|CV)
 
        offset  = GET_OP2_ZVAL_PTR(BP_VAR_R);
 
-       if (OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
+       if (OP1_TYPE == IS_CONST ||
+           (OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
                if ((OP1_TYPE & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
                        container = Z_REFVAL_P(container);
                        if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
@@ -6709,7 +6633,8 @@ ZEND_VM_HANDLER(148, ZEND_ISSET_ISEMPTY_PROP_OBJ, CONST|TMPVAR|UNUSED|CV, CONST|
 
        offset = GET_OP2_ZVAL_PTR(BP_VAR_R);
 
-       if (OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
+       if (OP1_TYPE == IS_CONST ||
+           (OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
                if ((OP1_TYPE & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
                        container = Z_REFVAL_P(container);
                        if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
index 1d29389f66ae8fa22428a4f26bf1c8611c18f1b5..6e7a0241f9df7d8bff166e1deac2692117b001b4 100644 (file)
@@ -5343,7 +5343,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CONST_H
 
        offset = EX_CONSTANT(opline->op2);
 
-       if (IS_CONST != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
+       if (IS_CONST == IS_CONST ||
+           (IS_CONST != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
                if ((IS_CONST & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
                        container = Z_REFVAL_P(container);
                        if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
@@ -5415,7 +5416,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CONST_CONST_
 
        offset  = EX_CONSTANT(opline->op2);
 
-       if (IS_CONST != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
+       if (IS_CONST == IS_CONST ||
+           (IS_CONST != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
                if ((IS_CONST & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
                        container = Z_REFVAL_P(container);
                        if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
@@ -6555,7 +6557,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CO
 
        offset = EX_CONSTANT(opline->op2);
 
-       if (IS_CONST != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
+       if (IS_CONST == IS_CONST ||
+           (IS_CONST != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
                if ((IS_CONST & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
                        container = Z_REFVAL_P(container);
                        if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
@@ -9105,7 +9108,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_CV_HAND
 
        offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var);
 
-       if (IS_CONST != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
+       if (IS_CONST == IS_CONST ||
+           (IS_CONST != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
                if ((IS_CONST & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
                        container = Z_REFVAL_P(container);
                        if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
@@ -9177,7 +9181,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CONST_CV_HAN
 
        offset  = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var);
 
-       if (IS_CONST != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
+       if (IS_CONST == IS_CONST ||
+           (IS_CONST != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
                if ((IS_CONST & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
                        container = Z_REFVAL_P(container);
                        if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
@@ -10034,7 +10039,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CO
 
        offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var);
 
-       if (IS_CONST != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
+       if (IS_CONST == IS_CONST ||
+           (IS_CONST != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
                if ((IS_CONST & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
                        container = Z_REFVAL_P(container);
                        if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
@@ -10896,7 +10902,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CONST_TMPVAR_
 
        offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
 
-       if (IS_CONST != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
+       if (IS_CONST == IS_CONST ||
+           (IS_CONST != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
                if ((IS_CONST & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
                        container = Z_REFVAL_P(container);
                        if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
@@ -10969,7 +10976,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CONST_TMPVAR
 
        offset  = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
 
-       if (IS_CONST != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
+       if (IS_CONST == IS_CONST ||
+           (IS_CONST != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
                if ((IS_CONST & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
                        container = Z_REFVAL_P(container);
                        if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
@@ -11778,7 +11786,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CO
 
        offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
 
-       if (IS_CONST != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
+       if (IS_CONST == IS_CONST ||
+           (IS_CONST != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
                if ((IS_CONST & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
                        container = Z_REFVAL_P(container);
                        if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
@@ -12785,7 +12794,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_CONST_HAN
 
        offset = EX_CONSTANT(opline->op2);
 
-       if (IS_TMP_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
+       if (IS_TMP_VAR == IS_CONST ||
+           (IS_TMP_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
                if ((IS_TMP_VAR & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
                        container = Z_REFVAL_P(container);
                        if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
@@ -14037,7 +14047,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_CV_HANDLE
 
        offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var);
 
-       if (IS_TMP_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
+       if (IS_TMP_VAR == IS_CONST ||
+           (IS_TMP_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
                if ((IS_TMP_VAR & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
                        container = Z_REFVAL_P(container);
                        if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
@@ -14527,7 +14538,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMP_TMPVAR_HA
 
        offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
 
-       if (IS_TMP_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
+       if (IS_TMP_VAR == IS_CONST ||
+           (IS_TMP_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
                if ((IS_TMP_VAR & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
                        container = Z_REFVAL_P(container);
                        if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
@@ -16551,42 +16563,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP
                                ZVAL_COPY(EX_VAR(opline->result.var), zptr);
                        }
                } else {
-                       zval *z;
-                       zval rv, obj;
-
-                       ZVAL_OBJ(&obj, Z_OBJ_P(object));
-                       Z_ADDREF(obj);
-                       if (Z_OBJ_HT(obj)->read_property &&
-                               (z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), &rv)) != NULL) {
-                               if (UNEXPECTED(EG(exception))) {
-                                       OBJ_RELEASE(Z_OBJ(obj));
-                                       break;
-                               }
-                               if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
-                                       zval rv2;
-                                       zval *value = Z_OBJ_HT_P(z)->get(z, &rv2);
-
-                                       if (z == &rv) {
-                                               zval_ptr_dtor(&rv);
-                                       }
-                                       ZVAL_COPY_VALUE(z, value);
-                               }
-                               zptr = z;
-                               ZVAL_DEREF(z);
-                               SEPARATE_ZVAL_NOREF(z);
-                               binary_op(z, z, value);
-                               Z_OBJ_HT(obj)->write_property(&obj, property, z, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL));
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_COPY(EX_VAR(opline->result.var), z);
-                               }
-                               zval_ptr_dtor(zptr);
-                       } else {
-                               zend_error(E_WARNING, "Attempt to assign property of non-object");
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
-                               }
-                       }
-                       OBJ_RELEASE(Z_OBJ(obj));
+                       zend_assign_op_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL));
                }
        } while (0);
 
@@ -16932,7 +16909,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_VAR_CONST_H
 #endif
 }
 
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_VAR_CONST(incdec_t incdec_op ZEND_OPCODE_HANDLER_ARGS_DC)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_VAR_CONST(int inc ZEND_OPCODE_HANDLER_ARGS_DC)
 {
        USE_OPLINE
        zend_free_op free_op1;
@@ -16975,51 +16952,27 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
                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(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) {
 
-                       ZVAL_DEREF(zptr);
-                       SEPARATE_ZVAL_NOREF(zptr);
+                       if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) {
+                               if (inc) {
+                                       fast_long_increment_function(zptr);
+                               } else {
+                                       fast_long_decrement_function(zptr);
+                               }
+                       } else {
+                               ZVAL_DEREF(zptr);
+                               SEPARATE_ZVAL_NOREF(zptr);
 
-                       incdec_op(zptr);
+                               if (inc) {
+                                       increment_function(zptr);
+                               } else {
+                                       decrement_function(zptr);
+                               }
+                       }
                        if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                                ZVAL_COPY(EX_VAR(opline->result.var), zptr);
                        }
                } else {
-                       zval rv;
-
-                       if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
-                               zval *z, obj;
-
-                               ZVAL_OBJ(&obj, Z_OBJ_P(object));
-                               Z_ADDREF(obj);
-                               z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), &rv);
-                               if (UNEXPECTED(EG(exception))) {
-                                       OBJ_RELEASE(Z_OBJ(obj));
-                                       break;
-                               }
-
-                               if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
-                                       zval rv2;
-                                       zval *value = Z_OBJ_HT_P(z)->get(z, &rv2);
-
-                                       if (z == &rv) {
-                                               zval_ptr_dtor(&rv);
-                                       }
-                                       ZVAL_COPY_VALUE(z, value);
-                               }
-                               ZVAL_DEREF(z);
-                               SEPARATE_ZVAL_NOREF(z);
-                               incdec_op(z);
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_COPY(EX_VAR(opline->result.var), z);
-                               }
-                               Z_OBJ_HT(obj)->write_property(&obj, property, z, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL));
-                               OBJ_RELEASE(Z_OBJ(obj));
-                               zval_ptr_dtor(z);
-                       } else {
-                               zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
-                               }
-                       }
+                       zend_pre_incdec_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL));
                }
        } while (0);
 
@@ -17030,15 +16983,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
-       return zend_pre_incdec_property_helper_SPEC_VAR_CONST(increment_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC);
+       return zend_pre_incdec_property_helper_SPEC_VAR_CONST(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC);
 }
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_OBJ_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
-       return zend_pre_incdec_property_helper_SPEC_VAR_CONST(decrement_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC);
+       return zend_pre_incdec_property_helper_SPEC_VAR_CONST(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC);
 }
 
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_VAR_CONST(incdec_t incdec_op ZEND_OPCODE_HANDLER_ARGS_DC)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_VAR_CONST(int inc ZEND_OPCODE_HANDLER_ARGS_DC)
 {
        USE_OPLINE
        zend_free_op free_op1;
@@ -17079,44 +17032,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
                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(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) {
 
-                       ZVAL_DEREF(zptr);
-                       ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr);
-                       zval_opt_copy_ctor(zptr);
-                       incdec_op(zptr);
-               } else {
-                       if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
-                               zval rv, obj;
-                               zval *z;
-                               zval z_copy;
-
-                               ZVAL_OBJ(&obj, Z_OBJ_P(object));
-                               Z_ADDREF(obj);
-                               z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), &rv);
-                               if (UNEXPECTED(EG(exception))) {
-                                       OBJ_RELEASE(Z_OBJ(obj));
-                                       break;
-                               }
-
-                               if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
-                                       zval rv2;
-                                       zval *value = Z_OBJ_HT_P(z)->get(z, &rv2);
-                                       if (z == &rv) {
-                                               zval_ptr_dtor(&rv);
-                                       }
-                                       ZVAL_COPY_VALUE(z, value);
+                       if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) {
+                               ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr);
+                               if (inc) {
+                                       fast_long_increment_function(zptr);
+                               } else {
+                                       fast_long_decrement_function(zptr);
                                }
-                               ZVAL_DUP(EX_VAR(opline->result.var), z);
-                               ZVAL_DUP(&z_copy, z);
-                               incdec_op(&z_copy);
-                               if (Z_REFCOUNTED_P(z)) Z_ADDREF_P(z);
-                               Z_OBJ_HT(obj)->write_property(&obj, property, &z_copy, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL));
-                               OBJ_RELEASE(Z_OBJ(obj));
-                               zval_ptr_dtor(&z_copy);
-                               zval_ptr_dtor(z);
                        } else {
-                               zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
-                               ZVAL_NULL(EX_VAR(opline->result.var));
+                               ZVAL_DEREF(zptr);
+                               ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr);
+                               zval_opt_copy_ctor(zptr);
+                               if (inc) {
+                                       increment_function(zptr);
+                               } else {
+                                       decrement_function(zptr);
+                               }
                        }
+               } else {
+                       zend_post_incdec_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var));
                }
        } while (0);
 
@@ -17127,12 +17061,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
-       return zend_post_incdec_property_helper_SPEC_VAR_CONST(increment_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC);
+       return zend_post_incdec_property_helper_SPEC_VAR_CONST(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC);
 }
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_OBJ_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
-       return zend_post_incdec_property_helper_SPEC_VAR_CONST(decrement_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC);
+       return zend_post_incdec_property_helper_SPEC_VAR_CONST(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC);
 }
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -17271,7 +17205,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CONST_HAN
 
        offset = EX_CONSTANT(opline->op2);
 
-       if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
+       if (IS_VAR == IS_CONST ||
+           (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
                if ((IS_VAR & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
                        container = Z_REFVAL_P(container);
                        if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
@@ -19829,42 +19764,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP
                                ZVAL_COPY(EX_VAR(opline->result.var), zptr);
                        }
                } else {
-                       zval *z;
-                       zval rv, obj;
-
-                       ZVAL_OBJ(&obj, Z_OBJ_P(object));
-                       Z_ADDREF(obj);
-                       if (Z_OBJ_HT(obj)->read_property &&
-                               (z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), &rv)) != NULL) {
-                               if (UNEXPECTED(EG(exception))) {
-                                       OBJ_RELEASE(Z_OBJ(obj));
-                                       break;
-                               }
-                               if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
-                                       zval rv2;
-                                       zval *value = Z_OBJ_HT_P(z)->get(z, &rv2);
-
-                                       if (z == &rv) {
-                                               zval_ptr_dtor(&rv);
-                                       }
-                                       ZVAL_COPY_VALUE(z, value);
-                               }
-                               zptr = z;
-                               ZVAL_DEREF(z);
-                               SEPARATE_ZVAL_NOREF(z);
-                               binary_op(z, z, value);
-                               Z_OBJ_HT(obj)->write_property(&obj, property, z, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL));
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_COPY(EX_VAR(opline->result.var), z);
-                               }
-                               zval_ptr_dtor(zptr);
-                       } else {
-                               zend_error(E_WARNING, "Attempt to assign property of non-object");
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
-                               }
-                       }
-                       OBJ_RELEASE(Z_OBJ(obj));
+                       zend_assign_op_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL));
                }
        } while (0);
 
@@ -20210,7 +20110,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_VAR_CV_HAND
 #endif
 }
 
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_VAR_CV(incdec_t incdec_op ZEND_OPCODE_HANDLER_ARGS_DC)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_VAR_CV(int inc ZEND_OPCODE_HANDLER_ARGS_DC)
 {
        USE_OPLINE
        zend_free_op free_op1;
@@ -20253,51 +20153,27 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
                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(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) {
 
-                       ZVAL_DEREF(zptr);
-                       SEPARATE_ZVAL_NOREF(zptr);
+                       if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) {
+                               if (inc) {
+                                       fast_long_increment_function(zptr);
+                               } else {
+                                       fast_long_decrement_function(zptr);
+                               }
+                       } else {
+                               ZVAL_DEREF(zptr);
+                               SEPARATE_ZVAL_NOREF(zptr);
 
-                       incdec_op(zptr);
+                               if (inc) {
+                                       increment_function(zptr);
+                               } else {
+                                       decrement_function(zptr);
+                               }
+                       }
                        if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                                ZVAL_COPY(EX_VAR(opline->result.var), zptr);
                        }
                } else {
-                       zval rv;
-
-                       if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
-                               zval *z, obj;
-
-                               ZVAL_OBJ(&obj, Z_OBJ_P(object));
-                               Z_ADDREF(obj);
-                               z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), &rv);
-                               if (UNEXPECTED(EG(exception))) {
-                                       OBJ_RELEASE(Z_OBJ(obj));
-                                       break;
-                               }
-
-                               if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
-                                       zval rv2;
-                                       zval *value = Z_OBJ_HT_P(z)->get(z, &rv2);
-
-                                       if (z == &rv) {
-                                               zval_ptr_dtor(&rv);
-                                       }
-                                       ZVAL_COPY_VALUE(z, value);
-                               }
-                               ZVAL_DEREF(z);
-                               SEPARATE_ZVAL_NOREF(z);
-                               incdec_op(z);
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_COPY(EX_VAR(opline->result.var), z);
-                               }
-                               Z_OBJ_HT(obj)->write_property(&obj, property, z, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL));
-                               OBJ_RELEASE(Z_OBJ(obj));
-                               zval_ptr_dtor(z);
-                       } else {
-                               zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
-                               }
-                       }
+                       zend_pre_incdec_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL));
                }
        } while (0);
 
@@ -20308,15 +20184,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
-       return zend_pre_incdec_property_helper_SPEC_VAR_CV(increment_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC);
+       return zend_pre_incdec_property_helper_SPEC_VAR_CV(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC);
 }
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_OBJ_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
-       return zend_pre_incdec_property_helper_SPEC_VAR_CV(decrement_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC);
+       return zend_pre_incdec_property_helper_SPEC_VAR_CV(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC);
 }
 
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_VAR_CV(incdec_t incdec_op ZEND_OPCODE_HANDLER_ARGS_DC)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_VAR_CV(int inc ZEND_OPCODE_HANDLER_ARGS_DC)
 {
        USE_OPLINE
        zend_free_op free_op1;
@@ -20357,44 +20233,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
                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(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) {
 
-                       ZVAL_DEREF(zptr);
-                       ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr);
-                       zval_opt_copy_ctor(zptr);
-                       incdec_op(zptr);
-               } else {
-                       if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
-                               zval rv, obj;
-                               zval *z;
-                               zval z_copy;
-
-                               ZVAL_OBJ(&obj, Z_OBJ_P(object));
-                               Z_ADDREF(obj);
-                               z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), &rv);
-                               if (UNEXPECTED(EG(exception))) {
-                                       OBJ_RELEASE(Z_OBJ(obj));
-                                       break;
-                               }
-
-                               if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
-                                       zval rv2;
-                                       zval *value = Z_OBJ_HT_P(z)->get(z, &rv2);
-                                       if (z == &rv) {
-                                               zval_ptr_dtor(&rv);
-                                       }
-                                       ZVAL_COPY_VALUE(z, value);
+                       if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) {
+                               ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr);
+                               if (inc) {
+                                       fast_long_increment_function(zptr);
+                               } else {
+                                       fast_long_decrement_function(zptr);
                                }
-                               ZVAL_DUP(EX_VAR(opline->result.var), z);
-                               ZVAL_DUP(&z_copy, z);
-                               incdec_op(&z_copy);
-                               if (Z_REFCOUNTED_P(z)) Z_ADDREF_P(z);
-                               Z_OBJ_HT(obj)->write_property(&obj, property, &z_copy, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL));
-                               OBJ_RELEASE(Z_OBJ(obj));
-                               zval_ptr_dtor(&z_copy);
-                               zval_ptr_dtor(z);
                        } else {
-                               zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
-                               ZVAL_NULL(EX_VAR(opline->result.var));
+                               ZVAL_DEREF(zptr);
+                               ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr);
+                               zval_opt_copy_ctor(zptr);
+                               if (inc) {
+                                       increment_function(zptr);
+                               } else {
+                                       decrement_function(zptr);
+                               }
                        }
+               } else {
+                       zend_post_incdec_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var));
                }
        } while (0);
 
@@ -20405,12 +20262,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
-       return zend_post_incdec_property_helper_SPEC_VAR_CV(increment_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC);
+       return zend_post_incdec_property_helper_SPEC_VAR_CV(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC);
 }
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_OBJ_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
-       return zend_post_incdec_property_helper_SPEC_VAR_CV(decrement_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC);
+       return zend_post_incdec_property_helper_SPEC_VAR_CV(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC);
 }
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -20549,7 +20406,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_CV_HANDLE
 
        offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var);
 
-       if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
+       if (IS_VAR == IS_CONST ||
+           (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
                if ((IS_VAR & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
                        container = Z_REFVAL_P(container);
                        if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
@@ -21575,42 +21433,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP
                                ZVAL_COPY(EX_VAR(opline->result.var), zptr);
                        }
                } else {
-                       zval *z;
-                       zval rv, obj;
-
-                       ZVAL_OBJ(&obj, Z_OBJ_P(object));
-                       Z_ADDREF(obj);
-                       if (Z_OBJ_HT(obj)->read_property &&
-                               (z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), &rv)) != NULL) {
-                               if (UNEXPECTED(EG(exception))) {
-                                       OBJ_RELEASE(Z_OBJ(obj));
-                                       break;
-                               }
-                               if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
-                                       zval rv2;
-                                       zval *value = Z_OBJ_HT_P(z)->get(z, &rv2);
-
-                                       if (z == &rv) {
-                                               zval_ptr_dtor(&rv);
-                                       }
-                                       ZVAL_COPY_VALUE(z, value);
-                               }
-                               zptr = z;
-                               ZVAL_DEREF(z);
-                               SEPARATE_ZVAL_NOREF(z);
-                               binary_op(z, z, value);
-                               Z_OBJ_HT(obj)->write_property(&obj, property, z, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL));
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_COPY(EX_VAR(opline->result.var), z);
-                               }
-                               zval_ptr_dtor(zptr);
-                       } else {
-                               zend_error(E_WARNING, "Attempt to assign property of non-object");
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
-                               }
-                       }
-                       OBJ_RELEASE(Z_OBJ(obj));
+                       zend_assign_op_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL));
                }
        } while (0);
 
@@ -21958,7 +21781,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_
 #endif
 }
 
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_VAR_TMPVAR(incdec_t incdec_op ZEND_OPCODE_HANDLER_ARGS_DC)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_VAR_TMPVAR(int inc ZEND_OPCODE_HANDLER_ARGS_DC)
 {
        USE_OPLINE
        zend_free_op free_op1, free_op2;
@@ -22001,51 +21824,27 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
                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(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) {
 
-                       ZVAL_DEREF(zptr);
-                       SEPARATE_ZVAL_NOREF(zptr);
+                       if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) {
+                               if (inc) {
+                                       fast_long_increment_function(zptr);
+                               } else {
+                                       fast_long_decrement_function(zptr);
+                               }
+                       } else {
+                               ZVAL_DEREF(zptr);
+                               SEPARATE_ZVAL_NOREF(zptr);
 
-                       incdec_op(zptr);
+                               if (inc) {
+                                       increment_function(zptr);
+                               } else {
+                                       decrement_function(zptr);
+                               }
+                       }
                        if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                                ZVAL_COPY(EX_VAR(opline->result.var), zptr);
                        }
                } else {
-                       zval rv;
-
-                       if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
-                               zval *z, obj;
-
-                               ZVAL_OBJ(&obj, Z_OBJ_P(object));
-                               Z_ADDREF(obj);
-                               z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), &rv);
-                               if (UNEXPECTED(EG(exception))) {
-                                       OBJ_RELEASE(Z_OBJ(obj));
-                                       break;
-                               }
-
-                               if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
-                                       zval rv2;
-                                       zval *value = Z_OBJ_HT_P(z)->get(z, &rv2);
-
-                                       if (z == &rv) {
-                                               zval_ptr_dtor(&rv);
-                                       }
-                                       ZVAL_COPY_VALUE(z, value);
-                               }
-                               ZVAL_DEREF(z);
-                               SEPARATE_ZVAL_NOREF(z);
-                               incdec_op(z);
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_COPY(EX_VAR(opline->result.var), z);
-                               }
-                               Z_OBJ_HT(obj)->write_property(&obj, property, z, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL));
-                               OBJ_RELEASE(Z_OBJ(obj));
-                               zval_ptr_dtor(z);
-                       } else {
-                               zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
-                               }
-                       }
+                       zend_pre_incdec_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL));
                }
        } while (0);
 
@@ -22057,15 +21856,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
-       return zend_pre_incdec_property_helper_SPEC_VAR_TMPVAR(increment_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC);
+       return zend_pre_incdec_property_helper_SPEC_VAR_TMPVAR(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC);
 }
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_OBJ_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
-       return zend_pre_incdec_property_helper_SPEC_VAR_TMPVAR(decrement_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC);
+       return zend_pre_incdec_property_helper_SPEC_VAR_TMPVAR(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC);
 }
 
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_VAR_TMPVAR(incdec_t incdec_op ZEND_OPCODE_HANDLER_ARGS_DC)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_VAR_TMPVAR(int inc ZEND_OPCODE_HANDLER_ARGS_DC)
 {
        USE_OPLINE
        zend_free_op free_op1, free_op2;
@@ -22106,44 +21905,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
                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(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) {
 
-                       ZVAL_DEREF(zptr);
-                       ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr);
-                       zval_opt_copy_ctor(zptr);
-                       incdec_op(zptr);
-               } else {
-                       if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
-                               zval rv, obj;
-                               zval *z;
-                               zval z_copy;
-
-                               ZVAL_OBJ(&obj, Z_OBJ_P(object));
-                               Z_ADDREF(obj);
-                               z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), &rv);
-                               if (UNEXPECTED(EG(exception))) {
-                                       OBJ_RELEASE(Z_OBJ(obj));
-                                       break;
-                               }
-
-                               if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
-                                       zval rv2;
-                                       zval *value = Z_OBJ_HT_P(z)->get(z, &rv2);
-                                       if (z == &rv) {
-                                               zval_ptr_dtor(&rv);
-                                       }
-                                       ZVAL_COPY_VALUE(z, value);
+                       if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) {
+                               ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr);
+                               if (inc) {
+                                       fast_long_increment_function(zptr);
+                               } else {
+                                       fast_long_decrement_function(zptr);
                                }
-                               ZVAL_DUP(EX_VAR(opline->result.var), z);
-                               ZVAL_DUP(&z_copy, z);
-                               incdec_op(&z_copy);
-                               if (Z_REFCOUNTED_P(z)) Z_ADDREF_P(z);
-                               Z_OBJ_HT(obj)->write_property(&obj, property, &z_copy, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL));
-                               OBJ_RELEASE(Z_OBJ(obj));
-                               zval_ptr_dtor(&z_copy);
-                               zval_ptr_dtor(z);
                        } else {
-                               zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
-                               ZVAL_NULL(EX_VAR(opline->result.var));
+                               ZVAL_DEREF(zptr);
+                               ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr);
+                               zval_opt_copy_ctor(zptr);
+                               if (inc) {
+                                       increment_function(zptr);
+                               } else {
+                                       decrement_function(zptr);
+                               }
                        }
+               } else {
+                       zend_post_incdec_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var));
                }
        } while (0);
 
@@ -22155,12 +21935,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
-       return zend_post_incdec_property_helper_SPEC_VAR_TMPVAR(increment_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC);
+       return zend_post_incdec_property_helper_SPEC_VAR_TMPVAR(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC);
 }
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_OBJ_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
-       return zend_post_incdec_property_helper_SPEC_VAR_TMPVAR(decrement_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC);
+       return zend_post_incdec_property_helper_SPEC_VAR_TMPVAR(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC);
 }
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -22299,7 +22079,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_VAR_TMPVAR_HA
 
        offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
 
-       if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
+       if (IS_VAR == IS_CONST ||
+           (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
                if ((IS_VAR & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
                        container = Z_REFVAL_P(container);
                        if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
@@ -23207,42 +22988,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP
                                ZVAL_COPY(EX_VAR(opline->result.var), zptr);
                        }
                } else {
-                       zval *z;
-                       zval rv, obj;
-
-                       ZVAL_OBJ(&obj, Z_OBJ_P(object));
-                       Z_ADDREF(obj);
-                       if (Z_OBJ_HT(obj)->read_property &&
-                               (z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), &rv)) != NULL) {
-                               if (UNEXPECTED(EG(exception))) {
-                                       OBJ_RELEASE(Z_OBJ(obj));
-                                       break;
-                               }
-                               if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
-                                       zval rv2;
-                                       zval *value = Z_OBJ_HT_P(z)->get(z, &rv2);
-
-                                       if (z == &rv) {
-                                               zval_ptr_dtor(&rv);
-                                       }
-                                       ZVAL_COPY_VALUE(z, value);
-                               }
-                               zptr = z;
-                               ZVAL_DEREF(z);
-                               SEPARATE_ZVAL_NOREF(z);
-                               binary_op(z, z, value);
-                               Z_OBJ_HT(obj)->write_property(&obj, property, z, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL));
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_COPY(EX_VAR(opline->result.var), z);
-                               }
-                               zval_ptr_dtor(zptr);
-                       } else {
-                               zend_error(E_WARNING, "Attempt to assign property of non-object");
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
-                               }
-                       }
-                       OBJ_RELEASE(Z_OBJ(obj));
+                       zend_assign_op_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL));
                }
        } while (0);
 
@@ -23550,7 +23296,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_UNUSED_CONS
 #endif
 }
 
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_UNUSED_CONST(incdec_t incdec_op ZEND_OPCODE_HANDLER_ARGS_DC)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_UNUSED_CONST(int inc ZEND_OPCODE_HANDLER_ARGS_DC)
 {
        USE_OPLINE
 
@@ -23593,51 +23339,27 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
                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(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) {
 
-                       ZVAL_DEREF(zptr);
-                       SEPARATE_ZVAL_NOREF(zptr);
+                       if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) {
+                               if (inc) {
+                                       fast_long_increment_function(zptr);
+                               } else {
+                                       fast_long_decrement_function(zptr);
+                               }
+                       } else {
+                               ZVAL_DEREF(zptr);
+                               SEPARATE_ZVAL_NOREF(zptr);
 
-                       incdec_op(zptr);
+                               if (inc) {
+                                       increment_function(zptr);
+                               } else {
+                                       decrement_function(zptr);
+                               }
+                       }
                        if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                                ZVAL_COPY(EX_VAR(opline->result.var), zptr);
                        }
                } else {
-                       zval rv;
-
-                       if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
-                               zval *z, obj;
-
-                               ZVAL_OBJ(&obj, Z_OBJ_P(object));
-                               Z_ADDREF(obj);
-                               z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), &rv);
-                               if (UNEXPECTED(EG(exception))) {
-                                       OBJ_RELEASE(Z_OBJ(obj));
-                                       break;
-                               }
-
-                               if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
-                                       zval rv2;
-                                       zval *value = Z_OBJ_HT_P(z)->get(z, &rv2);
-
-                                       if (z == &rv) {
-                                               zval_ptr_dtor(&rv);
-                                       }
-                                       ZVAL_COPY_VALUE(z, value);
-                               }
-                               ZVAL_DEREF(z);
-                               SEPARATE_ZVAL_NOREF(z);
-                               incdec_op(z);
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_COPY(EX_VAR(opline->result.var), z);
-                               }
-                               Z_OBJ_HT(obj)->write_property(&obj, property, z, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL));
-                               OBJ_RELEASE(Z_OBJ(obj));
-                               zval_ptr_dtor(z);
-                       } else {
-                               zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
-                               }
-                       }
+                       zend_pre_incdec_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL));
                }
        } while (0);
 
@@ -23648,15 +23370,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
-       return zend_pre_incdec_property_helper_SPEC_UNUSED_CONST(increment_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC);
+       return zend_pre_incdec_property_helper_SPEC_UNUSED_CONST(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC);
 }
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_OBJ_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
-       return zend_pre_incdec_property_helper_SPEC_UNUSED_CONST(decrement_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC);
+       return zend_pre_incdec_property_helper_SPEC_UNUSED_CONST(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC);
 }
 
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_UNUSED_CONST(incdec_t incdec_op ZEND_OPCODE_HANDLER_ARGS_DC)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_UNUSED_CONST(int inc ZEND_OPCODE_HANDLER_ARGS_DC)
 {
        USE_OPLINE
 
@@ -23697,44 +23419,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
                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(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) {
 
-                       ZVAL_DEREF(zptr);
-                       ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr);
-                       zval_opt_copy_ctor(zptr);
-                       incdec_op(zptr);
-               } else {
-                       if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
-                               zval rv, obj;
-                               zval *z;
-                               zval z_copy;
-
-                               ZVAL_OBJ(&obj, Z_OBJ_P(object));
-                               Z_ADDREF(obj);
-                               z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), &rv);
-                               if (UNEXPECTED(EG(exception))) {
-                                       OBJ_RELEASE(Z_OBJ(obj));
-                                       break;
-                               }
-
-                               if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
-                                       zval rv2;
-                                       zval *value = Z_OBJ_HT_P(z)->get(z, &rv2);
-                                       if (z == &rv) {
-                                               zval_ptr_dtor(&rv);
-                                       }
-                                       ZVAL_COPY_VALUE(z, value);
+                       if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) {
+                               ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr);
+                               if (inc) {
+                                       fast_long_increment_function(zptr);
+                               } else {
+                                       fast_long_decrement_function(zptr);
                                }
-                               ZVAL_DUP(EX_VAR(opline->result.var), z);
-                               ZVAL_DUP(&z_copy, z);
-                               incdec_op(&z_copy);
-                               if (Z_REFCOUNTED_P(z)) Z_ADDREF_P(z);
-                               Z_OBJ_HT(obj)->write_property(&obj, property, &z_copy, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL));
-                               OBJ_RELEASE(Z_OBJ(obj));
-                               zval_ptr_dtor(&z_copy);
-                               zval_ptr_dtor(z);
                        } else {
-                               zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
-                               ZVAL_NULL(EX_VAR(opline->result.var));
+                               ZVAL_DEREF(zptr);
+                               ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr);
+                               zval_opt_copy_ctor(zptr);
+                               if (inc) {
+                                       increment_function(zptr);
+                               } else {
+                                       decrement_function(zptr);
+                               }
                        }
+               } else {
+                       zend_post_incdec_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var));
                }
        } while (0);
 
@@ -23745,12 +23448,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
-       return zend_post_incdec_property_helper_SPEC_UNUSED_CONST(increment_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC);
+       return zend_post_incdec_property_helper_SPEC_UNUSED_CONST(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC);
 }
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_OBJ_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
-       return zend_post_incdec_property_helper_SPEC_UNUSED_CONST(decrement_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC);
+       return zend_post_incdec_property_helper_SPEC_UNUSED_CONST(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC);
 }
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -23772,7 +23475,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CONST_
 
        offset = EX_CONSTANT(opline->op2);
 
-       if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
+       if (IS_UNUSED == IS_CONST ||
+           (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
                if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
                        container = Z_REFVAL_P(container);
                        if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
@@ -23909,7 +23613,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_UNUSED_CONST
 
        offset  = EX_CONSTANT(opline->op2);
 
-       if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
+       if (IS_UNUSED == IS_CONST ||
+           (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
                if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
                        container = Z_REFVAL_P(container);
                        if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
@@ -24633,7 +24338,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UN
 
        offset = EX_CONSTANT(opline->op2);
 
-       if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
+       if (IS_UNUSED == IS_CONST ||
+           (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
                if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
                        container = Z_REFVAL_P(container);
                        if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
@@ -25642,42 +25348,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP
                                ZVAL_COPY(EX_VAR(opline->result.var), zptr);
                        }
                } else {
-                       zval *z;
-                       zval rv, obj;
-
-                       ZVAL_OBJ(&obj, Z_OBJ_P(object));
-                       Z_ADDREF(obj);
-                       if (Z_OBJ_HT(obj)->read_property &&
-                               (z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), &rv)) != NULL) {
-                               if (UNEXPECTED(EG(exception))) {
-                                       OBJ_RELEASE(Z_OBJ(obj));
-                                       break;
-                               }
-                               if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
-                                       zval rv2;
-                                       zval *value = Z_OBJ_HT_P(z)->get(z, &rv2);
-
-                                       if (z == &rv) {
-                                               zval_ptr_dtor(&rv);
-                                       }
-                                       ZVAL_COPY_VALUE(z, value);
-                               }
-                               zptr = z;
-                               ZVAL_DEREF(z);
-                               SEPARATE_ZVAL_NOREF(z);
-                               binary_op(z, z, value);
-                               Z_OBJ_HT(obj)->write_property(&obj, property, z, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL));
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_COPY(EX_VAR(opline->result.var), z);
-                               }
-                               zval_ptr_dtor(zptr);
-                       } else {
-                               zend_error(E_WARNING, "Attempt to assign property of non-object");
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
-                               }
-                       }
-                       OBJ_RELEASE(Z_OBJ(obj));
+                       zend_assign_op_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL));
                }
        } while (0);
 
@@ -25985,7 +25656,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_UNUSED_CV_H
 #endif
 }
 
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_UNUSED_CV(incdec_t incdec_op ZEND_OPCODE_HANDLER_ARGS_DC)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_UNUSED_CV(int inc ZEND_OPCODE_HANDLER_ARGS_DC)
 {
        USE_OPLINE
 
@@ -26028,51 +25699,27 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
                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(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) {
 
-                       ZVAL_DEREF(zptr);
-                       SEPARATE_ZVAL_NOREF(zptr);
+                       if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) {
+                               if (inc) {
+                                       fast_long_increment_function(zptr);
+                               } else {
+                                       fast_long_decrement_function(zptr);
+                               }
+                       } else {
+                               ZVAL_DEREF(zptr);
+                               SEPARATE_ZVAL_NOREF(zptr);
 
-                       incdec_op(zptr);
+                               if (inc) {
+                                       increment_function(zptr);
+                               } else {
+                                       decrement_function(zptr);
+                               }
+                       }
                        if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                                ZVAL_COPY(EX_VAR(opline->result.var), zptr);
                        }
                } else {
-                       zval rv;
-
-                       if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
-                               zval *z, obj;
-
-                               ZVAL_OBJ(&obj, Z_OBJ_P(object));
-                               Z_ADDREF(obj);
-                               z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), &rv);
-                               if (UNEXPECTED(EG(exception))) {
-                                       OBJ_RELEASE(Z_OBJ(obj));
-                                       break;
-                               }
-
-                               if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
-                                       zval rv2;
-                                       zval *value = Z_OBJ_HT_P(z)->get(z, &rv2);
-
-                                       if (z == &rv) {
-                                               zval_ptr_dtor(&rv);
-                                       }
-                                       ZVAL_COPY_VALUE(z, value);
-                               }
-                               ZVAL_DEREF(z);
-                               SEPARATE_ZVAL_NOREF(z);
-                               incdec_op(z);
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_COPY(EX_VAR(opline->result.var), z);
-                               }
-                               Z_OBJ_HT(obj)->write_property(&obj, property, z, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL));
-                               OBJ_RELEASE(Z_OBJ(obj));
-                               zval_ptr_dtor(z);
-                       } else {
-                               zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
-                               }
-                       }
+                       zend_pre_incdec_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL));
                }
        } while (0);
 
@@ -26083,15 +25730,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
-       return zend_pre_incdec_property_helper_SPEC_UNUSED_CV(increment_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC);
+       return zend_pre_incdec_property_helper_SPEC_UNUSED_CV(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC);
 }
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_OBJ_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
-       return zend_pre_incdec_property_helper_SPEC_UNUSED_CV(decrement_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC);
+       return zend_pre_incdec_property_helper_SPEC_UNUSED_CV(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC);
 }
 
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_UNUSED_CV(incdec_t incdec_op ZEND_OPCODE_HANDLER_ARGS_DC)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_UNUSED_CV(int inc ZEND_OPCODE_HANDLER_ARGS_DC)
 {
        USE_OPLINE
 
@@ -26132,44 +25779,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
                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(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) {
 
-                       ZVAL_DEREF(zptr);
-                       ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr);
-                       zval_opt_copy_ctor(zptr);
-                       incdec_op(zptr);
-               } else {
-                       if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
-                               zval rv, obj;
-                               zval *z;
-                               zval z_copy;
-
-                               ZVAL_OBJ(&obj, Z_OBJ_P(object));
-                               Z_ADDREF(obj);
-                               z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), &rv);
-                               if (UNEXPECTED(EG(exception))) {
-                                       OBJ_RELEASE(Z_OBJ(obj));
-                                       break;
-                               }
-
-                               if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
-                                       zval rv2;
-                                       zval *value = Z_OBJ_HT_P(z)->get(z, &rv2);
-                                       if (z == &rv) {
-                                               zval_ptr_dtor(&rv);
-                                       }
-                                       ZVAL_COPY_VALUE(z, value);
+                       if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) {
+                               ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr);
+                               if (inc) {
+                                       fast_long_increment_function(zptr);
+                               } else {
+                                       fast_long_decrement_function(zptr);
                                }
-                               ZVAL_DUP(EX_VAR(opline->result.var), z);
-                               ZVAL_DUP(&z_copy, z);
-                               incdec_op(&z_copy);
-                               if (Z_REFCOUNTED_P(z)) Z_ADDREF_P(z);
-                               Z_OBJ_HT(obj)->write_property(&obj, property, &z_copy, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL));
-                               OBJ_RELEASE(Z_OBJ(obj));
-                               zval_ptr_dtor(&z_copy);
-                               zval_ptr_dtor(z);
                        } else {
-                               zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
-                               ZVAL_NULL(EX_VAR(opline->result.var));
+                               ZVAL_DEREF(zptr);
+                               ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr);
+                               zval_opt_copy_ctor(zptr);
+                               if (inc) {
+                                       increment_function(zptr);
+                               } else {
+                                       decrement_function(zptr);
+                               }
                        }
+               } else {
+                       zend_post_incdec_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var));
                }
        } while (0);
 
@@ -26180,12 +25808,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
-       return zend_post_incdec_property_helper_SPEC_UNUSED_CV(increment_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC);
+       return zend_post_incdec_property_helper_SPEC_UNUSED_CV(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC);
 }
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_OBJ_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
-       return zend_post_incdec_property_helper_SPEC_UNUSED_CV(decrement_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC);
+       return zend_post_incdec_property_helper_SPEC_UNUSED_CV(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC);
 }
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -26207,7 +25835,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CV_HAN
 
        offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var);
 
-       if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
+       if (IS_UNUSED == IS_CONST ||
+           (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
                if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
                        container = Z_REFVAL_P(container);
                        if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
@@ -26344,7 +25973,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_UNUSED_CV_HA
 
        offset  = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var);
 
-       if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
+       if (IS_UNUSED == IS_CONST ||
+           (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
                if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
                        container = Z_REFVAL_P(container);
                        if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
@@ -26959,7 +26589,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UN
 
        offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var);
 
-       if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
+       if (IS_UNUSED == IS_CONST ||
+           (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
                if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
                        container = Z_REFVAL_P(container);
                        if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
@@ -27178,42 +26809,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP
                                ZVAL_COPY(EX_VAR(opline->result.var), zptr);
                        }
                } else {
-                       zval *z;
-                       zval rv, obj;
-
-                       ZVAL_OBJ(&obj, Z_OBJ_P(object));
-                       Z_ADDREF(obj);
-                       if (Z_OBJ_HT(obj)->read_property &&
-                               (z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), &rv)) != NULL) {
-                               if (UNEXPECTED(EG(exception))) {
-                                       OBJ_RELEASE(Z_OBJ(obj));
-                                       break;
-                               }
-                               if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
-                                       zval rv2;
-                                       zval *value = Z_OBJ_HT_P(z)->get(z, &rv2);
-
-                                       if (z == &rv) {
-                                               zval_ptr_dtor(&rv);
-                                       }
-                                       ZVAL_COPY_VALUE(z, value);
-                               }
-                               zptr = z;
-                               ZVAL_DEREF(z);
-                               SEPARATE_ZVAL_NOREF(z);
-                               binary_op(z, z, value);
-                               Z_OBJ_HT(obj)->write_property(&obj, property, z, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL));
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_COPY(EX_VAR(opline->result.var), z);
-                               }
-                               zval_ptr_dtor(zptr);
-                       } else {
-                               zend_error(E_WARNING, "Attempt to assign property of non-object");
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
-                               }
-                       }
-                       OBJ_RELEASE(Z_OBJ(obj));
+                       zend_assign_op_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL));
                }
        } while (0);
 
@@ -27522,7 +27118,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_UNUSED_TMPV
 #endif
 }
 
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_UNUSED_TMPVAR(incdec_t incdec_op ZEND_OPCODE_HANDLER_ARGS_DC)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_UNUSED_TMPVAR(int inc ZEND_OPCODE_HANDLER_ARGS_DC)
 {
        USE_OPLINE
        zend_free_op free_op2;
@@ -27565,51 +27161,27 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
                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(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) {
 
-                       ZVAL_DEREF(zptr);
-                       SEPARATE_ZVAL_NOREF(zptr);
+                       if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) {
+                               if (inc) {
+                                       fast_long_increment_function(zptr);
+                               } else {
+                                       fast_long_decrement_function(zptr);
+                               }
+                       } else {
+                               ZVAL_DEREF(zptr);
+                               SEPARATE_ZVAL_NOREF(zptr);
 
-                       incdec_op(zptr);
+                               if (inc) {
+                                       increment_function(zptr);
+                               } else {
+                                       decrement_function(zptr);
+                               }
+                       }
                        if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                                ZVAL_COPY(EX_VAR(opline->result.var), zptr);
                        }
                } else {
-                       zval rv;
-
-                       if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
-                               zval *z, obj;
-
-                               ZVAL_OBJ(&obj, Z_OBJ_P(object));
-                               Z_ADDREF(obj);
-                               z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), &rv);
-                               if (UNEXPECTED(EG(exception))) {
-                                       OBJ_RELEASE(Z_OBJ(obj));
-                                       break;
-                               }
-
-                               if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
-                                       zval rv2;
-                                       zval *value = Z_OBJ_HT_P(z)->get(z, &rv2);
-
-                                       if (z == &rv) {
-                                               zval_ptr_dtor(&rv);
-                                       }
-                                       ZVAL_COPY_VALUE(z, value);
-                               }
-                               ZVAL_DEREF(z);
-                               SEPARATE_ZVAL_NOREF(z);
-                               incdec_op(z);
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_COPY(EX_VAR(opline->result.var), z);
-                               }
-                               Z_OBJ_HT(obj)->write_property(&obj, property, z, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL));
-                               OBJ_RELEASE(Z_OBJ(obj));
-                               zval_ptr_dtor(z);
-                       } else {
-                               zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
-                               }
-                       }
+                       zend_pre_incdec_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL));
                }
        } while (0);
 
@@ -27621,15 +27193,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
-       return zend_pre_incdec_property_helper_SPEC_UNUSED_TMPVAR(increment_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC);
+       return zend_pre_incdec_property_helper_SPEC_UNUSED_TMPVAR(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC);
 }
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_OBJ_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
-       return zend_pre_incdec_property_helper_SPEC_UNUSED_TMPVAR(decrement_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC);
+       return zend_pre_incdec_property_helper_SPEC_UNUSED_TMPVAR(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC);
 }
 
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_UNUSED_TMPVAR(incdec_t incdec_op ZEND_OPCODE_HANDLER_ARGS_DC)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_UNUSED_TMPVAR(int inc ZEND_OPCODE_HANDLER_ARGS_DC)
 {
        USE_OPLINE
        zend_free_op free_op2;
@@ -27670,44 +27242,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
                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(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) {
 
-                       ZVAL_DEREF(zptr);
-                       ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr);
-                       zval_opt_copy_ctor(zptr);
-                       incdec_op(zptr);
-               } else {
-                       if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
-                               zval rv, obj;
-                               zval *z;
-                               zval z_copy;
-
-                               ZVAL_OBJ(&obj, Z_OBJ_P(object));
-                               Z_ADDREF(obj);
-                               z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), &rv);
-                               if (UNEXPECTED(EG(exception))) {
-                                       OBJ_RELEASE(Z_OBJ(obj));
-                                       break;
-                               }
-
-                               if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
-                                       zval rv2;
-                                       zval *value = Z_OBJ_HT_P(z)->get(z, &rv2);
-                                       if (z == &rv) {
-                                               zval_ptr_dtor(&rv);
-                                       }
-                                       ZVAL_COPY_VALUE(z, value);
+                       if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) {
+                               ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr);
+                               if (inc) {
+                                       fast_long_increment_function(zptr);
+                               } else {
+                                       fast_long_decrement_function(zptr);
                                }
-                               ZVAL_DUP(EX_VAR(opline->result.var), z);
-                               ZVAL_DUP(&z_copy, z);
-                               incdec_op(&z_copy);
-                               if (Z_REFCOUNTED_P(z)) Z_ADDREF_P(z);
-                               Z_OBJ_HT(obj)->write_property(&obj, property, &z_copy, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL));
-                               OBJ_RELEASE(Z_OBJ(obj));
-                               zval_ptr_dtor(&z_copy);
-                               zval_ptr_dtor(z);
                        } else {
-                               zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
-                               ZVAL_NULL(EX_VAR(opline->result.var));
+                               ZVAL_DEREF(zptr);
+                               ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr);
+                               zval_opt_copy_ctor(zptr);
+                               if (inc) {
+                                       increment_function(zptr);
+                               } else {
+                                       decrement_function(zptr);
+                               }
                        }
+               } else {
+                       zend_post_incdec_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var));
                }
        } while (0);
 
@@ -27719,12 +27272,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
-       return zend_post_incdec_property_helper_SPEC_UNUSED_TMPVAR(increment_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC);
+       return zend_post_incdec_property_helper_SPEC_UNUSED_TMPVAR(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC);
 }
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_OBJ_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
-       return zend_post_incdec_property_helper_SPEC_UNUSED_TMPVAR(decrement_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC);
+       return zend_post_incdec_property_helper_SPEC_UNUSED_TMPVAR(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC);
 }
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -27746,7 +27299,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR
 
        offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
 
-       if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
+       if (IS_UNUSED == IS_CONST ||
+           (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
                if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
                        container = Z_REFVAL_P(container);
                        if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
@@ -27884,7 +27438,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_UNUSED_TMPVA
 
        offset  = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
 
-       if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
+       if (IS_UNUSED == IS_CONST ||
+           (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
                if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
                        container = Z_REFVAL_P(container);
                        if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
@@ -28502,7 +28057,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_UN
 
        offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
 
-       if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
+       if (IS_UNUSED == IS_CONST ||
+           (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
                if ((IS_UNUSED & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
                        container = Z_REFVAL_P(container);
                        if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
@@ -30969,42 +30525,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP
                                ZVAL_COPY(EX_VAR(opline->result.var), zptr);
                        }
                } else {
-                       zval *z;
-                       zval rv, obj;
-
-                       ZVAL_OBJ(&obj, Z_OBJ_P(object));
-                       Z_ADDREF(obj);
-                       if (Z_OBJ_HT(obj)->read_property &&
-                               (z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), &rv)) != NULL) {
-                               if (UNEXPECTED(EG(exception))) {
-                                       OBJ_RELEASE(Z_OBJ(obj));
-                                       break;
-                               }
-                               if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
-                                       zval rv2;
-                                       zval *value = Z_OBJ_HT_P(z)->get(z, &rv2);
-
-                                       if (z == &rv) {
-                                               zval_ptr_dtor(&rv);
-                                       }
-                                       ZVAL_COPY_VALUE(z, value);
-                               }
-                               zptr = z;
-                               ZVAL_DEREF(z);
-                               SEPARATE_ZVAL_NOREF(z);
-                               binary_op(z, z, value);
-                               Z_OBJ_HT(obj)->write_property(&obj, property, z, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL));
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_COPY(EX_VAR(opline->result.var), z);
-                               }
-                               zval_ptr_dtor(zptr);
-                       } else {
-                               zend_error(E_WARNING, "Attempt to assign property of non-object");
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
-                               }
-                       }
-                       OBJ_RELEASE(Z_OBJ(obj));
+                       zend_assign_op_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL));
                }
        } while (0);
 
@@ -31350,7 +30871,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_CV_CONST_HA
 #endif
 }
 
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_CV_CONST(incdec_t incdec_op ZEND_OPCODE_HANDLER_ARGS_DC)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_CV_CONST(int inc ZEND_OPCODE_HANDLER_ARGS_DC)
 {
        USE_OPLINE
 
@@ -31393,51 +30914,27 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
                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(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) {
 
-                       ZVAL_DEREF(zptr);
-                       SEPARATE_ZVAL_NOREF(zptr);
+                       if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) {
+                               if (inc) {
+                                       fast_long_increment_function(zptr);
+                               } else {
+                                       fast_long_decrement_function(zptr);
+                               }
+                       } else {
+                               ZVAL_DEREF(zptr);
+                               SEPARATE_ZVAL_NOREF(zptr);
 
-                       incdec_op(zptr);
+                               if (inc) {
+                                       increment_function(zptr);
+                               } else {
+                                       decrement_function(zptr);
+                               }
+                       }
                        if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                                ZVAL_COPY(EX_VAR(opline->result.var), zptr);
                        }
                } else {
-                       zval rv;
-
-                       if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
-                               zval *z, obj;
-
-                               ZVAL_OBJ(&obj, Z_OBJ_P(object));
-                               Z_ADDREF(obj);
-                               z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), &rv);
-                               if (UNEXPECTED(EG(exception))) {
-                                       OBJ_RELEASE(Z_OBJ(obj));
-                                       break;
-                               }
-
-                               if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
-                                       zval rv2;
-                                       zval *value = Z_OBJ_HT_P(z)->get(z, &rv2);
-
-                                       if (z == &rv) {
-                                               zval_ptr_dtor(&rv);
-                                       }
-                                       ZVAL_COPY_VALUE(z, value);
-                               }
-                               ZVAL_DEREF(z);
-                               SEPARATE_ZVAL_NOREF(z);
-                               incdec_op(z);
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_COPY(EX_VAR(opline->result.var), z);
-                               }
-                               Z_OBJ_HT(obj)->write_property(&obj, property, z, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL));
-                               OBJ_RELEASE(Z_OBJ(obj));
-                               zval_ptr_dtor(z);
-                       } else {
-                               zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
-                               }
-                       }
+                       zend_pre_incdec_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL));
                }
        } while (0);
 
@@ -31448,15 +30945,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
-       return zend_pre_incdec_property_helper_SPEC_CV_CONST(increment_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC);
+       return zend_pre_incdec_property_helper_SPEC_CV_CONST(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC);
 }
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_OBJ_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
-       return zend_pre_incdec_property_helper_SPEC_CV_CONST(decrement_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC);
+       return zend_pre_incdec_property_helper_SPEC_CV_CONST(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC);
 }
 
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_CV_CONST(incdec_t incdec_op ZEND_OPCODE_HANDLER_ARGS_DC)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_CV_CONST(int inc ZEND_OPCODE_HANDLER_ARGS_DC)
 {
        USE_OPLINE
 
@@ -31497,44 +30994,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
                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(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) {
 
-                       ZVAL_DEREF(zptr);
-                       ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr);
-                       zval_opt_copy_ctor(zptr);
-                       incdec_op(zptr);
-               } else {
-                       if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
-                               zval rv, obj;
-                               zval *z;
-                               zval z_copy;
-
-                               ZVAL_OBJ(&obj, Z_OBJ_P(object));
-                               Z_ADDREF(obj);
-                               z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), &rv);
-                               if (UNEXPECTED(EG(exception))) {
-                                       OBJ_RELEASE(Z_OBJ(obj));
-                                       break;
-                               }
-
-                               if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
-                                       zval rv2;
-                                       zval *value = Z_OBJ_HT_P(z)->get(z, &rv2);
-                                       if (z == &rv) {
-                                               zval_ptr_dtor(&rv);
-                                       }
-                                       ZVAL_COPY_VALUE(z, value);
+                       if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) {
+                               ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr);
+                               if (inc) {
+                                       fast_long_increment_function(zptr);
+                               } else {
+                                       fast_long_decrement_function(zptr);
                                }
-                               ZVAL_DUP(EX_VAR(opline->result.var), z);
-                               ZVAL_DUP(&z_copy, z);
-                               incdec_op(&z_copy);
-                               if (Z_REFCOUNTED_P(z)) Z_ADDREF_P(z);
-                               Z_OBJ_HT(obj)->write_property(&obj, property, &z_copy, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL));
-                               OBJ_RELEASE(Z_OBJ(obj));
-                               zval_ptr_dtor(&z_copy);
-                               zval_ptr_dtor(z);
                        } else {
-                               zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
-                               ZVAL_NULL(EX_VAR(opline->result.var));
+                               ZVAL_DEREF(zptr);
+                               ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr);
+                               zval_opt_copy_ctor(zptr);
+                               if (inc) {
+                                       increment_function(zptr);
+                               } else {
+                                       decrement_function(zptr);
+                               }
                        }
+               } else {
+                       zend_post_incdec_overloaded_property(object, property, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var));
                }
        } while (0);
 
@@ -31545,12 +31023,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
-       return zend_post_incdec_property_helper_SPEC_CV_CONST(increment_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC);
+       return zend_post_incdec_property_helper_SPEC_CV_CONST(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC);
 }
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_OBJ_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
-       return zend_post_incdec_property_helper_SPEC_CV_CONST(decrement_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC);
+       return zend_post_incdec_property_helper_SPEC_CV_CONST(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC);
 }
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CV_CONST(int type ZEND_OPCODE_HANDLER_ARGS_DC)
@@ -31903,7 +31381,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CONST_HAND
 
        offset = EX_CONSTANT(opline->op2);
 
-       if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
+       if (IS_CV == IS_CONST ||
+           (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
                if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
                        container = Z_REFVAL_P(container);
                        if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
@@ -32040,7 +31519,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CV_CONST_HAN
 
        offset  = EX_CONSTANT(opline->op2);
 
-       if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
+       if (IS_CV == IS_CONST ||
+           (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
                if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
                        container = Z_REFVAL_P(container);
                        if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
@@ -33224,7 +32704,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV
 
        offset = EX_CONSTANT(opline->op2);
 
-       if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
+       if (IS_CV == IS_CONST ||
+           (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
                if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
                        container = Z_REFVAL_P(container);
                        if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
@@ -36293,42 +35774,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP
                                ZVAL_COPY(EX_VAR(opline->result.var), zptr);
                        }
                } else {
-                       zval *z;
-                       zval rv, obj;
-
-                       ZVAL_OBJ(&obj, Z_OBJ_P(object));
-                       Z_ADDREF(obj);
-                       if (Z_OBJ_HT(obj)->read_property &&
-                               (z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), &rv)) != NULL) {
-                               if (UNEXPECTED(EG(exception))) {
-                                       OBJ_RELEASE(Z_OBJ(obj));
-                                       break;
-                               }
-                               if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
-                                       zval rv2;
-                                       zval *value = Z_OBJ_HT_P(z)->get(z, &rv2);
-
-                                       if (z == &rv) {
-                                               zval_ptr_dtor(&rv);
-                                       }
-                                       ZVAL_COPY_VALUE(z, value);
-                               }
-                               zptr = z;
-                               ZVAL_DEREF(z);
-                               SEPARATE_ZVAL_NOREF(z);
-                               binary_op(z, z, value);
-                               Z_OBJ_HT(obj)->write_property(&obj, property, z, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL));
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_COPY(EX_VAR(opline->result.var), z);
-                               }
-                               zval_ptr_dtor(zptr);
-                       } else {
-                               zend_error(E_WARNING, "Attempt to assign property of non-object");
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
-                               }
-                       }
-                       OBJ_RELEASE(Z_OBJ(obj));
+                       zend_assign_op_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL));
                }
        } while (0);
 
@@ -36674,7 +36120,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_CV_CV_HANDL
 #endif
 }
 
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_CV_CV(incdec_t incdec_op ZEND_OPCODE_HANDLER_ARGS_DC)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_CV_CV(int inc ZEND_OPCODE_HANDLER_ARGS_DC)
 {
        USE_OPLINE
 
@@ -36717,51 +36163,27 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
                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(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) {
 
-                       ZVAL_DEREF(zptr);
-                       SEPARATE_ZVAL_NOREF(zptr);
+                       if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) {
+                               if (inc) {
+                                       fast_long_increment_function(zptr);
+                               } else {
+                                       fast_long_decrement_function(zptr);
+                               }
+                       } else {
+                               ZVAL_DEREF(zptr);
+                               SEPARATE_ZVAL_NOREF(zptr);
 
-                       incdec_op(zptr);
+                               if (inc) {
+                                       increment_function(zptr);
+                               } else {
+                                       decrement_function(zptr);
+                               }
+                       }
                        if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                                ZVAL_COPY(EX_VAR(opline->result.var), zptr);
                        }
                } else {
-                       zval rv;
-
-                       if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
-                               zval *z, obj;
-
-                               ZVAL_OBJ(&obj, Z_OBJ_P(object));
-                               Z_ADDREF(obj);
-                               z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), &rv);
-                               if (UNEXPECTED(EG(exception))) {
-                                       OBJ_RELEASE(Z_OBJ(obj));
-                                       break;
-                               }
-
-                               if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
-                                       zval rv2;
-                                       zval *value = Z_OBJ_HT_P(z)->get(z, &rv2);
-
-                                       if (z == &rv) {
-                                               zval_ptr_dtor(&rv);
-                                       }
-                                       ZVAL_COPY_VALUE(z, value);
-                               }
-                               ZVAL_DEREF(z);
-                               SEPARATE_ZVAL_NOREF(z);
-                               incdec_op(z);
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_COPY(EX_VAR(opline->result.var), z);
-                               }
-                               Z_OBJ_HT(obj)->write_property(&obj, property, z, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL));
-                               OBJ_RELEASE(Z_OBJ(obj));
-                               zval_ptr_dtor(z);
-                       } else {
-                               zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
-                               }
-                       }
+                       zend_pre_incdec_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL));
                }
        } while (0);
 
@@ -36772,15 +36194,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
-       return zend_pre_incdec_property_helper_SPEC_CV_CV(increment_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC);
+       return zend_pre_incdec_property_helper_SPEC_CV_CV(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC);
 }
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_OBJ_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
-       return zend_pre_incdec_property_helper_SPEC_CV_CV(decrement_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC);
+       return zend_pre_incdec_property_helper_SPEC_CV_CV(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC);
 }
 
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_CV_CV(incdec_t incdec_op ZEND_OPCODE_HANDLER_ARGS_DC)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_CV_CV(int inc ZEND_OPCODE_HANDLER_ARGS_DC)
 {
        USE_OPLINE
 
@@ -36821,44 +36243,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
                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(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) {
 
-                       ZVAL_DEREF(zptr);
-                       ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr);
-                       zval_opt_copy_ctor(zptr);
-                       incdec_op(zptr);
-               } else {
-                       if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
-                               zval rv, obj;
-                               zval *z;
-                               zval z_copy;
-
-                               ZVAL_OBJ(&obj, Z_OBJ_P(object));
-                               Z_ADDREF(obj);
-                               z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), &rv);
-                               if (UNEXPECTED(EG(exception))) {
-                                       OBJ_RELEASE(Z_OBJ(obj));
-                                       break;
-                               }
-
-                               if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
-                                       zval rv2;
-                                       zval *value = Z_OBJ_HT_P(z)->get(z, &rv2);
-                                       if (z == &rv) {
-                                               zval_ptr_dtor(&rv);
-                                       }
-                                       ZVAL_COPY_VALUE(z, value);
+                       if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) {
+                               ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr);
+                               if (inc) {
+                                       fast_long_increment_function(zptr);
+                               } else {
+                                       fast_long_decrement_function(zptr);
                                }
-                               ZVAL_DUP(EX_VAR(opline->result.var), z);
-                               ZVAL_DUP(&z_copy, z);
-                               incdec_op(&z_copy);
-                               if (Z_REFCOUNTED_P(z)) Z_ADDREF_P(z);
-                               Z_OBJ_HT(obj)->write_property(&obj, property, &z_copy, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL));
-                               OBJ_RELEASE(Z_OBJ(obj));
-                               zval_ptr_dtor(&z_copy);
-                               zval_ptr_dtor(z);
                        } else {
-                               zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
-                               ZVAL_NULL(EX_VAR(opline->result.var));
+                               ZVAL_DEREF(zptr);
+                               ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr);
+                               zval_opt_copy_ctor(zptr);
+                               if (inc) {
+                                       increment_function(zptr);
+                               } else {
+                                       decrement_function(zptr);
+                               }
                        }
+               } else {
+                       zend_post_incdec_overloaded_property(object, property, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var));
                }
        } while (0);
 
@@ -36869,12 +36272,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
-       return zend_post_incdec_property_helper_SPEC_CV_CV(increment_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC);
+       return zend_post_incdec_property_helper_SPEC_CV_CV(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC);
 }
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_OBJ_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
-       return zend_post_incdec_property_helper_SPEC_CV_CV(decrement_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC);
+       return zend_post_incdec_property_helper_SPEC_CV_CV(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC);
 }
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -37043,7 +36446,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CV_HANDLER
 
        offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var);
 
-       if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
+       if (IS_CV == IS_CONST ||
+           (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
                if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
                        container = Z_REFVAL_P(container);
                        if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
@@ -37180,7 +36584,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CV_CV_HANDLE
 
        offset  = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var);
 
-       if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
+       if (IS_CV == IS_CONST ||
+           (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
                if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
                        container = Z_REFVAL_P(container);
                        if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
@@ -38201,7 +37606,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV
 
        offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var);
 
-       if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
+       if (IS_CV == IS_CONST ||
+           (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
                if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
                        container = Z_REFVAL_P(container);
                        if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
@@ -39030,42 +38436,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP
                                ZVAL_COPY(EX_VAR(opline->result.var), zptr);
                        }
                } else {
-                       zval *z;
-                       zval rv, obj;
-
-                       ZVAL_OBJ(&obj, Z_OBJ_P(object));
-                       Z_ADDREF(obj);
-                       if (Z_OBJ_HT(obj)->read_property &&
-                               (z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), &rv)) != NULL) {
-                               if (UNEXPECTED(EG(exception))) {
-                                       OBJ_RELEASE(Z_OBJ(obj));
-                                       break;
-                               }
-                               if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
-                                       zval rv2;
-                                       zval *value = Z_OBJ_HT_P(z)->get(z, &rv2);
-
-                                       if (z == &rv) {
-                                               zval_ptr_dtor(&rv);
-                                       }
-                                       ZVAL_COPY_VALUE(z, value);
-                               }
-                               zptr = z;
-                               ZVAL_DEREF(z);
-                               SEPARATE_ZVAL_NOREF(z);
-                               binary_op(z, z, value);
-                               Z_OBJ_HT(obj)->write_property(&obj, property, z, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL));
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_COPY(EX_VAR(opline->result.var), z);
-                               }
-                               zval_ptr_dtor(zptr);
-                       } else {
-                               zend_error(E_WARNING, "Attempt to assign property of non-object");
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
-                               }
-                       }
-                       OBJ_RELEASE(Z_OBJ(obj));
+                       zend_assign_op_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), value, binary_op, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL));
                }
        } while (0);
 
@@ -39413,7 +38784,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_H
 #endif
 }
 
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_CV_TMPVAR(incdec_t incdec_op ZEND_OPCODE_HANDLER_ARGS_DC)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_CV_TMPVAR(int inc ZEND_OPCODE_HANDLER_ARGS_DC)
 {
        USE_OPLINE
        zend_free_op free_op2;
@@ -39456,51 +38827,27 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
                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(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) {
 
-                       ZVAL_DEREF(zptr);
-                       SEPARATE_ZVAL_NOREF(zptr);
+                       if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) {
+                               if (inc) {
+                                       fast_long_increment_function(zptr);
+                               } else {
+                                       fast_long_decrement_function(zptr);
+                               }
+                       } else {
+                               ZVAL_DEREF(zptr);
+                               SEPARATE_ZVAL_NOREF(zptr);
 
-                       incdec_op(zptr);
+                               if (inc) {
+                                       increment_function(zptr);
+                               } else {
+                                       decrement_function(zptr);
+                               }
+                       }
                        if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                                ZVAL_COPY(EX_VAR(opline->result.var), zptr);
                        }
                } else {
-                       zval rv;
-
-                       if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
-                               zval *z, obj;
-
-                               ZVAL_OBJ(&obj, Z_OBJ_P(object));
-                               Z_ADDREF(obj);
-                               z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), &rv);
-                               if (UNEXPECTED(EG(exception))) {
-                                       OBJ_RELEASE(Z_OBJ(obj));
-                                       break;
-                               }
-
-                               if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
-                                       zval rv2;
-                                       zval *value = Z_OBJ_HT_P(z)->get(z, &rv2);
-
-                                       if (z == &rv) {
-                                               zval_ptr_dtor(&rv);
-                                       }
-                                       ZVAL_COPY_VALUE(z, value);
-                               }
-                               ZVAL_DEREF(z);
-                               SEPARATE_ZVAL_NOREF(z);
-                               incdec_op(z);
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_COPY(EX_VAR(opline->result.var), z);
-                               }
-                               Z_OBJ_HT(obj)->write_property(&obj, property, z, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL));
-                               OBJ_RELEASE(Z_OBJ(obj));
-                               zval_ptr_dtor(z);
-                       } else {
-                               zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
-                               if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
-                                       ZVAL_NULL(EX_VAR(opline->result.var));
-                               }
-                       }
+                       zend_pre_incdec_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL));
                }
        } while (0);
 
@@ -39512,15 +38859,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_OBJ_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
-       return zend_pre_incdec_property_helper_SPEC_CV_TMPVAR(increment_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC);
+       return zend_pre_incdec_property_helper_SPEC_CV_TMPVAR(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC);
 }
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_OBJ_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
-       return zend_pre_incdec_property_helper_SPEC_CV_TMPVAR(decrement_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC);
+       return zend_pre_incdec_property_helper_SPEC_CV_TMPVAR(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC);
 }
 
-static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_CV_TMPVAR(incdec_t incdec_op ZEND_OPCODE_HANDLER_ARGS_DC)
+static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_CV_TMPVAR(int inc ZEND_OPCODE_HANDLER_ARGS_DC)
 {
        USE_OPLINE
        zend_free_op free_op2;
@@ -39561,44 +38908,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
                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(Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) {
 
-                       ZVAL_DEREF(zptr);
-                       ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr);
-                       zval_opt_copy_ctor(zptr);
-                       incdec_op(zptr);
-               } else {
-                       if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) {
-                               zval rv, obj;
-                               zval *z;
-                               zval z_copy;
-
-                               ZVAL_OBJ(&obj, Z_OBJ_P(object));
-                               Z_ADDREF(obj);
-                               z = Z_OBJ_HT(obj)->read_property(&obj, property, BP_VAR_R, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), &rv);
-                               if (UNEXPECTED(EG(exception))) {
-                                       OBJ_RELEASE(Z_OBJ(obj));
-                                       break;
-                               }
-
-                               if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
-                                       zval rv2;
-                                       zval *value = Z_OBJ_HT_P(z)->get(z, &rv2);
-                                       if (z == &rv) {
-                                               zval_ptr_dtor(&rv);
-                                       }
-                                       ZVAL_COPY_VALUE(z, value);
+                       if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) {
+                               ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr);
+                               if (inc) {
+                                       fast_long_increment_function(zptr);
+                               } else {
+                                       fast_long_decrement_function(zptr);
                                }
-                               ZVAL_DUP(EX_VAR(opline->result.var), z);
-                               ZVAL_DUP(&z_copy, z);
-                               incdec_op(&z_copy);
-                               if (Z_REFCOUNTED_P(z)) Z_ADDREF_P(z);
-                               Z_OBJ_HT(obj)->write_property(&obj, property, &z_copy, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL));
-                               OBJ_RELEASE(Z_OBJ(obj));
-                               zval_ptr_dtor(&z_copy);
-                               zval_ptr_dtor(z);
                        } else {
-                               zend_error(E_WARNING, "Attempt to increment/decrement property of non-object");
-                               ZVAL_NULL(EX_VAR(opline->result.var));
+                               ZVAL_DEREF(zptr);
+                               ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr);
+                               zval_opt_copy_ctor(zptr);
+                               if (inc) {
+                                       increment_function(zptr);
+                               } else {
+                                       decrement_function(zptr);
+                               }
                        }
+               } else {
+                       zend_post_incdec_overloaded_property(object, property, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), inc, EX_VAR(opline->result.var));
                }
        } while (0);
 
@@ -39610,12 +38938,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_OBJ_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
-       return zend_post_incdec_property_helper_SPEC_CV_TMPVAR(increment_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC);
+       return zend_post_incdec_property_helper_SPEC_CV_TMPVAR(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC);
 }
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_OBJ_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
 {
-       return zend_post_incdec_property_helper_SPEC_CV_TMPVAR(decrement_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC);
+       return zend_post_incdec_property_helper_SPEC_CV_TMPVAR(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC);
 }
 
 static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
@@ -39784,7 +39112,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR_HAN
 
        offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
 
-       if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
+       if (IS_CV == IS_CONST ||
+           (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
                if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
                        container = Z_REFVAL_P(container);
                        if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
@@ -39922,7 +39251,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CV_TMPVAR_HA
 
        offset  = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
 
-       if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
+       if (IS_CV == IS_CONST ||
+           (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
                if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
                        container = Z_REFVAL_P(container);
                        if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
@@ -40855,7 +40185,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_CV
 
        offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
 
-       if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
+       if (IS_CV == IS_CONST ||
+           (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
                if ((IS_CV & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
                        container = Z_REFVAL_P(container);
                        if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
@@ -42320,7 +41651,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CONST
 
        offset  = EX_CONSTANT(opline->op2);
 
-       if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
+       if ((IS_TMP_VAR|IS_VAR) == IS_CONST ||
+           ((IS_TMP_VAR|IS_VAR) != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
                if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
                        container = Z_REFVAL_P(container);
                        if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
@@ -42989,7 +42321,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TM
 
        offset = EX_CONSTANT(opline->op2);
 
-       if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
+       if ((IS_TMP_VAR|IS_VAR) == IS_CONST ||
+           ((IS_TMP_VAR|IS_VAR) != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
                if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
                        container = Z_REFVAL_P(container);
                        if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
@@ -44498,7 +43831,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CV_HA
 
        offset  = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var);
 
-       if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
+       if ((IS_TMP_VAR|IS_VAR) == IS_CONST ||
+           ((IS_TMP_VAR|IS_VAR) != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
                if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
                        container = Z_REFVAL_P(container);
                        if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
@@ -44941,7 +44275,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TM
 
        offset = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var);
 
-       if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
+       if ((IS_TMP_VAR|IS_VAR) == IS_CONST ||
+           ((IS_TMP_VAR|IS_VAR) != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
                if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
                        container = Z_REFVAL_P(container);
                        if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
@@ -45622,7 +44957,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_TMPVA
 
        offset  = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
 
-       if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
+       if ((IS_TMP_VAR|IS_VAR) == IS_CONST ||
+           ((IS_TMP_VAR|IS_VAR) != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
                if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
                        container = Z_REFVAL_P(container);
                        if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
@@ -46067,7 +45403,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TM
 
        offset = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
 
-       if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {
+       if ((IS_TMP_VAR|IS_VAR) == IS_CONST ||
+           ((IS_TMP_VAR|IS_VAR) != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT))) {
                if (((IS_TMP_VAR|IS_VAR) & (IS_VAR|IS_CV)) && Z_ISREF_P(container)) {
                        container = Z_REFVAL_P(container);
                        if (UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) {