]> granicus.if.org Git - php/commitdiff
Moved proxy object support in ASSIGN_ADD (and family) from VM to slow paths of corres...
authorDmitry Stogov <dmitry@zend.com>
Mon, 20 Oct 2014 23:24:20 +0000 (03:24 +0400)
committerDmitry Stogov <dmitry@zend.com>
Mon, 20 Oct 2014 23:24:20 +0000 (03:24 +0400)
Zend/zend_operators.c
Zend/zend_operators.h
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

index b0a0e7519ed60b010948595d6ef86ebc95940cdf..7c208326372523d67aae08189be108964376ddec 100644 (file)
@@ -924,7 +924,7 @@ ZEND_API int add_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) /* {{{ *
                                } else if (Z_ISREF_P(op2)) {
                                        op2 = Z_REFVAL_P(op2);
                                } else if (!converted) {
-                                       ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_ADD);
+                                       ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_ADD, add_function);
 
                                        zendi_convert_scalar_to_number(op1, op1_copy, result);
                                        zendi_convert_scalar_to_number(op2, op2_copy, result);
@@ -977,7 +977,7 @@ ZEND_API int sub_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) /* {{{ *
                                } else if (Z_ISREF_P(op2)) {
                                        op2 = Z_REFVAL_P(op2);
                                } else if (!converted) {
-                                       ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_SUB);
+                                       ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_SUB, sub_function);
 
                                        zendi_convert_scalar_to_number(op1, op1_copy, result);
                                        zendi_convert_scalar_to_number(op2, op2_copy, result);
@@ -1024,7 +1024,7 @@ ZEND_API int mul_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) /* {{{ *
                                } else if (Z_ISREF_P(op2)) {
                                        op2 = Z_REFVAL_P(op2);
                                } else if (!converted) {
-                                       ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_MUL);
+                                       ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_MUL, mul_function);
 
                                        zendi_convert_scalar_to_number(op1, op1_copy, result);
                                        zendi_convert_scalar_to_number(op2, op2_copy, result);
@@ -1102,7 +1102,7 @@ ZEND_API int pow_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) /* {{{ *
                                } else if (Z_ISREF_P(op2)) {
                                        op2 = Z_REFVAL_P(op2);
                                } else if (!converted) {
-                                       ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_POW);
+                                       ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_POW, pow_function);
 
                                        if (Z_TYPE_P(op1) == IS_ARRAY) {
                                                ZVAL_LONG(result, 0);
@@ -1183,7 +1183,7 @@ ZEND_API int div_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) /* {{{ *
                                } else if (Z_ISREF_P(op2)) {
                                        op2 = Z_REFVAL_P(op2);
                                } else if (!converted) {
-                                       ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_DIV);
+                                       ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_DIV, div_function);
 
                                        zendi_convert_scalar_to_number(op1, op1_copy, result);
                                        zendi_convert_scalar_to_number(op2, op2_copy, result);
@@ -1202,14 +1202,14 @@ ZEND_API int mod_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) /* {{{ *
        zval op1_copy, op2_copy;
        zend_long op1_lval;
 
-       if (Z_TYPE_P(op1) != IS_LONG || Z_TYPE_P(op2) != IS_LONG) {
-               ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_MOD);
-
+       if (UNEXPECTED(Z_TYPE_P(op1) != IS_LONG)) {
+               ZEND_TRY_BINARY_OP1_OBJECT_OPERATION(ZEND_MOD, mod_function);
                zendi_convert_to_long(op1, op1_copy, result);
-               op1_lval = Z_LVAL_P(op1);
+       }
+       op1_lval = Z_LVAL_P(op1);
+       if (UNEXPECTED(Z_TYPE_P(op2) != IS_LONG)) {
+               ZEND_TRY_BINARY_OP2_OBJECT_OPERATION(ZEND_MOD);
                zendi_convert_to_long(op2, op2_copy, result);
-       } else {
-               op1_lval = Z_LVAL_P(op1);
        }
 
        if (Z_LVAL_P(op2) == 0) {
@@ -1234,15 +1234,14 @@ ZEND_API int boolean_xor_function(zval *result, zval *op1, zval *op2 TSRMLS_DC)
        zval op1_copy, op2_copy;
        zend_long op1_lval;
 
-       if ((Z_TYPE_P(op1) != IS_FALSE && Z_TYPE_P(op1) != IS_TRUE) ||
-           (Z_TYPE_P(op2) != IS_FALSE && Z_TYPE_P(op2) != IS_TRUE)) {
-               ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_BOOL_XOR);
-
+       if (UNEXPECTED(Z_TYPE_P(op1) != IS_FALSE && Z_TYPE_P(op1) != IS_TRUE)) {
+               ZEND_TRY_BINARY_OP1_OBJECT_OPERATION(ZEND_BOOL_XOR, boolean_xor_function);
                zendi_convert_to_boolean(op1, op1_copy, result);
-               op1_lval = Z_TYPE_P(op1) == IS_TRUE;
+       }
+       op1_lval = Z_TYPE_P(op1) == IS_TRUE;    
+       if (UNEXPECTED(Z_TYPE_P(op2) != IS_FALSE && Z_TYPE_P(op2) != IS_TRUE)) {
+               ZEND_TRY_BINARY_OP2_OBJECT_OPERATION(ZEND_BOOL_XOR);
                zendi_convert_to_boolean(op2, op2_copy, result);
-       } else {
-               op1_lval = Z_TYPE_P(op1) == IS_TRUE;
        }
 
        ZVAL_BOOL(result, op1_lval ^ (Z_TYPE_P(op2) == IS_TRUE));
@@ -1329,14 +1328,14 @@ ZEND_API int bitwise_or_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) /
                return SUCCESS;
        }
 
-       if (Z_TYPE_P(op1) != IS_LONG || Z_TYPE_P(op2) != IS_LONG) {
-               ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_BW_OR);
-
+       if (UNEXPECTED(Z_TYPE_P(op1) != IS_LONG)) {
+               ZEND_TRY_BINARY_OP1_OBJECT_OPERATION(ZEND_BW_OR, bitwise_or_function);
                zendi_convert_to_long(op1, op1_copy, result);
-               op1_lval = Z_LVAL_P(op1);
+       }
+       op1_lval = Z_LVAL_P(op1);
+       if (UNEXPECTED(Z_TYPE_P(op2) != IS_LONG)) {
+               ZEND_TRY_BINARY_OP2_OBJECT_OPERATION(ZEND_BW_OR);
                zendi_convert_to_long(op2, op2_copy, result);
-       } else {
-               op1_lval = Z_LVAL_P(op1);
        }
 
        ZVAL_LONG(result, op1_lval | Z_LVAL_P(op2));
@@ -1374,14 +1373,14 @@ ZEND_API int bitwise_and_function(zval *result, zval *op1, zval *op2 TSRMLS_DC)
                return SUCCESS;
        }
 
-       if (Z_TYPE_P(op1) != IS_LONG || Z_TYPE_P(op2) != IS_LONG) {
-               ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_BW_AND);
-
+       if (UNEXPECTED(Z_TYPE_P(op1) != IS_LONG)) {
+               ZEND_TRY_BINARY_OP1_OBJECT_OPERATION(ZEND_BW_AND, bitwise_and_function);
                zendi_convert_to_long(op1, op1_copy, result);
-               op1_lval = Z_LVAL_P(op1);
+       }
+       op1_lval = Z_LVAL_P(op1);
+       if (UNEXPECTED(Z_TYPE_P(op2) != IS_LONG)) {
+               ZEND_TRY_BINARY_OP2_OBJECT_OPERATION(ZEND_BW_AND);
                zendi_convert_to_long(op2, op2_copy, result);
-       } else {
-               op1_lval = Z_LVAL_P(op1);
        }
 
        ZVAL_LONG(result, op1_lval & Z_LVAL_P(op2));
@@ -1419,14 +1418,14 @@ ZEND_API int bitwise_xor_function(zval *result, zval *op1, zval *op2 TSRMLS_DC)
                return SUCCESS;
        }
 
-       if (Z_TYPE_P(op1) != IS_LONG || Z_TYPE_P(op2) != IS_LONG) {
-               ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_BW_XOR);
-
+       if (UNEXPECTED(Z_TYPE_P(op1) != IS_LONG)) {
+               ZEND_TRY_BINARY_OP1_OBJECT_OPERATION(ZEND_BW_XOR, bitwise_xor_function);
                zendi_convert_to_long(op1, op1_copy, result);
-               op1_lval = Z_LVAL_P(op1);
+       }
+       op1_lval = Z_LVAL_P(op1);
+       if (UNEXPECTED(Z_TYPE_P(op2) != IS_LONG)) {
+               ZEND_TRY_BINARY_OP2_OBJECT_OPERATION(ZEND_BW_XOR);
                zendi_convert_to_long(op2, op2_copy, result);
-       } else {
-               op1_lval = Z_LVAL_P(op1);
        }
 
        ZVAL_LONG(result, op1_lval ^ Z_LVAL_P(op2));
@@ -1439,14 +1438,14 @@ ZEND_API int shift_left_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) /
        zval op1_copy, op2_copy;
        zend_long op1_lval;
 
-       if (Z_TYPE_P(op1) != IS_LONG || Z_TYPE_P(op2) != IS_LONG) {
-               ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_SL);
-
+       if (UNEXPECTED(Z_TYPE_P(op1) != IS_LONG)) {
+               ZEND_TRY_BINARY_OP1_OBJECT_OPERATION(ZEND_SL, shift_left_function);
                zendi_convert_to_long(op1, op1_copy, result);
-               op1_lval = Z_LVAL_P(op1);
+       }
+       op1_lval = Z_LVAL_P(op1);
+       if (UNEXPECTED(Z_TYPE_P(op2) != IS_LONG)) {
+               ZEND_TRY_BINARY_OP2_OBJECT_OPERATION(ZEND_SL);
                zendi_convert_to_long(op2, op2_copy, result);
-       } else {
-               op1_lval = Z_LVAL_P(op1);
        }
 
        /* prevent wrapping quirkiness on some processors where << 64 + x == << x */
