]> granicus.if.org Git - php/commitdiff
Fixed zend_object_get_t in simpleXML
authorXinchen Hui <laruence@gmail.com>
Tue, 15 Apr 2014 03:05:03 +0000 (11:05 +0800)
committerXinchen Hui <laruence@gmail.com>
Tue, 15 Apr 2014 03:05:03 +0000 (11:05 +0800)
Zend/zend.c
Zend/zend_API.c
Zend/zend_builtin_functions.c
Zend/zend_execute.h
Zend/zend_object_handlers.h
Zend/zend_operators.c
Zend/zend_vm_def.h
Zend/zend_vm_execute.h
ext/simplexml/simplexml.c

index b2cc16a5b7719ebe729125823a366ceab017d1fa..b7946ca61e6d92e1fd5e10635934c24a9bd98668 100644 (file)
@@ -280,7 +280,8 @@ again:
                                        zval_ptr_dtor(&val);
                                }
                                if (!Z_OBJ_HANDLER_P(expr, cast_object) && Z_OBJ_HANDLER_P(expr, get)) {
-                                       zval *z = Z_OBJ_HANDLER_P(expr, get)(expr TSRMLS_CC);
+                                       zval rv;
+                                       zval *z = Z_OBJ_HANDLER_P(expr, get)(expr, &rv TSRMLS_CC);
 
                                        Z_ADDREF_P(z);
                                        if (Z_TYPE_P(z) != IS_OBJECT) {
index 1ce9f11b1174bac07e46875c7d71bbe92bafa693..a748ec38d476bc03521eec3aa00d042300b1e702 100644 (file)
@@ -281,7 +281,8 @@ static int parse_arg_object_to_string(zval *arg, char **p, int *pl, int type TSR
        }
        if (!Z_OBJ_HANDLER_P(arg, cast_object) && Z_OBJ_HANDLER_P(arg, get)) {
                int use_copy;
-               zval *z = Z_OBJ_HANDLER_P(arg, get)(arg TSRMLS_CC);
+               zval rv;
+               zval *z = Z_OBJ_HANDLER_P(arg, get)(arg, &rv TSRMLS_CC);
                Z_ADDREF_P(z);
                if(Z_TYPE_P(z) != IS_OBJECT) {
                        zval_dtor(arg);
@@ -321,7 +322,8 @@ static int parse_arg_object_to_str(zval *arg, zend_string **str, int type TSRMLS
        }
        if (!Z_OBJ_HANDLER_P(arg, cast_object) && Z_OBJ_HANDLER_P(arg, get)) {
                int use_copy;
-               zval *z = Z_OBJ_HANDLER_P(arg, get)(arg TSRMLS_CC);
+               zval rv;
+               zval *z = Z_OBJ_HANDLER_P(arg, get)(arg, &rv TSRMLS_CC);
                Z_ADDREF_P(z);
                if(Z_TYPE_P(z) != IS_OBJECT) {
                        zval_dtor(arg);
index 0cafa71f97193f0189e5e349a89a940a2ae036e5..f440f1d48f4acd7e26a1e09f951553c9dea41521 100644 (file)
@@ -696,7 +696,8 @@ repeat:
                case IS_OBJECT:
                        if (Z_TYPE(val_free) == IS_UNDEF) {
                                if (Z_OBJ_HT_P(val)->get) {
-                                       val = Z_OBJ_HT_P(val)->get(val TSRMLS_CC);
+                                       zval rv;
+                                       val = Z_OBJ_HT_P(val)->get(val, &rv TSRMLS_CC);
                                        ZVAL_COPY_VALUE(&val_free, val);
                                        goto repeat;
                                } else if (Z_OBJ_HT_P(val)->cast_object) {
index 832a96a9c965b9f1bc6a1b1a1c56eacde7b3aa4c..35ab8eb5726cebf9deff3a9950ec69fd39db0a8d 100644 (file)
@@ -136,8 +136,9 @@ again:
                                                break;
                                        }
                                } else if (Z_OBJ_HT_P(op)->get) {
-                                       zval *tmp = Z_OBJ_HT_P(op)->get(op TSRMLS_CC);
-                                       if(Z_TYPE_P(tmp) != IS_OBJECT) {
+                                       zval rv;
+                                       zval *tmp = Z_OBJ_HT_P(op)->get(op, &rv TSRMLS_CC);
+                                       if (Z_TYPE_P(tmp) != IS_OBJECT) {
                                                /* for safety - avoid loop */
                                                convert_to_boolean(tmp);
                                                result = Z_LVAL_P(tmp);
index 249effa10ebb0a890fe55e6bb172c77e521ae8a1..48e2e49cd84403f4f5ff20b9ea429a274af27b97 100644 (file)
@@ -59,7 +59,7 @@ typedef void (*zend_object_set_t)(zval *object, zval *value TSRMLS_DC);
 /* Used to get object value. Can be used when converting object value to
  * one of the basic types and when using scalar ops (like ++, +=) on the object
  */
-typedef zval* (*zend_object_get_t)(zval *object TSRMLS_DC);
+typedef zval* (*zend_object_get_t)(zval *object, zval *rv TSRMLS_DC);
 
 /* Used to check if a property of the object exists */
 /* param has_set_exists:
index f6c2a9161f4ebca0aaa61f637ca122a9777ab5e9..db6502ce668278b03eb5eecfea471b7e5729f3c0 100644 (file)
@@ -361,7 +361,8 @@ try_again:
                }                                                                                                                                                                       \
        } else {                                                                                                                                                                \
                if (Z_OBJ_HT_P(op)->get) {                                                                                                                      \
-                       zval *newop = Z_OBJ_HT_P(op)->get(op TSRMLS_CC);                                                                \
+                       zval rv;                                                                                                                                                \
+                       zval *newop = Z_OBJ_HT_P(op)->get(op, &rv TSRMLS_CC);                                                   \
                        if (Z_TYPE_P(newop) != IS_OBJECT) {                                                                                             \
                                /* for safety - avoid loop */                                                                                           \
                                zval_dtor(op);                                                                                                                          \
@@ -1628,7 +1629,8 @@ ZEND_API int compare_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) /* {
                                }
                                if (Z_TYPE_P(op1) == IS_OBJECT) {
                                        if (Z_OBJ_HT_P(op1)->get) {
-                                               op_free = Z_OBJ_HT_P(op1)->get(op1 TSRMLS_CC);
+                                               zval rv;
+                                               op_free = Z_OBJ_HT_P(op1)->get(op1, &rv TSRMLS_CC);
                                                ret = compare_function(result, op_free, op2 TSRMLS_CC);
                                                zend_free_obj_get_result(op_free TSRMLS_CC);
                                                return ret;
@@ -1646,7 +1648,8 @@ ZEND_API int compare_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) /* {
                                }
                                if (Z_TYPE_P(op2) == IS_OBJECT) {
                                        if (Z_OBJ_HT_P(op2)->get) {
-                                               op_free = Z_OBJ_HT_P(op2)->get(op2 TSRMLS_CC);
+                                               zval rv;
+                                               op_free = Z_OBJ_HT_P(op2)->get(op2, &rv TSRMLS_CC);
                                                ret = compare_function(result, op1, op_free TSRMLS_CC);
                                                zend_free_obj_get_result(op_free TSRMLS_CC);
                                                return ret;
index 410e24c22f4f2634d258afc66cb012008fbab679..e2beea63986f2554de914203cace26181152e56d 100644 (file)
@@ -388,12 +388,13 @@ ZEND_VM_HELPER_EX(zend_binary_assign_op_obj_helper, VAR|UNUSED|CV, CONST|TMP|VAR
                        }
                        if (z) {
                                if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
-                                       zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
+                                       zval rv;
+                                       zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                        if (Z_REFCOUNT_P(z) == 0) {
                                                zval_dtor(z);
                                        }
-                                       z = value;
+                                       ZVAL_COPY_VALUE(z, value);
                                }
 //???                          if (Z_REFCOUNTED_P(z)) Z_ADDREF_P(z);
                                SEPARATE_ZVAL_IF_NOT_REF(z);
@@ -471,7 +472,8 @@ ZEND_VM_HELPER_EX(zend_binary_assign_op_dim_helper, VAR|UNUSED|CV, CONST|TMP|VAR
        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 *objval = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr TSRMLS_CC);
+               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);
@@ -523,7 +525,8 @@ ZEND_VM_HELPER_EX(zend_binary_assign_op_helper, VAR|UNUSED|CV, CONST|TMP|VAR|UNU
        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 *objval = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr TSRMLS_CC);
+               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);
@@ -744,12 +747,13 @@ ZEND_VM_HELPER_EX(zend_pre_incdec_property_helper, VAR|UNUSED|CV, CONST|TMP|VAR|
                        zval *z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, ((OP2_TYPE == IS_CONST) ? opline->op2.literal : NULL), &rv TSRMLS_CC);
 
                        if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
-                               zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
+                               zval rv;
+                               zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                if (Z_REFCOUNT_P(z) == 0) {
                                        zval_dtor(z);
                                }
-                               z = value;
+                               ZVAL_COPY_VALUE(z, value);
                        }
                        if (Z_REFCOUNTED_P(z)) Z_ADDREF_P(z);
                        SEPARATE_ZVAL_IF_NOT_REF(z);
@@ -841,12 +845,13 @@ ZEND_VM_HELPER_EX(zend_post_incdec_property_helper, VAR|UNUSED|CV, CONST|TMP|VAR
                        zval z_copy;
 
                        if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
-                               zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
+                               zval rv;
+                               zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                if (Z_REFCOUNT_P(z) == 0) {
                                        zval_dtor(z);
                                }
-                               z = value;
+                               ZVAL_COPY_VALUE(z, value);
                        }
                        ZVAL_DUP(retval, z);
                        ZVAL_DUP(&z_copy, z);
@@ -912,7 +917,8 @@ ZEND_VM_HANDLER(34, ZEND_PRE_INC, VAR|CV, ANY)
           && Z_OBJ_HANDLER_P(var_ptr, get)
           && Z_OBJ_HANDLER_P(var_ptr, set)) {
                /* proxy object */
-               zval *val = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr TSRMLS_CC);
+               zval rv;
+               zval *val = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr, &rv TSRMLS_CC);
                Z_ADDREF_P(val);
                fast_increment_function(val);
                Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, val TSRMLS_CC);
@@ -961,7 +967,8 @@ ZEND_VM_HANDLER(35, ZEND_PRE_DEC, VAR|CV, ANY)
           && Z_OBJ_HANDLER_P(var_ptr, get)
           && Z_OBJ_HANDLER_P(var_ptr, set)) {
                /* proxy object */
-               zval *val = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr TSRMLS_CC);
+               zval rv;
+               zval *val = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr, &rv TSRMLS_CC);
                Z_ADDREF_P(val);
                fast_decrement_function(val);
                Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, val TSRMLS_CC);
@@ -1012,7 +1019,8 @@ ZEND_VM_HANDLER(36, ZEND_POST_INC, VAR|CV, ANY)
           && Z_OBJ_HANDLER_P(var_ptr, get)
           && Z_OBJ_HANDLER_P(var_ptr, set)) {
                /* proxy object */
-               zval *val = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr TSRMLS_CC);
+               zval rv;
+               zval *val = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr, &rv TSRMLS_CC);
                Z_ADDREF_P(val);
                fast_increment_function(val);
                Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, val TSRMLS_CC);
@@ -1059,7 +1067,8 @@ ZEND_VM_HANDLER(37, ZEND_POST_DEC, VAR|CV, ANY)
           && Z_OBJ_HANDLER_P(var_ptr, get)
           && Z_OBJ_HANDLER_P(var_ptr, set)) {
                /* proxy object */
-               zval *val = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr TSRMLS_CC);
+               zval rv;
+               zval *val = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr, &rv TSRMLS_CC);
                Z_ADDREF_P(val);
                fast_decrement_function(val);
                Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, val TSRMLS_CC);
index c84671c685a22c6032311e65c1a6ed74c6b57864..e29af4389558b0d279bd42d8e9d87855cb79777b 100644 (file)
@@ -12080,7 +12080,8 @@ static int ZEND_FASTCALL  ZEND_PRE_INC_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS
           && Z_OBJ_HANDLER_P(var_ptr, get)
           && Z_OBJ_HANDLER_P(var_ptr, set)) {
                /* proxy object */
-               zval *val = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr TSRMLS_CC);
+               zval rv;
+               zval *val = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr, &rv TSRMLS_CC);
                Z_ADDREF_P(val);
                fast_increment_function(val);
                Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, val TSRMLS_CC);
@@ -12129,7 +12130,8 @@ static int ZEND_FASTCALL  ZEND_PRE_DEC_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS
           && Z_OBJ_HANDLER_P(var_ptr, get)
           && Z_OBJ_HANDLER_P(var_ptr, set)) {
                /* proxy object */
-               zval *val = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr TSRMLS_CC);
+               zval rv;
+               zval *val = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr, &rv TSRMLS_CC);
                Z_ADDREF_P(val);
                fast_decrement_function(val);
                Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, val TSRMLS_CC);