@@ -1471,14 +1470,14 @@ ZEND_API int shift_right_function(zval *result, zval *op1, zval *op2 TSRMLS_DC)
        zval op1_copy, op2_copy;
        zend_long op1_lval;
 
-       if (Z_TYPE_P(op1) != IS_LONG || Z_TYPE_P(op2) != IS_LONG) {
-               ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_SR);
-
+       if (UNEXPECTED(Z_TYPE_P(op1) != IS_LONG)) {
+               ZEND_TRY_BINARY_OP1_OBJECT_OPERATION(ZEND_SR, shift_right_function);
                zendi_convert_to_long(op1, op1_copy, result);
-               op1_lval = Z_LVAL_P(op1);
+       }
+       op1_lval = Z_LVAL_P(op1);
+       if (UNEXPECTED(Z_TYPE_P(op2) != IS_LONG)) {
+               ZEND_TRY_BINARY_OP2_OBJECT_OPERATION(ZEND_SR);
                zendi_convert_to_long(op2, op2_copy, result);
-       } else {
-               op1_lval = Z_LVAL_P(op1);
        }
 
        /* prevent wrapping quirkiness on some processors where >> 64 + x == >> x */
@@ -1530,29 +1529,28 @@ ZEND_API int concat_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) /* {{
        zval op1_copy, op2_copy;
        int use_copy1 = 0, use_copy2 = 0;
 
-       if (UNEXPECTED(Z_TYPE_P(op1) != IS_STRING) ||
-           UNEXPECTED(Z_TYPE_P(op2) != IS_STRING)) {
-               ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_CONCAT);
-
-               if (Z_TYPE_P(op1) != IS_STRING) {
-                       use_copy1 = zend_make_printable_zval(op1, &op1_copy TSRMLS_CC);
-               }
-               if (Z_TYPE_P(op2) != IS_STRING) {
-                       use_copy2 = zend_make_printable_zval(op2, &op2_copy TSRMLS_CC);
+       if (UNEXPECTED(Z_TYPE_P(op1) != IS_STRING)) {
+               ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_CONCAT, concat_function);
+               use_copy1 = zend_make_printable_zval(op1, &op1_copy TSRMLS_CC);
+               if (use_copy1) {
+                       /* We have created a converted copy of op1. Therefore, op1 won't become the result so
+                        * we have to free it.
+                        */
+                       if (result == op1) {
+                               zval_dtor(op1);
+                               if (UNEXPECTED(op1 == op2)) {
+                                       op2 = &op1_copy;
+                               }
+                       }
+                       op1 = &op1_copy;
                }
        }
-
-       if (use_copy1) {
-               /* We have created a converted copy of op1. Therefore, op1 won't become the result so
-                * we have to free it.
-                */
-               if (result == op1) {
-                       zval_dtor(op1);
+       if (UNEXPECTED(Z_TYPE_P(op2) != IS_STRING)) {
+               ZEND_TRY_BINARY_OP2_OBJECT_OPERATION(ZEND_CONCAT);
+               use_copy2 = zend_make_printable_zval(op2, &op2_copy TSRMLS_CC);
+               if (use_copy2) {
+                       op2 = &op2_copy;
                }
-               op1 = &op1_copy;
-       }
-       if (use_copy2) {
-               op2 = &op2_copy;
        }
 
        {
index 8075edf939d65d58e89c43c14b66857da0be49a9..f95e856e684d0827e3d48a0cdff93acc0239e4f8 100644 (file)
@@ -887,22 +887,43 @@ static zend_always_inline void fast_is_not_identical_function(zval *result, zval
        ZVAL_BOOL(result, Z_TYPE_P(result) != IS_TRUE);
 }
 
-#define ZEND_TRY_BINARY_OBJECT_OPERATION(opcode)                                                  \
-       if (Z_TYPE_P(op1) == IS_OBJECT && Z_OBJ_HANDLER_P(op1, do_operation)) {                       \
-               if (SUCCESS == Z_OBJ_HANDLER_P(op1, do_operation)(opcode, result, op1, op2 TSRMLS_CC)) {  \
-                       return SUCCESS;                                                                       \
-               }                                                                                         \
-       } else if (Z_TYPE_P(op2) == IS_OBJECT && Z_OBJ_HANDLER_P(op2, do_operation)) {                \
-               if (SUCCESS == Z_OBJ_HANDLER_P(op2, do_operation)(opcode, result, op1, op2 TSRMLS_CC)) {  \
-                       return SUCCESS;                                                                       \
-               }                                                                                         \
+#define ZEND_TRY_BINARY_OP1_OBJECT_OPERATION(opcode, binary_op)                                            \
+       if (UNEXPECTED(Z_TYPE_P(op1) == IS_OBJECT)                                                             \
+               && op1 == result                                                                                   \
+               && UNEXPECTED(Z_OBJ_HANDLER_P(op1, get))                                                           \
+               && EXPECTED(Z_OBJ_HANDLER_P(op1, set))) {                                                          \
+               int ret;                                                                                           \
+               zval rv;                                                                                           \
+               zval *objval = Z_OBJ_HANDLER_P(op1, get)(op1, &rv TSRMLS_CC);                                      \
+               Z_ADDREF_P(objval);                                                                                \
+               ret = binary_op(objval, objval, op2 TSRMLS_CC);                                                    \
+               Z_OBJ_HANDLER_P(op1, set)(op1, objval TSRMLS_CC);                                                  \
+               zval_ptr_dtor(objval);                                                                             \
+               return ret;                                                                                        \
+       } else if (UNEXPECTED(Z_TYPE_P(op1) == IS_OBJECT)                                                      \
+               && UNEXPECTED(Z_OBJ_HANDLER_P(op1, do_operation))) {                                               \
+               if (EXPECTED(SUCCESS == Z_OBJ_HANDLER_P(op1, do_operation)(opcode, result, op1, op2 TSRMLS_CC))) { \
+                       return SUCCESS;                                                                                \
+               }                                                                                                  \
        }
 
-#define ZEND_TRY_UNARY_OBJECT_OPERATION(opcode)                                                   \
-       if (Z_TYPE_P(op1) == IS_OBJECT && Z_OBJ_HANDLER_P(op1, do_operation)                          \
-        && SUCCESS == Z_OBJ_HANDLER_P(op1, do_operation)(opcode, result, op1, NULL TSRMLS_CC)        \
-       ) {                                                                                           \
-               return SUCCESS;                                                                           \
+#define ZEND_TRY_BINARY_OP2_OBJECT_OPERATION(opcode)                                                       \
+       if (UNEXPECTED(Z_TYPE_P(op2) == IS_OBJECT)                                                             \
+               && UNEXPECTED(Z_OBJ_HANDLER_P(op2, do_operation))                                                  \
+               && EXPECTED(SUCCESS == Z_OBJ_HANDLER_P(op2, do_operation)(opcode, result, op1, op2 TSRMLS_CC))) {  \
+               return SUCCESS;                                                                                    \
+       }
+
+#define ZEND_TRY_BINARY_OBJECT_OPERATION(opcode, binary_op)                                                \
+       ZEND_TRY_BINARY_OP1_OBJECT_OPERATION(opcode, binary_op)                                                \
+       else                                                                                                   \
+       ZEND_TRY_BINARY_OP2_OBJECT_OPERATION(opcode)
+
+#define ZEND_TRY_UNARY_OBJECT_OPERATION(opcode)                                                            \
+       if (UNEXPECTED(Z_TYPE_P(op1) == IS_OBJECT)                                                             \
+               && UNEXPECTED(Z_OBJ_HANDLER_P(op1, do_operation))                                                  \
+               && EXPECTED(SUCCESS == Z_OBJ_HANDLER_P(op1, do_operation)(opcode, result, op1, NULL TSRMLS_CC))) { \
+               return SUCCESS;                                                                                    \
        }
 
 /* buf points to the END of the buffer */
index db83594dfe9db8f6ad9746e3da2384742d68c32c..e362c4a701925f9be7f387a77c7dc66fb79c2649 100644 (file)
@@ -458,18 +458,7 @@ ZEND_VM_HELPER_EX(zend_binary_assign_op_dim_helper, VAR|UNUSED|CV, CONST|TMP|VAR
        ZVAL_DEREF(var_ptr);
        SEPARATE_ZVAL_NOREF(var_ptr);
 
-       if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) &&
-           UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) {
-               /* proxy object */
-               zval rv;
-               zval *objval = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr, &rv TSRMLS_CC);
-               Z_ADDREF_P(objval);
-               binary_op(objval, objval, value TSRMLS_CC);
-               Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC);
-               zval_ptr_dtor(objval);
-       } else {
-               binary_op(var_ptr, var_ptr, value TSRMLS_CC);
-       }
+       binary_op(var_ptr, var_ptr, value TSRMLS_CC);
 
        if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
@@ -510,18 +499,7 @@ ZEND_VM_HELPER_EX(zend_binary_assign_op_helper, VAR|UNUSED|CV, CONST|TMP|VAR|UNU
        ZVAL_DEREF(var_ptr);
        SEPARATE_ZVAL_NOREF(var_ptr);
 
-       if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) &&
-           UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) {
-               /* proxy object */
-               zval rv;
-               zval *objval = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr, &rv TSRMLS_CC);
-               Z_ADDREF_P(objval);
-               binary_op(objval, objval, value TSRMLS_CC);
-               Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC);
-               zval_ptr_dtor(objval);
-       } else {
-               binary_op(var_ptr, var_ptr, value TSRMLS_CC);
-       }
+       binary_op(var_ptr, var_ptr, value TSRMLS_CC);
 
        if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