@@ -12180,7 +12182,8 @@ static int ZEND_FASTCALL  ZEND_POST_INC_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
           && Z_OBJ_HANDLER_P(var_ptr, get)
           && Z_OBJ_HANDLER_P(var_ptr, set)) {
                /* proxy object */
-               zval *val = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr TSRMLS_CC);
+               zval rv;
+               zval *val = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr, &rv TSRMLS_CC);
                Z_ADDREF_P(val);
                fast_increment_function(val);
                Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, val TSRMLS_CC);
@@ -12227,7 +12230,8 @@ static int ZEND_FASTCALL  ZEND_POST_DEC_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
           && Z_OBJ_HANDLER_P(var_ptr, get)
           && Z_OBJ_HANDLER_P(var_ptr, set)) {
                /* proxy object */
-               zval *val = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr TSRMLS_CC);
+               zval rv;
+               zval *val = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr, &rv TSRMLS_CC);
                Z_ADDREF_P(val);
                fast_decrement_function(val);
                Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, val TSRMLS_CC);
@@ -13760,12 +13764,13 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_VAR_CONST(int (*b
                        }
                        if (z) {
                                if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
-                                       zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
+                                       zval rv;
+                                       zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                        if (Z_REFCOUNT_P(z) == 0) {
                                                zval_dtor(z);
                                        }
-                                       z = value;
+                                       ZVAL_COPY_VALUE(z, value);
                                }
 //???                          if (Z_REFCOUNTED_P(z)) Z_ADDREF_P(z);
                                SEPARATE_ZVAL_IF_NOT_REF(z);
@@ -13843,7 +13848,8 @@ static int ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_VAR_CONST(int (*b
        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 *objval = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr TSRMLS_CC);
+               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);
@@ -13895,7 +13901,8 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_VAR_CONST(int (*binar
        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 *objval = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr TSRMLS_CC);
+               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);
@@ -14116,12 +14123,13 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_VAR_CONST(incdec_t
                        zval *z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL), &rv TSRMLS_CC);
 
                        if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
-                               zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
+                               zval rv;
+                               zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                if (Z_REFCOUNT_P(z) == 0) {
                                        zval_dtor(z);
                                }
-                               z = value;
+                               ZVAL_COPY_VALUE(z, value);
                        }
                        if (Z_REFCOUNTED_P(z)) Z_ADDREF_P(z);
                        SEPARATE_ZVAL_IF_NOT_REF(z);
@@ -14213,12 +14221,13 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_VAR_CONST(incdec_
                        zval z_copy;
 
                        if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
-                               zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
+                               zval rv;
+                               zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                if (Z_REFCOUNT_P(z) == 0) {
                                        zval_dtor(z);
                                }
-                               z = value;
+                               ZVAL_COPY_VALUE(z, value);
                        }
                        ZVAL_DUP(retval, z);
                        ZVAL_DUP(&z_copy, z);
@@ -16184,12 +16193,13 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_VAR_TMP(int (*bin
                        }
                        if (z) {
                                if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
-                                       zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
+                                       zval rv;
+                                       zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                        if (Z_REFCOUNT_P(z) == 0) {
                                                zval_dtor(z);
                                        }
-                                       z = value;
+                                       ZVAL_COPY_VALUE(z, value);
                                }
 //???                          if (Z_REFCOUNTED_P(z)) Z_ADDREF_P(z);
                                SEPARATE_ZVAL_IF_NOT_REF(z);
@@ -16267,7 +16277,8 @@ static int ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_VAR_TMP(int (*bin
        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 *objval = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr TSRMLS_CC);
+               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);
@@ -16319,7 +16330,8 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_VAR_TMP(int (*binary_
        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 *objval = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr TSRMLS_CC);
+               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);
@@ -16540,12 +16552,13 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_VAR_TMP(incdec_t i
                        zval *z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL), &rv TSRMLS_CC);
 
                        if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
-                               zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
+                               zval rv;
+                               zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                if (Z_REFCOUNT_P(z) == 0) {
                                        zval_dtor(z);
                                }
-                               z = value;
+                               ZVAL_COPY_VALUE(z, value);
                        }
                        if (Z_REFCOUNTED_P(z)) Z_ADDREF_P(z);
                        SEPARATE_ZVAL_IF_NOT_REF(z);
@@ -16637,12 +16650,13 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_VAR_TMP(incdec_t
                        zval z_copy;
 
                        if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
-                               zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
+                               zval rv;
+                               zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                if (Z_REFCOUNT_P(z) == 0) {
                                        zval_dtor(z);
                                }
-                               z = value;
+                               ZVAL_COPY_VALUE(z, value);
                        }
                        ZVAL_DUP(retval, z);
                        ZVAL_DUP(&z_copy, z);
@@ -18217,12 +18231,13 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_VAR_VAR(int (*bin
                        }
                        if (z) {
                                if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
-                                       zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
+                                       zval rv;
+                                       zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                        if (Z_REFCOUNT_P(z) == 0) {
                                                zval_dtor(z);
                                        }
-                                       z = value;
+                                       ZVAL_COPY_VALUE(z, value);
                                }
 //???                          if (Z_REFCOUNTED_P(z)) Z_ADDREF_P(z);
                                SEPARATE_ZVAL_IF_NOT_REF(z);
@@ -18300,7 +18315,8 @@ static int ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_VAR_VAR(int (*bin
        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 *objval = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr TSRMLS_CC);
+               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);
@@ -18352,7 +18368,8 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_VAR_VAR(int (*binary_
        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 *objval = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr TSRMLS_CC);
+               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);
@@ -18573,12 +18590,13 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_VAR_VAR(incdec_t i
                        zval *z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL), &rv TSRMLS_CC);
 
                        if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
-                               zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
+                               zval rv;
+                               zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                if (Z_REFCOUNT_P(z) == 0) {
                                        zval_dtor(z);
                                }
-                               z = value;
+                               ZVAL_COPY_VALUE(z, value);
                        }
                        if (Z_REFCOUNTED_P(z)) Z_ADDREF_P(z);
                        SEPARATE_ZVAL_IF_NOT_REF(z);
@@ -18670,12 +18688,13 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_VAR_VAR(incdec_t
                        zval z_copy;
 
                        if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
-                               zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
+                               zval rv;
+                               zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                if (Z_REFCOUNT_P(z) == 0) {
                                        zval_dtor(z);
                                }
-                               z = value;
+                               ZVAL_COPY_VALUE(z, value);
                        }
                        ZVAL_DUP(retval, z);
                        ZVAL_DUP(&z_copy, z);
@@ -20337,12 +20356,13 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_VAR_UNUSED(int (*
                        }
                        if (z) {
                                if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
-                                       zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
+                                       zval rv;
+                                       zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                        if (Z_REFCOUNT_P(z) == 0) {
                                                zval_dtor(z);
                                        }
-                                       z = value;
+                                       ZVAL_COPY_VALUE(z, value);
                                }
 //???                          if (Z_REFCOUNTED_P(z)) Z_ADDREF_P(z);
                                SEPARATE_ZVAL_IF_NOT_REF(z);
@@ -20420,7 +20440,8 @@ static int ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_VAR_UNUSED(int (*
        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 *objval = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr TSRMLS_CC);
+               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);
@@ -20472,7 +20493,8 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_VAR_UNUSED(int (*bina
        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 *objval = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr TSRMLS_CC);
+               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);
@@ -21785,12 +21807,13 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_VAR_CV(int (*bina
                        }
                        if (z) {
                                if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
-                                       zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
+                                       zval rv;
+                                       zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                        if (Z_REFCOUNT_P(z) == 0) {
                                                zval_dtor(z);
                                        }
-                                       z = value;
+                                       ZVAL_COPY_VALUE(z, value);
                                }
 //???                          if (Z_REFCOUNTED_P(z)) Z_ADDREF_P(z);
                                SEPARATE_ZVAL_IF_NOT_REF(z);
@@ -21868,7 +21891,8 @@ static int ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_VAR_CV(int (*bina
        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 *objval = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr TSRMLS_CC);
+               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);
@@ -21920,7 +21944,8 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_VAR_CV(int (*binary_o
        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 *objval = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr TSRMLS_CC);
+               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);
@@ -22141,12 +22166,13 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_VAR_CV(incdec_t in
                        zval *z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL), &rv TSRMLS_CC);
 
                        if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
-                               zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
+                               zval rv;
+                               zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                if (Z_REFCOUNT_P(z) == 0) {
                                        zval_dtor(z);
                                }
-                               z = value;
+                               ZVAL_COPY_VALUE(z, value);
                        }
                        if (Z_REFCOUNTED_P(z)) Z_ADDREF_P(z);
                        SEPARATE_ZVAL_IF_NOT_REF(z);