index 860ad66fd012b4c6350f895ab8d9f9cb7f06f5b0..3150ae1e4e1b738c0ac641f7b2fccf653078a459 100644 (file)
@@ -17596,18 +17596,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_VAR_CONST(int (*b
        ZVAL_DEREF(var_ptr);
        SEPARATE_ZVAL_NOREF(var_ptr);
 
-       if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) &&
-           UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) {
-               /* proxy object */
-               zval rv;
-               zval *objval = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr, &rv TSRMLS_CC);
-               Z_ADDREF_P(objval);
-               binary_op(objval, objval, value TSRMLS_CC);
-               Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC);
-               zval_ptr_dtor(objval);
-       } else {
-               binary_op(var_ptr, var_ptr, value TSRMLS_CC);
-       }
+       binary_op(var_ptr, var_ptr, value TSRMLS_CC);
 
        if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
@@ -17648,18 +17637,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_VAR_CONST(int (*binar
        ZVAL_DEREF(var_ptr);
        SEPARATE_ZVAL_NOREF(var_ptr);
 
-       if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) &&
-           UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) {
-               /* proxy object */
-               zval rv;
-               zval *objval = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr, &rv TSRMLS_CC);
-               Z_ADDREF_P(objval);
-               binary_op(objval, objval, value TSRMLS_CC);
-               Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC);
-               zval_ptr_dtor(objval);
-       } else {
-               binary_op(var_ptr, var_ptr, value TSRMLS_CC);
-       }
+       binary_op(var_ptr, var_ptr, value TSRMLS_CC);
 
        if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