@@ -22238,12 +22264,13 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_VAR_CV(incdec_t i
                        zval z_copy;
 
                        if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
-                               zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
+                               zval rv;
+                               zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                if (Z_REFCOUNT_P(z) == 0) {
                                        zval_dtor(z);
                                }
-                               z = value;
+                               ZVAL_COPY_VALUE(z, value);
                        }
                        ZVAL_DUP(retval, z);
                        ZVAL_DUP(&z_copy, z);
@@ -23682,12 +23709,13 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_UNUSED_CONST(int
                        }
                        if (z) {
                                if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
-                                       zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
+                                       zval rv;
+                                       zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                        if (Z_REFCOUNT_P(z) == 0) {
                                                zval_dtor(z);
                                        }
-                                       z = value;
+                                       ZVAL_COPY_VALUE(z, value);
                                }
 //???                          if (Z_REFCOUNTED_P(z)) Z_ADDREF_P(z);
                                SEPARATE_ZVAL_IF_NOT_REF(z);
@@ -23764,7 +23792,8 @@ static int ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_UNUSED_CONST(int
        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 *objval = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr TSRMLS_CC);
+               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);
@@ -23816,7 +23845,8 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_UNUSED_CONST(int (*bi
        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 *objval = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr TSRMLS_CC);
+               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);
@@ -24037,12 +24067,13 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_UNUSED_CONST(incde
                        zval *z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL), &rv TSRMLS_CC);
 
                        if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
-                               zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
+                               zval rv;
+                               zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                if (Z_REFCOUNT_P(z) == 0) {
                                        zval_dtor(z);
                                }
-                               z = value;
+                               ZVAL_COPY_VALUE(z, value);
                        }
                        if (Z_REFCOUNTED_P(z)) Z_ADDREF_P(z);
                        SEPARATE_ZVAL_IF_NOT_REF(z);
@@ -24134,12 +24165,13 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_UNUSED_CONST(incd
                        zval z_copy;
 
                        if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
-                               zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
+                               zval rv;
+                               zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                if (Z_REFCOUNT_P(z) == 0) {
                                        zval_dtor(z);
                                }
-                               z = value;
+                               ZVAL_COPY_VALUE(z, value);
                        }
                        ZVAL_DUP(retval, z);
                        ZVAL_DUP(&z_copy, z);
@@ -25113,12 +25145,13 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_UNUSED_TMP(int (*
                        }
                        if (z) {
                                if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
-                                       zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
+                                       zval rv;
+                                       zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                        if (Z_REFCOUNT_P(z) == 0) {
                                                zval_dtor(z);
                                        }
-                                       z = value;
+                                       ZVAL_COPY_VALUE(z, value);
                                }
 //???                          if (Z_REFCOUNTED_P(z)) Z_ADDREF_P(z);
                                SEPARATE_ZVAL_IF_NOT_REF(z);
@@ -25195,7 +25228,8 @@ static int ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_UNUSED_TMP(int (*
        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 *objval = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr TSRMLS_CC);
+               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);
@@ -25247,7 +25281,8 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_UNUSED_TMP(int (*bina
        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 *objval = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr TSRMLS_CC);
+               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);
@@ -25468,12 +25503,13 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_UNUSED_TMP(incdec_
                        zval *z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL), &rv TSRMLS_CC);
 
                        if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
-                               zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
+                               zval rv;
+                               zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                if (Z_REFCOUNT_P(z) == 0) {
                                        zval_dtor(z);
                                }
-                               z = value;
+                               ZVAL_COPY_VALUE(z, value);
                        }
                        if (Z_REFCOUNTED_P(z)) Z_ADDREF_P(z);
                        SEPARATE_ZVAL_IF_NOT_REF(z);
@@ -25565,12 +25601,13 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_UNUSED_TMP(incdec
                        zval z_copy;
 
                        if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
-                               zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
+                               zval rv;
+                               zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                if (Z_REFCOUNT_P(z) == 0) {
                                        zval_dtor(z);
                                }
-                               z = value;
+                               ZVAL_COPY_VALUE(z, value);
                        }
                        ZVAL_DUP(retval, z);
                        ZVAL_DUP(&z_copy, z);
@@ -26455,12 +26492,13 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_UNUSED_VAR(int (*
                        }
                        if (z) {
                                if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
-                                       zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
+                                       zval rv;
+                                       zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                        if (Z_REFCOUNT_P(z) == 0) {
                                                zval_dtor(z);
                                        }
-                                       z = value;
+                                       ZVAL_COPY_VALUE(z, value);
                                }
 //???                          if (Z_REFCOUNTED_P(z)) Z_ADDREF_P(z);
                                SEPARATE_ZVAL_IF_NOT_REF(z);
@@ -26537,7 +26575,8 @@ static int ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_UNUSED_VAR(int (*
        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 *objval = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr TSRMLS_CC);
+               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);
@@ -26589,7 +26628,8 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_UNUSED_VAR(int (*bina
        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 *objval = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr TSRMLS_CC);
+               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);
@@ -26810,12 +26850,13 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_UNUSED_VAR(incdec_
                        zval *z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL), &rv TSRMLS_CC);
 
                        if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
-                               zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
+                               zval rv;
+                               zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                if (Z_REFCOUNT_P(z) == 0) {
                                        zval_dtor(z);
                                }
-                               z = value;
+                               ZVAL_COPY_VALUE(z, value);
                        }
                        if (Z_REFCOUNTED_P(z)) Z_ADDREF_P(z);
                        SEPARATE_ZVAL_IF_NOT_REF(z);
@@ -26907,12 +26948,13 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_UNUSED_VAR(incdec
                        zval z_copy;
 
                        if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
-                               zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
+                               zval rv;
+                               zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                if (Z_REFCOUNT_P(z) == 0) {
                                        zval_dtor(z);
                                }
-                               z = value;
+                               ZVAL_COPY_VALUE(z, value);
                        }
                        ZVAL_DUP(retval, z);
                        ZVAL_DUP(&z_copy, z);
@@ -27798,12 +27840,13 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_UNUSED_UNUSED(int
                        }
                        if (z) {
                                if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
-                                       zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
+                                       zval rv;
+                                       zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                        if (Z_REFCOUNT_P(z) == 0) {
                                                zval_dtor(z);
                                        }
-                                       z = value;
+                                       ZVAL_COPY_VALUE(z, value);
                                }
 //???                          if (Z_REFCOUNTED_P(z)) Z_ADDREF_P(z);
                                SEPARATE_ZVAL_IF_NOT_REF(z);
@@ -27880,7 +27923,8 @@ static int ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_UNUSED_UNUSED(int
        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 *objval = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr TSRMLS_CC);
+               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);
@@ -27932,7 +27976,8 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_UNUSED_UNUSED(int (*b
        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 *objval = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr TSRMLS_CC);
+               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);
@@ -28310,12 +28355,13 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_UNUSED_CV(int (*b
                        }
                        if (z) {
                                if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
-                                       zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
+                                       zval rv;
+                                       zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                        if (Z_REFCOUNT_P(z) == 0) {
                                                zval_dtor(z);
                                        }
-                                       z = value;
+                                       ZVAL_COPY_VALUE(z, value);
                                }
 //???                          if (Z_REFCOUNTED_P(z)) Z_ADDREF_P(z);
                                SEPARATE_ZVAL_IF_NOT_REF(z);
@@ -28392,7 +28438,8 @@ static int ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_UNUSED_CV(int (*b
        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 *objval = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr TSRMLS_CC);
+               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);
@@ -28444,7 +28491,8 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_UNUSED_CV(int (*binar
        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 *objval = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr TSRMLS_CC);
+               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);
@@ -28665,12 +28713,13 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_UNUSED_CV(incdec_t
                        zval *z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL), &rv TSRMLS_CC);
 
                        if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
-                               zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
+                               zval rv;
+                               zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                if (Z_REFCOUNT_P(z) == 0) {
                                        zval_dtor(z);
                                }
-                               z = value;
+                               ZVAL_COPY_VALUE(z, value);
                        }
                        if (Z_REFCOUNTED_P(z)) Z_ADDREF_P(z);
                        SEPARATE_ZVAL_IF_NOT_REF(z);
@@ -28762,12 +28811,13 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_UNUSED_CV(incdec_
                        zval z_copy;
 
                        if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
-                               zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
+                               zval rv;
+                               zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                if (Z_REFCOUNT_P(z) == 0) {
                                        zval_dtor(z);
                                }
-                               z = value;
+                               ZVAL_COPY_VALUE(z, value);
                        }
                        ZVAL_DUP(retval, z);
                        ZVAL_DUP(&z_copy, z);
@@ -29646,7 +29696,8 @@ static int ZEND_FASTCALL  ZEND_PRE_INC_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
           && Z_OBJ_HANDLER_P(var_ptr, get)
           && Z_OBJ_HANDLER_P(var_ptr, set)) {
                /* proxy object */
-               zval *val = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr TSRMLS_CC);
+               zval rv;
+               zval *val = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr, &rv TSRMLS_CC);
                Z_ADDREF_P(val);
                fast_increment_function(val);
                Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, val TSRMLS_CC);
@@ -29694,7 +29745,8 @@ static int ZEND_FASTCALL  ZEND_PRE_DEC_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
           && Z_OBJ_HANDLER_P(var_ptr, get)
           && Z_OBJ_HANDLER_P(var_ptr, set)) {
                /* proxy object */
-               zval *val = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr TSRMLS_CC);
+               zval rv;
+               zval *val = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr, &rv TSRMLS_CC);
                Z_ADDREF_P(val);
                fast_decrement_function(val);
                Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, val TSRMLS_CC);
@@ -29744,7 +29796,8 @@ static int ZEND_FASTCALL  ZEND_POST_INC_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS
           && Z_OBJ_HANDLER_P(var_ptr, get)
           && Z_OBJ_HANDLER_P(var_ptr, set)) {
                /* proxy object */
-               zval *val = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr TSRMLS_CC);
+               zval rv;
+               zval *val = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr, &rv TSRMLS_CC);
                Z_ADDREF_P(val);
                fast_increment_function(val);
                Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, val TSRMLS_CC);
@@ -29790,7 +29843,8 @@ static int ZEND_FASTCALL  ZEND_POST_DEC_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS
           && Z_OBJ_HANDLER_P(var_ptr, get)
           && Z_OBJ_HANDLER_P(var_ptr, set)) {
                /* proxy object */
-               zval *val = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr TSRMLS_CC);
+               zval rv;
+               zval *val = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr, &rv TSRMLS_CC);
                Z_ADDREF_P(val);
                fast_decrement_function(val);
                Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, val TSRMLS_CC);