@@ -20014,18 +19992,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_VAR_TMP(int (*bin
        ZVAL_DEREF(var_ptr);
        SEPARATE_ZVAL_NOREF(var_ptr);
 
-       if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) &&
-           UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) {
-               /* proxy object */
-               zval rv;
-               zval *objval = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr, &rv TSRMLS_CC);
-               Z_ADDREF_P(objval);
-               binary_op(objval, objval, value TSRMLS_CC);
-               Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC);
-               zval_ptr_dtor(objval);
-       } else {
-               binary_op(var_ptr, var_ptr, value TSRMLS_CC);
-       }
+       binary_op(var_ptr, var_ptr, value TSRMLS_CC);
 
        if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
@@ -20066,18 +20033,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_VAR_TMP(int (*binary_
        ZVAL_DEREF(var_ptr);
        SEPARATE_ZVAL_NOREF(var_ptr);
 
-       if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) &&
-           UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) {
-               /* proxy object */
-               zval rv;
-               zval *objval = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr, &rv TSRMLS_CC);
-               Z_ADDREF_P(objval);
-               binary_op(objval, objval, value TSRMLS_CC);
-               Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC);
-               zval_ptr_dtor(objval);
-       } else {
-               binary_op(var_ptr, var_ptr, value TSRMLS_CC);
-       }
+       binary_op(var_ptr, var_ptr, value TSRMLS_CC);
 
        if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
@@ -22014,18 +21970,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_VAR_VAR(int (*bin
        ZVAL_DEREF(var_ptr);
        SEPARATE_ZVAL_NOREF(var_ptr);
 
-       if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) &&
-           UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) {
-               /* proxy object */
-               zval rv;
-               zval *objval = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr, &rv TSRMLS_CC);
-               Z_ADDREF_P(objval);
-               binary_op(objval, objval, value TSRMLS_CC);
-               Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC);
-               zval_ptr_dtor(objval);
-       } else {
-               binary_op(var_ptr, var_ptr, value TSRMLS_CC);
-       }
+       binary_op(var_ptr, var_ptr, value TSRMLS_CC);
 
        if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
@@ -22066,18 +22011,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_VAR_VAR(int (*binary_
        ZVAL_DEREF(var_ptr);
        SEPARATE_ZVAL_NOREF(var_ptr);
 
-       if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) &&
-           UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) {
-               /* proxy object */
-               zval rv;
-               zval *objval = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr, &rv TSRMLS_CC);
-               Z_ADDREF_P(objval);
-               binary_op(objval, objval, value TSRMLS_CC);
-               Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC);
-               zval_ptr_dtor(objval);
-       } else {
-               binary_op(var_ptr, var_ptr, value TSRMLS_CC);
-       }
+       binary_op(var_ptr, var_ptr, value TSRMLS_CC);
 
        if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
@@ -24099,18 +24033,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_VAR_UNUSED(int (*
        ZVAL_DEREF(var_ptr);
        SEPARATE_ZVAL_NOREF(var_ptr);
 
-       if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) &&
-           UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) {
-               /* proxy object */
-               zval rv;
-               zval *objval = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr, &rv TSRMLS_CC);
-               Z_ADDREF_P(objval);
-               binary_op(objval, objval, value TSRMLS_CC);
-               Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC);
-               zval_ptr_dtor(objval);
-       } else {
-               binary_op(var_ptr, var_ptr, value TSRMLS_CC);
-       }
+       binary_op(var_ptr, var_ptr, value TSRMLS_CC);
 
        if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
@@ -24151,18 +24074,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_VAR_UNUSED(int (*bina
        ZVAL_DEREF(var_ptr);
        SEPARATE_ZVAL_NOREF(var_ptr);
 
-       if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) &&
-           UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) {
-               /* proxy object */
-               zval rv;
-               zval *objval = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr, &rv TSRMLS_CC);
-               Z_ADDREF_P(objval);
-               binary_op(objval, objval, value TSRMLS_CC);
-               Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC);
-               zval_ptr_dtor(objval);
-       } else {
-               binary_op(var_ptr, var_ptr, value TSRMLS_CC);
-       }
+       binary_op(var_ptr, var_ptr, value TSRMLS_CC);
 
        if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
@@ -25560,18 +25472,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_VAR_CV(int (*bina
        ZVAL_DEREF(var_ptr);
        SEPARATE_ZVAL_NOREF(var_ptr);
 
-       if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) &&
-           UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) {
-               /* proxy object */
-               zval rv;
-               zval *objval = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr, &rv TSRMLS_CC);
-               Z_ADDREF_P(objval);
-               binary_op(objval, objval, value TSRMLS_CC);
-               Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC);
-               zval_ptr_dtor(objval);
-       } else {
-               binary_op(var_ptr, var_ptr, value TSRMLS_CC);
-       }
+       binary_op(var_ptr, var_ptr, value TSRMLS_CC);
 
        if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
@@ -25612,18 +25513,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_VAR_CV(int (*binary_o
        ZVAL_DEREF(var_ptr);
        SEPARATE_ZVAL_NOREF(var_ptr);
 
-       if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) &&
-           UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) {
-               /* proxy object */
-               zval rv;
-               zval *objval = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr, &rv TSRMLS_CC);
-               Z_ADDREF_P(objval);
-               binary_op(objval, objval, value TSRMLS_CC);
-               Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC);
-               zval_ptr_dtor(objval);
-       } else {
-               binary_op(var_ptr, var_ptr, value TSRMLS_CC);
-       }
+       binary_op(var_ptr, var_ptr, value TSRMLS_CC);
 
        if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
@@ -27417,18 +27307,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_UNUSED_CONST(int
        ZVAL_DEREF(var_ptr);
        SEPARATE_ZVAL_NOREF(var_ptr);
 
-       if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) &&
-           UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) {
-               /* proxy object */
-               zval rv;
-               zval *objval = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr, &rv TSRMLS_CC);
-               Z_ADDREF_P(objval);
-               binary_op(objval, objval, value TSRMLS_CC);
-               Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC);
-               zval_ptr_dtor(objval);
-       } else {
-               binary_op(var_ptr, var_ptr, value TSRMLS_CC);
-       }
+       binary_op(var_ptr, var_ptr, value TSRMLS_CC);
 
        if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
@@ -27469,18 +27348,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_UNUSED_CONST(int (*bi
        ZVAL_DEREF(var_ptr);
        SEPARATE_ZVAL_NOREF(var_ptr);
 
-       if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) &&
-           UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) {
-               /* proxy object */
-               zval rv;
-               zval *objval = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr, &rv TSRMLS_CC);
-               Z_ADDREF_P(objval);
-               binary_op(objval, objval, value TSRMLS_CC);
-               Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC);
-               zval_ptr_dtor(objval);
-       } else {
-               binary_op(var_ptr, var_ptr, value TSRMLS_CC);
-       }
+       binary_op(var_ptr, var_ptr, value TSRMLS_CC);
 
        if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
@@ -28796,18 +28664,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_UNUSED_TMP(int (*
        ZVAL_DEREF(var_ptr);
        SEPARATE_ZVAL_NOREF(var_ptr);
 
-       if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) &&
-           UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) {
-               /* proxy object */
-               zval rv;
-               zval *objval = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr, &rv TSRMLS_CC);
-               Z_ADDREF_P(objval);
-               binary_op(objval, objval, value TSRMLS_CC);
-               Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC);
-               zval_ptr_dtor(objval);
-       } else {
-               binary_op(var_ptr, var_ptr, value TSRMLS_CC);
-       }
+       binary_op(var_ptr, var_ptr, value TSRMLS_CC);
 
        if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
@@ -28848,18 +28705,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_UNUSED_TMP(int (*bina
        ZVAL_DEREF(var_ptr);
        SEPARATE_ZVAL_NOREF(var_ptr);
 
-       if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) &&
-           UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) {
-               /* proxy object */
-               zval rv;
-               zval *objval = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr, &rv TSRMLS_CC);
-               Z_ADDREF_P(objval);
-               binary_op(objval, objval, value TSRMLS_CC);
-               Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC);
-               zval_ptr_dtor(objval);
-       } else {
-               binary_op(var_ptr, var_ptr, value TSRMLS_CC);
-       }
+       binary_op(var_ptr, var_ptr, value TSRMLS_CC);
 
        if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
@@ -30092,18 +29938,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_UNUSED_VAR(int (*
        ZVAL_DEREF(var_ptr);
        SEPARATE_ZVAL_NOREF(var_ptr);
 
-       if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) &&
-           UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) {
-               /* proxy object */
-               zval rv;
-               zval *objval = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr, &rv TSRMLS_CC);
-               Z_ADDREF_P(objval);
-               binary_op(objval, objval, value TSRMLS_CC);
-               Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC);
-               zval_ptr_dtor(objval);
-       } else {
-               binary_op(var_ptr, var_ptr, value TSRMLS_CC);
-       }
+       binary_op(var_ptr, var_ptr, value TSRMLS_CC);
 
        if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