@@ -31152,12 +31206,13 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_CV_CONST(int (*bi
                        }
                        if (z) {
                                if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
-                                       zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
+                                       zval rv;
+                                       zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                        if (Z_REFCOUNT_P(z) == 0) {
                                                zval_dtor(z);
                                        }
-                                       z = value;
+                                       ZVAL_COPY_VALUE(z, value);
                                }
 //???                          if (Z_REFCOUNTED_P(z)) Z_ADDREF_P(z);
                                SEPARATE_ZVAL_IF_NOT_REF(z);
@@ -31234,7 +31289,8 @@ static int ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_CV_CONST(int (*bi
        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 *objval = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr TSRMLS_CC);
+               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);
@@ -31286,7 +31342,8 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_CV_CONST(int (*binary
        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 *objval = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr TSRMLS_CC);
+               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);
@@ -31507,12 +31564,13 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_CV_CONST(incdec_t
                        zval *z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, ((IS_CONST == IS_CONST) ? opline->op2.literal : NULL), &rv TSRMLS_CC);
 
                        if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
-                               zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
+                               zval rv;
+                               zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                if (Z_REFCOUNT_P(z) == 0) {
                                        zval_dtor(z);
                                }
-                               z = value;
+                               ZVAL_COPY_VALUE(z, value);
                        }
                        if (Z_REFCOUNTED_P(z)) Z_ADDREF_P(z);
                        SEPARATE_ZVAL_IF_NOT_REF(z);
@@ -31604,12 +31662,13 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_CV_CONST(incdec_t
                        zval z_copy;
 
                        if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
-                               zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
+                               zval rv;
+                               zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                if (Z_REFCOUNT_P(z) == 0) {
                                        zval_dtor(z);
                                }
-                               z = value;
+                               ZVAL_COPY_VALUE(z, value);
                        }
                        ZVAL_DUP(retval, z);
                        ZVAL_DUP(&z_copy, z);
@@ -33359,12 +33418,13 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_CV_TMP(int (*bina
                        }
                        if (z) {
                                if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
-                                       zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
+                                       zval rv;
+                                       zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                        if (Z_REFCOUNT_P(z) == 0) {
                                                zval_dtor(z);
                                        }
-                                       z = value;
+                                       ZVAL_COPY_VALUE(z, value);
                                }
 //???                          if (Z_REFCOUNTED_P(z)) Z_ADDREF_P(z);
                                SEPARATE_ZVAL_IF_NOT_REF(z);
@@ -33441,7 +33501,8 @@ static int ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_CV_TMP(int (*bina
        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 *objval = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr TSRMLS_CC);
+               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);
@@ -33493,7 +33554,8 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_CV_TMP(int (*binary_o
        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 *objval = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr TSRMLS_CC);
+               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);
@@ -33714,12 +33776,13 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_CV_TMP(incdec_t in
                        zval *z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, ((IS_TMP_VAR == IS_CONST) ? opline->op2.literal : NULL), &rv TSRMLS_CC);
 
                        if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
-                               zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
+                               zval rv;
+                               zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                if (Z_REFCOUNT_P(z) == 0) {
                                        zval_dtor(z);
                                }
-                               z = value;
+                               ZVAL_COPY_VALUE(z, value);
                        }
                        if (Z_REFCOUNTED_P(z)) Z_ADDREF_P(z);
                        SEPARATE_ZVAL_IF_NOT_REF(z);
@@ -33811,12 +33874,13 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_CV_TMP(incdec_t i
                        zval z_copy;
 
                        if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
-                               zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
+                               zval rv;
+                               zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                if (Z_REFCOUNT_P(z) == 0) {
                                        zval_dtor(z);
                                }
-                               z = value;
+                               ZVAL_COPY_VALUE(z, value);
                        }
                        ZVAL_DUP(retval, z);
                        ZVAL_DUP(&z_copy, z);
@@ -35271,12 +35335,13 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_CV_VAR(int (*bina
                        }
                        if (z) {
                                if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
-                                       zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
+                                       zval rv;
+                                       zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                        if (Z_REFCOUNT_P(z) == 0) {
                                                zval_dtor(z);
                                        }
-                                       z = value;
+                                       ZVAL_COPY_VALUE(z, value);
                                }
 //???                          if (Z_REFCOUNTED_P(z)) Z_ADDREF_P(z);
                                SEPARATE_ZVAL_IF_NOT_REF(z);
@@ -35353,7 +35418,8 @@ static int ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_CV_VAR(int (*bina
        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 *objval = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr TSRMLS_CC);
+               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);
@@ -35405,7 +35471,8 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_CV_VAR(int (*binary_o
        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 *objval = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr TSRMLS_CC);
+               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);
@@ -35626,12 +35693,13 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_CV_VAR(incdec_t in
                        zval *z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, ((IS_VAR == IS_CONST) ? opline->op2.literal : NULL), &rv TSRMLS_CC);
 
                        if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
-                               zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
+                               zval rv;
+                               zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                if (Z_REFCOUNT_P(z) == 0) {
                                        zval_dtor(z);
                                }
-                               z = value;
+                               ZVAL_COPY_VALUE(z, value);
                        }
                        if (Z_REFCOUNTED_P(z)) Z_ADDREF_P(z);
                        SEPARATE_ZVAL_IF_NOT_REF(z);
@@ -35723,12 +35791,13 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_CV_VAR(incdec_t i
                        zval z_copy;
 
                        if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
-                               zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
+                               zval rv;
+                               zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                if (Z_REFCOUNT_P(z) == 0) {
                                        zval_dtor(z);
                                }
-                               z = value;
+                               ZVAL_COPY_VALUE(z, value);
                        }
                        ZVAL_DUP(retval, z);
                        ZVAL_DUP(&z_copy, z);