@@ -30144,18 +29979,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_UNUSED_VAR(int (*bina
        ZVAL_DEREF(var_ptr);
        SEPARATE_ZVAL_NOREF(var_ptr);
 
-       if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) &&
-           UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) {
-               /* proxy object */
-               zval rv;
-               zval *objval = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr, &rv TSRMLS_CC);
-               Z_ADDREF_P(objval);
-               binary_op(objval, objval, value TSRMLS_CC);
-               Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC);
-               zval_ptr_dtor(objval);
-       } else {
-               binary_op(var_ptr, var_ptr, value TSRMLS_CC);
-       }
+       binary_op(var_ptr, var_ptr, value TSRMLS_CC);
 
        if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
@@ -31387,18 +31211,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_UNUSED_UNUSED(int
        ZVAL_DEREF(var_ptr);
        SEPARATE_ZVAL_NOREF(var_ptr);
 
-       if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) &&
-           UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) {
-               /* proxy object */
-               zval rv;
-               zval *objval = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr, &rv TSRMLS_CC);
-               Z_ADDREF_P(objval);
-               binary_op(objval, objval, value TSRMLS_CC);
-               Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC);
-               zval_ptr_dtor(objval);
-       } else {
-               binary_op(var_ptr, var_ptr, value TSRMLS_CC);
-       }
+       binary_op(var_ptr, var_ptr, value TSRMLS_CC);
 
        if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
@@ -31439,18 +31252,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_UNUSED_UNUSED(int (*b
        ZVAL_DEREF(var_ptr);
        SEPARATE_ZVAL_NOREF(var_ptr);
 
-       if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) &&
-           UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) {
-               /* proxy object */
-               zval rv;
-               zval *objval = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr, &rv TSRMLS_CC);
-               Z_ADDREF_P(objval);
-               binary_op(objval, objval, value TSRMLS_CC);
-               Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC);
-               zval_ptr_dtor(objval);
-       } else {
-               binary_op(var_ptr, var_ptr, value TSRMLS_CC);
-       }
+       binary_op(var_ptr, var_ptr, value TSRMLS_CC);
 
        if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
@@ -31902,18 +31704,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_UNUSED_CV(int (*b
        ZVAL_DEREF(var_ptr);
        SEPARATE_ZVAL_NOREF(var_ptr);
 
-       if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) &&
-           UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) {
-               /* proxy object */
-               zval rv;
-               zval *objval = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr, &rv TSRMLS_CC);
-               Z_ADDREF_P(objval);
-               binary_op(objval, objval, value TSRMLS_CC);
-               Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC);
-               zval_ptr_dtor(objval);
-       } else {
-               binary_op(var_ptr, var_ptr, value TSRMLS_CC);
-       }
+       binary_op(var_ptr, var_ptr, value TSRMLS_CC);
 
        if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
@@ -31954,18 +31745,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_UNUSED_CV(int (*binar
        ZVAL_DEREF(var_ptr);
        SEPARATE_ZVAL_NOREF(var_ptr);
 
-       if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) &&
-           UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) {
-               /* proxy object */
-               zval rv;
-               zval *objval = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr, &rv TSRMLS_CC);
-               Z_ADDREF_P(objval);
-               binary_op(objval, objval, value TSRMLS_CC);
-               Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC);
-               zval_ptr_dtor(objval);
-       } else {
-               binary_op(var_ptr, var_ptr, value TSRMLS_CC);
-       }
+       binary_op(var_ptr, var_ptr, value TSRMLS_CC);
 
        if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
@@ -34865,18 +34645,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_CV_CONST(int (*bi
        ZVAL_DEREF(var_ptr);
        SEPARATE_ZVAL_NOREF(var_ptr);
 
-       if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) &&
-           UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) {
-               /* proxy object */
-               zval rv;
-               zval *objval = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr, &rv TSRMLS_CC);
-               Z_ADDREF_P(objval);
-               binary_op(objval, objval, value TSRMLS_CC);
-               Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC);
-               zval_ptr_dtor(objval);
-       } else {
-               binary_op(var_ptr, var_ptr, value TSRMLS_CC);
-       }
+       binary_op(var_ptr, var_ptr, value TSRMLS_CC);
 
        if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
@@ -34917,18 +34686,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_CV_CONST(int (*binary
        ZVAL_DEREF(var_ptr);
        SEPARATE_ZVAL_NOREF(var_ptr);
 
-       if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) &&
-           UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) {
-               /* proxy object */
-               zval rv;
-               zval *objval = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr, &rv TSRMLS_CC);
-               Z_ADDREF_P(objval);
-               binary_op(objval, objval, value TSRMLS_CC);
-               Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC);
-               zval_ptr_dtor(objval);
-       } else {
-               binary_op(var_ptr, var_ptr, value TSRMLS_CC);
-       }
+       binary_op(var_ptr, var_ptr, value TSRMLS_CC);
 
        if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
@@ -37115,18 +36873,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_CV_TMP(int (*bina
        ZVAL_DEREF(var_ptr);
        SEPARATE_ZVAL_NOREF(var_ptr);
 
-       if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) &&
-           UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) {
-               /* proxy object */
-               zval rv;
-               zval *objval = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr, &rv TSRMLS_CC);
-               Z_ADDREF_P(objval);
-               binary_op(objval, objval, value TSRMLS_CC);
-               Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC);
-               zval_ptr_dtor(objval);
-       } else {
-               binary_op(var_ptr, var_ptr, value TSRMLS_CC);
-       }
+       binary_op(var_ptr, var_ptr, value TSRMLS_CC);
 
        if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