@@ -37269,12 +37338,13 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_CV_UNUSED(int (*b
                        }
                        if (z) {
                                if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
-                                       zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
+                                       zval rv;
+                                       zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                        if (Z_REFCOUNT_P(z) == 0) {
                                                zval_dtor(z);
                                        }
-                                       z = value;
+                                       ZVAL_COPY_VALUE(z, value);
                                }
 //???                          if (Z_REFCOUNTED_P(z)) Z_ADDREF_P(z);
                                SEPARATE_ZVAL_IF_NOT_REF(z);
@@ -37351,7 +37421,8 @@ static int ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_CV_UNUSED(int (*b
        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 *objval = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr TSRMLS_CC);
+               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);
@@ -37403,7 +37474,8 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_CV_UNUSED(int (*binar
        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 *objval = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr TSRMLS_CC);
+               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);
@@ -38582,12 +38654,13 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_CV_CV(int (*binar
                        }
                        if (z) {
                                if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) {
-                                       zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
+                                       zval rv;
+                                       zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                        if (Z_REFCOUNT_P(z) == 0) {
                                                zval_dtor(z);
                                        }
-                                       z = value;
+                                       ZVAL_COPY_VALUE(z, value);
                                }
 //???                          if (Z_REFCOUNTED_P(z)) Z_ADDREF_P(z);
                                SEPARATE_ZVAL_IF_NOT_REF(z);
@@ -38664,7 +38737,8 @@ static int ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_CV_CV(int (*binar
        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 *objval = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr TSRMLS_CC);
+               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);
@@ -38716,7 +38790,8 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_CV_CV(int (*binary_op
        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 *objval = Z_OBJ_HANDLER_P(var_ptr, get)(var_ptr TSRMLS_CC);
+               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);
@@ -38937,12 +39012,13 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_CV_CV(incdec_t inc
                        zval *z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, ((IS_CV == IS_CONST) ? opline->op2.literal : NULL), &rv TSRMLS_CC);
 
                        if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
-                               zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
+                               zval rv;
+                               zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                if (Z_REFCOUNT_P(z) == 0) {
                                        zval_dtor(z);
                                }
-                               z = value;
+                               ZVAL_COPY_VALUE(z, value);
                        }
                        if (Z_REFCOUNTED_P(z)) Z_ADDREF_P(z);
                        SEPARATE_ZVAL_IF_NOT_REF(z);
@@ -39034,12 +39110,13 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_CV_CV(incdec_t in
                        zval z_copy;
 
                        if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) {
-                               zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
+                               zval rv;
+                               zval *value = Z_OBJ_HT_P(z)->get(z, &rv TSRMLS_CC);
 
                                if (Z_REFCOUNT_P(z) == 0) {
                                        zval_dtor(z);
                                }
-                               z = value;
+                               ZVAL_COPY_VALUE(z, value);
                        }
                        ZVAL_DUP(retval, z);
                        ZVAL_DUP(&z_copy, z);
index 76fab5ac35300a642b97f8a5d5abb5206256b5d3..16e4c8539e82fb27fb6b1494b35997f3f68a0e90 100644 (file)
@@ -54,7 +54,7 @@ PHP_SXE_API zend_class_entry *sxe_get_element_class_entry() /* {{{ */
 static php_sxe_object* php_sxe_object_new(zend_class_entry *ce TSRMLS_DC);
 static xmlNodePtr php_sxe_reset_iterator(php_sxe_object *sxe, int use_data TSRMLS_DC);
 static xmlNodePtr php_sxe_iterator_fetch(php_sxe_object *sxe, xmlNodePtr node, int use_data TSRMLS_DC);
-static zval *sxe_get_value(zval *z TSRMLS_DC);
+static zval *sxe_get_value(zval *z, zval *rv TSRMLS_DC);
 static void php_sxe_iterator_dtor(zend_object_iterator *iter TSRMLS_DC);
 static int php_sxe_iterator_valid(zend_object_iterator *iter TSRMLS_DC);
 static zval *php_sxe_iterator_current_data(zend_object_iterator *iter TSRMLS_DC);
@@ -528,19 +528,14 @@ static int sxe_prop_dim_write(zval *object, zval *member, zval *value, zend_bool
                        case IS_BOOL:
                        case IS_DOUBLE:
                        case IS_NULL:
-                               if (Z_REFCOUNT_P(value) > 1) {
-                                       value_copy = *value;
-                                       zval_copy_ctor(&value_copy);
-                                       value = &value_copy;
-                               }
                                convert_to_string(value);
                                break;
                        case IS_STRING:
                                break;
                        case IS_OBJECT:
                                if (Z_OBJCE_P(value) == sxe_class_entry) {
-                                       value = sxe_get_value(value TSRMLS_CC);
                                        //???
+                                       value = sxe_get_value(value, value TSRMLS_CC);
                                        //INIT_PZVAL(value);
                                        new_value = 1;
                                        break;
@@ -1913,23 +1908,14 @@ SXE_METHOD(count)
 }
 /* }}} */
 
-static zval *sxe_get_value(zval *z TSRMLS_DC) /* {{{ */
+static zval *sxe_get_value(zval *z, zval *rv TSRMLS_DC) /* {{{ */
 {
-#if 0
-       ?????
-       zval *retval;
-
-       MAKE_STD_ZVAL(retval);
-
-       if (sxe_object_cast(z, retval, IS_STRING TSRMLS_CC) == FAILURE) {
+       if (sxe_object_cast(z, rv, IS_STRING TSRMLS_CC) == FAILURE) {
                zend_error(E_ERROR, "Unable to cast node to string");
                /* FIXME: Should not be fatal */
        }
 
-       Z_SET_REFCOUNT_P(retval, 0);
-       return retval;
-#endif
-       return NULL;
+       return rv;
 }
 /* }}} */