@@ -37167,18 +36914,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_CV_TMP(int (*binary_o
        ZVAL_DEREF(var_ptr);
        SEPARATE_ZVAL_NOREF(var_ptr);
 
-       if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) &&
-           UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) {
-               /* proxy object */
-               zval rv;
-               zval *objval = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr, &rv TSRMLS_CC);
-               Z_ADDREF_P(objval);
-               binary_op(objval, objval, value TSRMLS_CC);
-               Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC);
-               zval_ptr_dtor(objval);
-       } else {
-               binary_op(var_ptr, var_ptr, value TSRMLS_CC);
-       }
+       binary_op(var_ptr, var_ptr, value TSRMLS_CC);
 
        if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
@@ -38987,18 +38723,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_CV_VAR(int (*bina
        ZVAL_DEREF(var_ptr);
        SEPARATE_ZVAL_NOREF(var_ptr);
 
-       if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) &&
-           UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) {
-               /* proxy object */
-               zval rv;
-               zval *objval = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr, &rv TSRMLS_CC);
-               Z_ADDREF_P(objval);
-               binary_op(objval, objval, value TSRMLS_CC);
-               Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC);
-               zval_ptr_dtor(objval);
-       } else {
-               binary_op(var_ptr, var_ptr, value TSRMLS_CC);
-       }
+       binary_op(var_ptr, var_ptr, value TSRMLS_CC);
 
        if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
@@ -39039,18 +38764,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_CV_VAR(int (*binary_o
        ZVAL_DEREF(var_ptr);
        SEPARATE_ZVAL_NOREF(var_ptr);
 
-       if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) &&
-           UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) {
-               /* proxy object */
-               zval rv;
-               zval *objval = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr, &rv TSRMLS_CC);
-               Z_ADDREF_P(objval);
-               binary_op(objval, objval, value TSRMLS_CC);
-               Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC);
-               zval_ptr_dtor(objval);
-       } else {
-               binary_op(var_ptr, var_ptr, value TSRMLS_CC);
-       }
+       binary_op(var_ptr, var_ptr, value TSRMLS_CC);
 
        if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
@@ -40942,18 +40656,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_CV_UNUSED(int (*b
        ZVAL_DEREF(var_ptr);
        SEPARATE_ZVAL_NOREF(var_ptr);
 
-       if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) &&
-           UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) {
-               /* proxy object */
-               zval rv;
-               zval *objval = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr, &rv TSRMLS_CC);
-               Z_ADDREF_P(objval);
-               binary_op(objval, objval, value TSRMLS_CC);
-               Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC);
-               zval_ptr_dtor(objval);
-       } else {
-               binary_op(var_ptr, var_ptr, value TSRMLS_CC);
-       }
+       binary_op(var_ptr, var_ptr, value TSRMLS_CC);
 
        if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
@@ -40994,18 +40697,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_CV_UNUSED(int (*binar
        ZVAL_DEREF(var_ptr);
        SEPARATE_ZVAL_NOREF(var_ptr);
 
-       if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) &&
-           UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) {
-               /* proxy object */
-               zval rv;
-               zval *objval = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr, &rv TSRMLS_CC);
-               Z_ADDREF_P(objval);
-               binary_op(objval, objval, value TSRMLS_CC);
-               Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC);
-               zval_ptr_dtor(objval);
-       } else {
-               binary_op(var_ptr, var_ptr, value TSRMLS_CC);
-       }
+       binary_op(var_ptr, var_ptr, value TSRMLS_CC);
 
        if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
@@ -42258,18 +41950,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_CV_CV(int (*binar
        ZVAL_DEREF(var_ptr);
        SEPARATE_ZVAL_NOREF(var_ptr);
 
-       if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) &&
-           UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) {
-               /* proxy object */
-               zval rv;
-               zval *objval = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr, &rv TSRMLS_CC);
-               Z_ADDREF_P(objval);
-               binary_op(objval, objval, value TSRMLS_CC);
-               Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC);
-               zval_ptr_dtor(objval);
-       } else {
-               binary_op(var_ptr, var_ptr, value TSRMLS_CC);
-       }
+       binary_op(var_ptr, var_ptr, value TSRMLS_CC);
 
        if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
@@ -42310,18 +41991,7 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_CV_CV(int (*binary_op
        ZVAL_DEREF(var_ptr);
        SEPARATE_ZVAL_NOREF(var_ptr);
 
-       if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_OBJECT) &&
-           UNEXPECTED(Z_OBJ_HANDLER_P(var_ptr, get) && Z_OBJ_HANDLER_P(var_ptr, set))) {
-               /* proxy object */
-               zval rv;
-               zval *objval = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr, &rv TSRMLS_CC);
-               Z_ADDREF_P(objval);
-               binary_op(objval, objval, value TSRMLS_CC);
-               Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC);
-               zval_ptr_dtor(objval);
-       } else {
-               binary_op(var_ptr, var_ptr, value TSRMLS_CC);
-       }
+       binary_op(var_ptr, var_ptr, value TSRMLS_CC);
 
        if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
                ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);