]> granicus.if.org Git - php/commitdiff
Add ZVAL_OBJ_COPY macro
authorNikita Popov <nikita.ppv@gmail.com>
Wed, 17 Jun 2020 10:34:04 +0000 (12:34 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Wed, 17 Jun 2020 14:36:56 +0000 (16:36 +0200)
For the common ZVAL_OBJ + GC_ADDREF pattern.
This mirrors the existing ZVAL_STR_COPY API.

27 files changed:
Zend/zend_API.h
Zend/zend_builtin_functions.c
Zend/zend_closures.c
Zend/zend_generators.c
Zend/zend_inheritance.c
Zend/zend_interfaces.c
Zend/zend_types.h
Zend/zend_weakrefs.c
ext/date/php_date.c
ext/dom/dom_iterators.c
ext/dom/php_dom.c
ext/intl/breakiterator/breakiterator_iterators.cpp
ext/pdo/pdo_dbh.c
ext/phar/phar_object.c
ext/reflection/php_reflection.c
ext/simplexml/simplexml.c
ext/soap/soap.c
ext/spl/php_spl.c
ext/spl/spl_array.c
ext/spl/spl_directory.c
ext/spl/spl_dllist.c
ext/spl/spl_fixedarray.c
ext/spl/spl_iterators.c
ext/sqlite3/sqlite3.c
ext/standard/array.c
ext/standard/var.c
ext/xml/xml.c

index 8ed0e20871c7fcac7b2690d9a578db880ed958b6..bdcdfaea318f4898424c1dc995b46f6d7064c1c2 100644 (file)
@@ -716,6 +716,7 @@ END_EXTERN_C()
 #define RETVAL_ARR(r)                                  ZVAL_ARR(return_value, r)
 #define RETVAL_EMPTY_ARRAY()                   ZVAL_EMPTY_ARRAY(return_value)
 #define RETVAL_OBJ(r)                                  ZVAL_OBJ(return_value, r)
+#define RETVAL_OBJ_COPY(r)                             ZVAL_OBJ_COPY(return_value, r)
 #define RETVAL_COPY(zv)                                        ZVAL_COPY(return_value, zv)
 #define RETVAL_COPY_VALUE(zv)                  ZVAL_COPY_VALUE(return_value, zv)
 #define RETVAL_ZVAL(zv, copy, dtor)            ZVAL_ZVAL(return_value, zv, copy, dtor)
@@ -740,6 +741,7 @@ END_EXTERN_C()
 #define RETURN_ARR(r)                                  do { RETVAL_ARR(r); return; } while (0)
 #define RETURN_EMPTY_ARRAY()                   do { RETVAL_EMPTY_ARRAY(); return; } while (0)
 #define RETURN_OBJ(r)                                  do { RETVAL_OBJ(r); return; } while (0)
+#define RETURN_OBJ_COPY(r)                             do { RETVAL_OBJ_COPY(r); return; } while (0)
 #define RETURN_COPY(zv)                                        do { RETVAL_COPY(zv); return; } while (0)
 #define RETURN_COPY_VALUE(zv)                  do { RETVAL_COPY_VALUE(zv); return; } while (0)
 #define RETURN_ZVAL(zv, copy, dtor)            do { RETVAL_ZVAL(zv, copy, dtor); return; } while (0)
index 775bab1504a3f250b109f0f683af34a93483ef2a..521c2c32de199623a94559f0b729e759942356dd 100644 (file)
@@ -2069,9 +2069,8 @@ ZEND_API void zend_fetch_debug_backtrace(zval *return_value, int skip_last, int
                                }
                                zend_hash_add_new(Z_ARRVAL(stack_frame), ZSTR_KNOWN(ZEND_STR_CLASS), &tmp);
                                if ((options & DEBUG_BACKTRACE_PROVIDE_OBJECT) != 0) {
-                                       ZVAL_OBJ(&tmp, object);
+                                       ZVAL_OBJ_COPY(&tmp, object);
                                        zend_hash_add_new(Z_ARRVAL(stack_frame), ZSTR_KNOWN(ZEND_STR_OBJECT), &tmp);
-                                       Z_ADDREF(tmp);
                                }
 
                                ZVAL_INTERNED_STR(&tmp, ZSTR_KNOWN(ZEND_STR_OBJECT_OPERATOR));
index af008c3628fa57e29ef1d5345a3c8443b6a0f011..40ebaae0ab74d35ede570fc136fad166c8e2b666 100644 (file)
@@ -283,8 +283,7 @@ static int zend_create_closure_from_callable(zval *return_value, zval *callable,
                /* For Closure::fromCallable([$closure, "__invoke"]) return $closure. */
                if (fcc.object && fcc.object->ce == zend_ce_closure
                                && zend_string_equals_literal(mptr->common.function_name, "__invoke")) {
-                       ZVAL_OBJ(return_value, fcc.object);
-                       GC_ADDREF(fcc.object);
+                       RETVAL_OBJ_COPY(fcc.object);
                        zend_free_trampoline(mptr);
                        return SUCCESS;
                }
@@ -725,8 +724,7 @@ ZEND_API void zend_create_closure(zval *res, zend_function *func, zend_class_ent
        if (scope) {
                closure->func.common.fn_flags |= ZEND_ACC_PUBLIC;
                if (this_ptr && Z_TYPE_P(this_ptr) == IS_OBJECT && (closure->func.common.fn_flags & ZEND_ACC_STATIC) == 0) {
-                       Z_ADDREF_P(this_ptr);
-                       ZVAL_OBJ(&closure->this_ptr, Z_OBJ_P(this_ptr));
+                       ZVAL_OBJ_COPY(&closure->this_ptr, Z_OBJ_P(this_ptr));
                }
        }
 }
index a74ae530b1bbc0607fb8e29db3abca4f23807ebe..803627f9a1d19afc91c5b1629a3a3f102970eace 100644 (file)
@@ -1120,8 +1120,7 @@ zend_object_iterator *zend_generator_get_iterator(zend_class_entry *ce, zval *ob
        zend_iterator_init(iterator);
 
        iterator->funcs = &zend_generator_iterator_functions;
-       Z_ADDREF_P(object);
-       ZVAL_OBJ(&iterator->data, Z_OBJ_P(object));
+       ZVAL_OBJ_COPY(&iterator->data, Z_OBJ_P(object));
 
        return iterator;
 }
index b6a3a891b23ca7bafa25d80960673e3d85f3c3e8..7cee42085bf584bdf683be1b70a4680f76b0e135 100644 (file)
@@ -2416,8 +2416,7 @@ static void check_unrecoverable_load_failure(zend_class_entry *ce) {
                zend_string *exception_str;
                zval exception_zv;
                ZEND_ASSERT(EG(exception) && "Exception must have been thrown");
-               ZVAL_OBJ(&exception_zv, EG(exception));
-               Z_ADDREF(exception_zv);
+               ZVAL_OBJ_COPY(&exception_zv, EG(exception));
                zend_clear_exception();
                exception_str = zval_get_string(&exception_zv);
                zend_error_noreturn(E_ERROR,
index 52d3a8ee19e379570e272956c9f73d0ad45f8340..6ac2721f453d5b978c42cf49563eedce87529a21 100644 (file)
@@ -211,8 +211,7 @@ static zend_object_iterator *zend_user_it_get_iterator(zend_class_entry *ce, zva
 
        zend_iterator_init((zend_object_iterator*)iterator);
 
-       Z_ADDREF_P(object);
-       ZVAL_OBJ(&iterator->it.data, Z_OBJ_P(object));
+       ZVAL_OBJ_COPY(&iterator->it.data, Z_OBJ_P(object));
        iterator->it.funcs = &zend_interface_iterator_funcs_iterator;
        iterator->ce = Z_OBJCE_P(object);
        ZVAL_UNDEF(&iterator->value);
index 10a751d1b4f2cfe8c9db21c5869ee24d8ac2146c..7796979ed842fbafa1800e03d4cd7a66a84bcfbf 100644 (file)
@@ -968,6 +968,14 @@ static zend_always_inline uint32_t zval_gc_info(uint32_t gc_type_info) {
                Z_TYPE_INFO_P(__z) = IS_OBJECT_EX;              \
        } while (0)
 
+#define ZVAL_OBJ_COPY(z, o) do {                               \
+               zval *__z = (z);                                                \
+               zend_object *__o = (o);                                 \
+               GC_ADDREF(__o);                                                 \
+               Z_OBJ_P(__z) = __o;                                             \
+               Z_TYPE_INFO_P(__z) = IS_OBJECT_EX;              \
+       } while (0)
+
 #define ZVAL_RES(z, r) do {                                            \
                zval *__z = (z);                                                \
                Z_RES_P(__z) = (r);                                             \
index db5ffde2fdcf12bd522e4a303fec93aeb63352e5..b633a57e9fd5e1d171112a0eb185f2888ba21cd7 100644 (file)
@@ -189,8 +189,7 @@ static zend_always_inline zend_bool zend_weakref_find(zval *referent, zval *retu
                zend_weakref *wr;
 found_weakref:
                wr = ptr;
-               GC_ADDREF(&wr->std);
-               ZVAL_OBJ(return_value, &wr->std);
+               RETVAL_OBJ_COPY(&wr->std);
                return 1;
        }
 
@@ -221,8 +220,7 @@ static zend_always_inline void zend_weakref_get(zval *weakref, zval *return_valu
        zend_weakref *wr = zend_weakref_fetch(weakref);
 
        if (wr->referent) {
-               ZVAL_OBJ(return_value, wr->referent);
-               Z_ADDREF_P(return_value);
+               RETVAL_OBJ_COPY(wr->referent);
        }
 }
 
@@ -433,8 +431,7 @@ static HashTable *zend_weakmap_get_properties_for(zend_object *object, zend_prop
                zval obj_zv;
                array_init(&pair);
 
-               ZVAL_OBJ(&obj_zv, (zend_object *) obj_addr);
-               Z_ADDREF(obj_zv);
+               ZVAL_OBJ_COPY(&obj_zv, (zend_object *) obj_addr);
                add_assoc_zval(&pair, "key", &obj_zv);
                Z_TRY_ADDREF_P(val);
                add_assoc_zval(&pair, "value", val);
@@ -511,8 +508,7 @@ static void zend_weakmap_iterator_get_current_key(zend_object_iterator *obj_iter
                ZEND_ASSERT(0 && "Must have integer key");
        }
 
-       ZVAL_OBJ(key, (zend_object *) num_key);
-       Z_ADDREF_P(key);
+       ZVAL_OBJ_COPY(key, (zend_object *) num_key);
 }
 
 static void zend_weakmap_iterator_move_forward(zend_object_iterator *obj_iter)
index a908fed2c7a22c784c646f2744387e15e364c6aa..94e8ab50c7124e479befa2f5436e7017ac7fc095 100644 (file)
@@ -1542,8 +1542,7 @@ zend_object_iterator *date_object_period_get_iterator(zend_class_entry *ce, zval
 
        zend_iterator_init((zend_object_iterator*)iterator);
 
-       Z_ADDREF_P(object);
-       ZVAL_OBJ(&iterator->intern.data, Z_OBJ_P(object));
+       ZVAL_OBJ_COPY(&iterator->intern.data, Z_OBJ_P(object));
        iterator->intern.funcs = &date_period_it_funcs;
        iterator->object = Z_PHPPERIOD_P(object);
        ZVAL_UNDEF(&iterator->current);
@@ -2891,8 +2890,7 @@ PHP_FUNCTION(date_modify)
                RETURN_FALSE;
        }
 
-       Z_ADDREF_P(object);
-       ZVAL_OBJ(return_value, Z_OBJ_P(object));
+       RETURN_OBJ_COPY(Z_OBJ_P(object));
 }
 /* }}} */
 
@@ -2915,7 +2913,7 @@ PHP_METHOD(DateTimeImmutable, modify)
                RETURN_FALSE;
        }
 
-       ZVAL_OBJ(return_value, Z_OBJ(new_object));
+       RETURN_OBJ(Z_OBJ(new_object));
 }
 /* }}} */
 
@@ -2948,8 +2946,7 @@ PHP_FUNCTION(date_add)
 
        php_date_add(object, interval, return_value);
 
-       Z_ADDREF_P(object);
-       ZVAL_OBJ(return_value, Z_OBJ_P(object));
+       RETURN_OBJ_COPY(Z_OBJ_P(object));
 }
 /* }}} */
 
@@ -2967,7 +2964,7 @@ PHP_METHOD(DateTimeImmutable, add)
        date_clone_immutable(object, &new_object);
        php_date_add(&new_object, interval, return_value);
 
-       ZVAL_OBJ(return_value, Z_OBJ(new_object));
+       RETURN_OBJ(Z_OBJ(new_object));
 }
 /* }}} */
 
@@ -3005,8 +3002,7 @@ PHP_FUNCTION(date_sub)
 
        php_date_sub(object, interval, return_value);
 
-       Z_ADDREF_P(object);
-       ZVAL_OBJ(return_value, Z_OBJ_P(object));
+       RETURN_OBJ_COPY(Z_OBJ_P(object));
 }
 /* }}} */
 
@@ -3024,7 +3020,7 @@ PHP_METHOD(DateTimeImmutable, sub)
        date_clone_immutable(object, &new_object);
        php_date_sub(&new_object, interval, return_value);
 
-       ZVAL_OBJ(return_value, Z_OBJ(new_object));
+       RETURN_OBJ(Z_OBJ(new_object));
 }
 /* }}} */
 
@@ -3109,8 +3105,7 @@ PHP_FUNCTION(date_timezone_set)
 
        php_date_timezone_set(object, timezone_object, return_value);
 
-       Z_ADDREF_P(object);
-       ZVAL_OBJ(return_value, Z_OBJ_P(object));
+       RETURN_OBJ_COPY(Z_OBJ_P(object));
 }
 /* }}} */
 
@@ -3129,7 +3124,7 @@ PHP_METHOD(DateTimeImmutable, setTimezone)
        date_clone_immutable(object, &new_object);
        php_date_timezone_set(&new_object, timezone_object, return_value);
 
-       ZVAL_OBJ(return_value, Z_OBJ(new_object));
+       RETURN_OBJ(Z_OBJ(new_object));
 }
 /* }}} */
 
@@ -3196,8 +3191,7 @@ PHP_FUNCTION(date_time_set)
 
        php_date_time_set(object, h, i, s, ms, return_value);
 
-       Z_ADDREF_P(object);
-       ZVAL_OBJ(return_value, Z_OBJ_P(object));
+       RETURN_OBJ_COPY(Z_OBJ_P(object));
 }
 /* }}} */
 
@@ -3216,7 +3210,7 @@ PHP_METHOD(DateTimeImmutable, setTime)
        date_clone_immutable(object, &new_object);
        php_date_time_set(&new_object, h, i, s, ms, return_value);
 
-       ZVAL_OBJ(return_value, Z_OBJ(new_object));
+       RETURN_OBJ(Z_OBJ(new_object));
 }
 /* }}} */
 
@@ -3246,8 +3240,7 @@ PHP_FUNCTION(date_date_set)
 
        php_date_date_set(object, y, m, d, return_value);
 
-       Z_ADDREF_P(object);
-       ZVAL_OBJ(return_value, Z_OBJ_P(object));
+       RETURN_OBJ_COPY(Z_OBJ_P(object));
 }
 /* }}} */
 
@@ -3266,7 +3259,7 @@ PHP_METHOD(DateTimeImmutable, setDate)
        date_clone_immutable(object, &new_object);
        php_date_date_set(&new_object, y, m, d, return_value);
 
-       ZVAL_OBJ(return_value, Z_OBJ(new_object));
+       RETURN_OBJ(Z_OBJ(new_object));
 }
 /* }}} */
 
@@ -3300,8 +3293,7 @@ PHP_FUNCTION(date_isodate_set)
 
        php_date_isodate_set(object, y, w, d, return_value);
 
-       Z_ADDREF_P(object);
-       ZVAL_OBJ(return_value, Z_OBJ_P(object));
+       RETURN_OBJ_COPY(Z_OBJ_P(object));
 }
 /* }}} */
 
@@ -3320,7 +3312,7 @@ PHP_METHOD(DateTimeImmutable, setISODate)
        date_clone_immutable(object, &new_object);
        php_date_isodate_set(&new_object, y, w, d, return_value);
 
-       ZVAL_OBJ(return_value, Z_OBJ(new_object));
+       RETURN_OBJ(Z_OBJ(new_object));
 }
 /* }}} */
 
@@ -3349,8 +3341,7 @@ PHP_FUNCTION(date_timestamp_set)
 
        php_date_timestamp_set(object, timestamp, return_value);
 
-       Z_ADDREF_P(object);
-       ZVAL_OBJ(return_value, Z_OBJ_P(object));
+       RETURN_OBJ_COPY(Z_OBJ_P(object));
 }
 /* }}} */
 
@@ -3369,7 +3360,7 @@ PHP_METHOD(DateTimeImmutable, setTimestamp)
        date_clone_immutable(object, &new_object);
        php_date_timestamp_set(&new_object, timestamp, return_value);
 
-       ZVAL_OBJ(return_value, Z_OBJ(new_object));
+       RETURN_OBJ(Z_OBJ(new_object));
 }
 /* }}} */
 
index bd83114bd9f06ac733902fbbf4f6b1f78d938b37..c21cc92154bbb7583e0904329cb24e38d37e7fec 100644 (file)
@@ -270,8 +270,7 @@ zend_object_iterator *php_dom_get_iterator(zend_class_entry *ce, zval *object, i
        iterator = emalloc(sizeof(php_dom_iterator));
        zend_iterator_init(&iterator->intern);
 
-       Z_ADDREF_P(object);
-       ZVAL_OBJ(&iterator->intern.data, Z_OBJ_P(object));
+       ZVAL_OBJ_COPY(&iterator->intern.data, Z_OBJ_P(object));
        iterator->intern.funcs = &php_dom_iterator_funcs;
 
        ZVAL_UNDEF(&iterator->curobj);
index 9dc50ac28773dbbb42145ff645e013452ea78820..c90475df1af2d64750e0537493dc95edbe3f31ca 100644 (file)
@@ -997,8 +997,7 @@ void dom_namednode_iter(dom_object *basenode, int ntype, dom_object *intern, xml
 
        ZEND_ASSERT(basenode != NULL);
 
-       ZVAL_OBJ(&mapptr->baseobj_zv, &basenode->std);
-       Z_ADDREF(mapptr->baseobj_zv);
+       ZVAL_OBJ_COPY(&mapptr->baseobj_zv, &basenode->std);
 
        mapptr->baseobj = basenode;
        mapptr->nodetype = ntype;
@@ -1136,8 +1135,7 @@ PHP_DOM_EXPORT zend_bool php_dom_create_object(xmlNodePtr obj, zval *return_valu
        }
 
        if ((intern = (dom_object *) php_dom_object_get_data((void *) obj))) {
-               GC_ADDREF(&intern->std);
-               ZVAL_OBJ(return_value, &intern->std);
+               ZVAL_OBJ_COPY(return_value, &intern->std);
                return 1;
        }
 
index c55d9a2d94b16d493612c51285c32de0bc3cbfd3..7c955a5ecb2321b24dc0a88fe48744158499c511 100644 (file)
@@ -110,8 +110,7 @@ U_CFUNC zend_object_iterator *_breakiterator_get_iterator(
 
        zoi_with_current *zoi_iter = static_cast<zoi_with_current*>(emalloc(sizeof *zoi_iter));
        zend_iterator_init(&zoi_iter->zoi);
-       Z_ADDREF_P(object);
-       ZVAL_OBJ(&zoi_iter->zoi.data, Z_OBJ_P(object));
+       ZVAL_OBJ_COPY(&zoi_iter->zoi.data, Z_OBJ_P(object));
        zoi_iter->zoi.funcs = &breakiterator_iterator_funcs;
        zoi_iter->zoi.index = 0;
        zoi_iter->destroy_it = _breakiterator_destroy_it;
index 769fe25f9d83296508805390e0492f0cc0630adc..e1d8c5b92ca33ba085c12a995da8501c83e790ee 100644 (file)
@@ -535,8 +535,7 @@ PHP_METHOD(PDO, prepare)
        stmt->default_fetch_type = dbh->default_fetch_type;
        stmt->dbh = dbh;
        /* give it a reference to me */
-       ZVAL_OBJ(&stmt->database_object_handle, &dbh_obj->std);
-       Z_ADDREF(stmt->database_object_handle);
+       ZVAL_OBJ_COPY(&stmt->database_object_handle, &dbh_obj->std);
        /* we haven't created a lazy object yet */
        ZVAL_UNDEF(&stmt->lazy_object_ref);
 
@@ -1073,8 +1072,7 @@ PHP_METHOD(PDO, query)
        stmt->active_query_stringlen = statement_len;
        stmt->dbh = dbh;
        /* give it a reference to me */
-       ZVAL_OBJ(&stmt->database_object_handle, &dbh_obj->std);
-       Z_ADDREF(stmt->database_object_handle);
+       ZVAL_OBJ_COPY(&stmt->database_object_handle, &dbh_obj->std);
        /* we haven't created a lazy object yet */
        ZVAL_UNDEF(&stmt->lazy_object_ref);
 
index d273e1d519c22d19efa1dc34bce4fd1119005f72..881ce96cf63bec0fd078136452655df4651bf471 100644 (file)
@@ -2473,7 +2473,7 @@ PHP_METHOD(Phar, convertToExecutable)
        phar_obj->archive->is_data = is_data;
 
        if (ret) {
-               ZVAL_OBJ(return_value, ret);
+               RETURN_OBJ(ret);
        } else {
                RETURN_NULL();
        }
@@ -2576,7 +2576,7 @@ PHP_METHOD(Phar, convertToData)
        phar_obj->archive->is_data = is_data;
 
        if (ret) {
-               ZVAL_OBJ(return_value, ret);
+               RETURN_OBJ(ret);
        } else {
                RETURN_NULL();
        }
@@ -3279,7 +3279,7 @@ PHP_METHOD(Phar, compress)
        }
 
        if (ret) {
-               ZVAL_OBJ(return_value, ret);
+               RETURN_OBJ(ret);
        } else {
                RETURN_NULL();
        }
@@ -3319,7 +3319,7 @@ PHP_METHOD(Phar, decompress)
        }
 
        if (ret) {
-               ZVAL_OBJ(return_value, ret);
+               RETURN_OBJ(ret);
        } else {
                RETURN_NULL();
        }
index 1f29ff59e48925d3f47f46ef2186229f491ea976..0a116a012797b459f10c1013b215b4e02f148b1c 100644 (file)
@@ -1275,8 +1275,7 @@ static void reflection_parameter_factory(zend_function *fptr, zval *closure_obje
        intern->ref_type = REF_TYPE_PARAMETER;
        intern->ce = fptr->common.scope;
        if (closure_object) {
-               Z_ADDREF_P(closure_object);
-               ZVAL_OBJ(&intern->obj, Z_OBJ_P(closure_object));
+               ZVAL_OBJ_COPY(&intern->obj, Z_OBJ_P(closure_object));
        }
 
        prop_name = reflection_prop_name(object);
@@ -1343,8 +1342,7 @@ static void reflection_function_factory(zend_function *function, zval *closure_o
        intern->ref_type = REF_TYPE_FUNCTION;
        intern->ce = NULL;
        if (closure_object) {
-               Z_ADDREF_P(closure_object);
-               ZVAL_OBJ(&intern->obj, Z_OBJ_P(closure_object));
+               ZVAL_OBJ_COPY(&intern->obj, Z_OBJ_P(closure_object));
        }
        ZVAL_STR_COPY(reflection_prop_name(object), function->common.function_name);
 }
@@ -1361,8 +1359,7 @@ static void reflection_method_factory(zend_class_entry *ce, zend_function *metho
        intern->ref_type = REF_TYPE_FUNCTION;
        intern->ce = ce;
        if (closure_object) {
-               Z_ADDREF_P(closure_object);
-               ZVAL_OBJ(&intern->obj, Z_OBJ_P(closure_object));
+               ZVAL_OBJ_COPY(&intern->obj, Z_OBJ_P(closure_object));
        }
 
        ZVAL_STR_COPY(reflection_prop_name(object), method->common.function_name);
@@ -1490,7 +1487,6 @@ ZEND_METHOD(ReflectionFunction, __construct)
 
        if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, ZEND_NUM_ARGS(), "O", &closure, zend_ce_closure) == SUCCESS) {
                fptr = (zend_function*)zend_get_closure_method_def(closure);
-               Z_ADDREF_P(closure);
        } else {
                ALLOCA_FLAG(use_heap)
 
@@ -1521,7 +1517,7 @@ ZEND_METHOD(ReflectionFunction, __construct)
        intern->ptr = fptr;
        intern->ref_type = REF_TYPE_FUNCTION;
        if (closure) {
-               ZVAL_OBJ(&intern->obj, Z_OBJ_P(closure));
+               ZVAL_OBJ_COPY(&intern->obj, Z_OBJ_P(closure));
        } else {
                ZVAL_UNDEF(&intern->obj);
        }
@@ -1591,8 +1587,7 @@ ZEND_METHOD(ReflectionFunctionAbstract, getClosureThis)
        if (!Z_ISUNDEF(intern->obj)) {
                closure_this = zend_get_closure_this_ptr(&intern->obj);
                if (!Z_ISUNDEF_P(closure_this)) {
-                       Z_ADDREF_P(closure_this);
-                       ZVAL_OBJ(return_value, Z_OBJ_P(closure_this));
+                       RETURN_OBJ_COPY(Z_OBJ_P(closure_this));
                }
        }
 }
@@ -1632,8 +1627,7 @@ ZEND_METHOD(ReflectionFunction, getClosure)
 
        if (!Z_ISUNDEF(intern->obj)) {
                /* Closures are immutable objects */
-               Z_ADDREF(intern->obj);
-               ZVAL_OBJ(return_value, Z_OBJ(intern->obj));
+               RETURN_OBJ_COPY(Z_OBJ(intern->obj));
        } else {
                zend_create_fake_closure(return_value, fptr, NULL, NULL, NULL);
        }
@@ -2100,8 +2094,7 @@ ZEND_METHOD(ReflectionGenerator, __construct)
        }
 
        intern->ref_type = REF_TYPE_GENERATOR;
-       Z_ADDREF_P(generator);
-       ZVAL_OBJ(&intern->obj, Z_OBJ_P(generator));
+       ZVAL_OBJ_COPY(&intern->obj, Z_OBJ_P(generator));
        intern->ce = zend_ce_generator;
 }
 /* }}} */
@@ -2217,10 +2210,9 @@ ZEND_METHOD(ReflectionGenerator, getThis)
        REFLECTION_CHECK_VALID_GENERATOR(ex)
 
        if (Z_TYPE(ex->This) == IS_OBJECT) {
-               Z_ADDREF(ex->This);
-               ZVAL_OBJ(return_value, Z_OBJ(ex->This));
+               RETURN_OBJ_COPY(Z_OBJ(ex->This));
        } else {
-               ZVAL_NULL(return_value);
+               RETURN_NULL();
        }
 }
 /* }}} */
@@ -2239,9 +2231,7 @@ ZEND_METHOD(ReflectionGenerator, getExecutingGenerator)
        REFLECTION_CHECK_VALID_GENERATOR(ex)
 
        current = zend_generator_get_current(generator);
-       GC_ADDREF(&current->std);
-
-       ZVAL_OBJ(return_value, (zend_object *) current);
+       RETURN_OBJ_COPY(&current->std);
 }
 /* }}} */
 
@@ -3166,8 +3156,7 @@ ZEND_METHOD(ReflectionMethod, getClosure)
                if (Z_OBJCE_P(obj) == zend_ce_closure &&
                        (mptr->internal_function.fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE))
                {
-                       Z_ADDREF_P(obj);
-                       ZVAL_OBJ(return_value, Z_OBJ_P(obj));
+                       RETURN_OBJ_COPY(Z_OBJ_P(obj));
                } else {
                        zend_create_fake_closure(return_value, mptr, mptr->common.scope, Z_OBJCE_P(obj), obj);
                }
index 85372cb53deea80b2a1b4a16f45465559171057a..20e20e3a2b81c5ec3b2976130a8b028f25ee71fc 100644 (file)
@@ -2216,7 +2216,7 @@ PHP_FUNCTION(simplexml_load_file)
        php_libxml_increment_doc_ref((php_libxml_node_object *)sxe, docp);
        php_libxml_increment_node_ptr((php_libxml_node_object *)sxe, xmlDocGetRootElement(docp), NULL);
 
-       ZVAL_OBJ(return_value, &sxe->zo);
+       RETURN_OBJ(&sxe->zo);
 }
 /* }}} */
 
@@ -2270,7 +2270,7 @@ PHP_FUNCTION(simplexml_load_string)
        php_libxml_increment_doc_ref((php_libxml_node_object *)sxe, docp);
        php_libxml_increment_node_ptr((php_libxml_node_object *)sxe, xmlDocGetRootElement(docp), NULL);
 
-       ZVAL_OBJ(return_value, &sxe->zo);
+       RETURN_OBJ(&sxe->zo);
 }
 /* }}} */
 
@@ -2419,8 +2419,7 @@ zend_object_iterator *php_sxe_get_iterator(zend_class_entry *ce, zval *object, i
        iterator = emalloc(sizeof(php_sxe_iterator));
        zend_iterator_init(&iterator->intern);
 
-       Z_ADDREF_P(object);
-       ZVAL_OBJ(&iterator->intern.data, Z_OBJ_P(object));
+       ZVAL_OBJ_COPY(&iterator->intern.data, Z_OBJ_P(object));
        iterator->intern.funcs = &php_sxe_iterator_funcs;
        iterator->sxe = Z_SXEOBJ_P(object);
 
@@ -2568,7 +2567,7 @@ PHP_FUNCTION(simplexml_import_dom)
                php_libxml_increment_doc_ref((php_libxml_node_object *)sxe, nodep->doc);
                php_libxml_increment_node_ptr((php_libxml_node_object *)sxe, nodep, NULL);
 
-               ZVAL_OBJ(return_value, &sxe->zo);
+               RETURN_OBJ(&sxe->zo);
        } else {
                php_error_docref(NULL, E_WARNING, "Invalid Nodetype to import");
                RETVAL_NULL();
index d2ac5ea6627013fc6ecb9b843a978b6b79d5db26..6356ac73790c1969f9246641ffa238f386afbd50 100644 (file)
@@ -1049,8 +1049,7 @@ PHP_METHOD(SoapServer, setObject)
 
        service->type = SOAP_OBJECT;
 
-       Z_ADDREF_P(obj);
-       ZVAL_OBJ(&service->soap_object, Z_OBJ_P(obj));
+       ZVAL_OBJ_COPY(&service->soap_object, Z_OBJ_P(obj));
 
        SOAP_SERVER_END_CODE();
 }
@@ -1760,8 +1759,7 @@ PHP_METHOD(SoapServer, addSoapHeader)
        *p = emalloc(sizeof(soapHeader));
        memset(*p, 0, sizeof(soapHeader));
        ZVAL_NULL(&(*p)->function_name);
-       Z_ADDREF_P(fault);
-       ZVAL_OBJ(&(*p)->retval, Z_OBJ_P(fault));
+       ZVAL_OBJ_COPY(&(*p)->retval, Z_OBJ_P(fault));
 
        SOAP_SERVER_END_CODE();
 }
index ced58ab20d599c673933cb2ab73d7ecf67734868..e2b361fb5b04eadffcaf92dc32b909eaa842447c 100644 (file)
@@ -609,8 +609,7 @@ PHP_FUNCTION(spl_autoload_functions)
                ZEND_HASH_FOREACH_PTR(SPL_G(autoload_functions), alfi) {
                        if (alfi->closure) {
                                zval obj_zv;
-                               ZVAL_OBJ(&obj_zv, alfi->closure);
-                               Z_ADDREF(obj_zv);
+                               ZVAL_OBJ_COPY(&obj_zv, alfi->closure);
                                add_next_index_zval(return_value, &obj_zv);
                        } else if (alfi->func_ptr->common.scope) {
                                zval tmp;
@@ -618,8 +617,7 @@ PHP_FUNCTION(spl_autoload_functions)
                                array_init(&tmp);
                                if (alfi->obj) {
                                        zval obj_zv;
-                                       ZVAL_OBJ(&obj_zv, alfi->obj);
-                                       Z_ADDREF(obj_zv);
+                                       ZVAL_OBJ_COPY(&obj_zv, alfi->obj);
                                        add_next_index_zval(&tmp, &obj_zv);
                                } else {
                                        add_next_index_str(&tmp, zend_string_copy(alfi->ce->name));
index ab263b6195f6c7ae48198bd69f715b46cd9df8ce..86a1ad501c288022b352818edddc3403ba857b93 100644 (file)
@@ -189,13 +189,11 @@ static zend_object *spl_array_object_new_ex(zend_class_entry *class_type, zend_o
                                        zend_array_dup(spl_array_get_hash_table(other)));
                        } else {
                                ZEND_ASSERT(orig->handlers == &spl_handler_ArrayIterator);
-                               GC_ADDREF(orig);
-                               ZVAL_OBJ(&intern->array, orig);
+                               ZVAL_OBJ_COPY(&intern->array, orig);
                                intern->ar_flags |= SPL_ARRAY_USE_OTHER;
                        }
                } else {
-                       GC_ADDREF(orig);
-                       ZVAL_OBJ(&intern->array, orig);
+                       ZVAL_OBJ_COPY(&intern->array, orig);
                        intern->ar_flags |= SPL_ARRAY_USE_OTHER;
                }
        } else {
@@ -1173,8 +1171,7 @@ zend_object_iterator *spl_array_get_iterator(zend_class_entry *ce, zval *object,
 
        zend_iterator_init(&iterator->it);
 
-       Z_ADDREF_P(object);
-       ZVAL_OBJ(&iterator->it.data, Z_OBJ_P(object));
+       ZVAL_OBJ_COPY(&iterator->it.data, Z_OBJ_P(object));
        iterator->it.funcs = &spl_array_it_funcs;
        iterator->ce = ce;
        ZVAL_UNDEF(&iterator->value);
@@ -1333,7 +1330,7 @@ PHP_METHOD(ArrayObject, getIterator)
                RETURN_THROWS();
        }
 
-       ZVAL_OBJ(return_value, spl_array_object_new_ex(intern->ce_get_iterator, Z_OBJ_P(object), 0));
+       RETURN_OBJ(spl_array_object_new_ex(intern->ce_get_iterator, Z_OBJ_P(object), 0));
 }
 /* }}} */
 
@@ -1652,9 +1649,7 @@ PHP_METHOD(RecursiveArrayIterator, getChildren)
                        return;
                }
                if (instanceof_function(Z_OBJCE_P(entry), Z_OBJCE_P(ZEND_THIS))) {
-                       ZVAL_OBJ(return_value, Z_OBJ_P(entry));
-                       Z_ADDREF_P(return_value);
-                       return;
+                       RETURN_OBJ_COPY(Z_OBJ_P(entry));
                }
        }
 
index df33ae6548d8b019b8c2b80bdf20bbc4cf5e3d48..f30d7fcf7f78f11bac9bf53ce106a14fafbd2915 100644 (file)
@@ -457,7 +457,7 @@ static spl_filesystem_object *spl_filesystem_object_create_info(spl_filesystem_o
        zend_update_class_constants(ce);
 
        intern = spl_filesystem_from_obj(spl_filesystem_object_new_ex(ce));
-       ZVAL_OBJ(return_value, &intern->std);
+       RETVAL_OBJ(&intern->std);
 
        if (ce->constructor->common.scope != spl_ce_SplFileInfo) {
                ZVAL_STRINGL(&arg1, file_path, file_path_len);
@@ -501,7 +501,7 @@ static spl_filesystem_object *spl_filesystem_object_create_type(int num_args, sp
                        }
 
                        intern = spl_filesystem_from_obj(spl_filesystem_object_new_ex(ce));
-                       ZVAL_OBJ(return_value, &intern->std);
+                       RETVAL_OBJ(&intern->std);
 
                        spl_filesystem_object_get_file_name(source);
                        if (ce->constructor->common.scope != spl_ce_SplFileInfo) {
@@ -536,7 +536,7 @@ static spl_filesystem_object *spl_filesystem_object_create_type(int num_args, sp
 
                        intern = spl_filesystem_from_obj(spl_filesystem_object_new_ex(ce));
 
-                       ZVAL_OBJ(return_value, &intern->std);
+                       RETVAL_OBJ(&intern->std);
 
                        spl_filesystem_object_get_file_name(source);
 
@@ -802,8 +802,7 @@ PHP_METHOD(DirectoryIterator, current)
        if (zend_parse_parameters_none() == FAILURE) {
                RETURN_THROWS();
        }
-       ZVAL_OBJ(return_value, Z_OBJ_P(ZEND_THIS));
-       Z_ADDREF_P(return_value);
+       RETURN_OBJ_COPY(Z_OBJ_P(ZEND_THIS));
 }
 /* }}} */
 
@@ -1099,8 +1098,7 @@ PHP_METHOD(FilesystemIterator, current)
                spl_filesystem_object_get_file_name(intern);
                spl_filesystem_object_create_type(0, intern, SPL_FS_INFO, NULL, return_value);
        } else {
-               ZVAL_OBJ(return_value, Z_OBJ_P(ZEND_THIS));
-               Z_ADDREF_P(return_value);
+               RETURN_OBJ_COPY(Z_OBJ_P(ZEND_THIS));
        }
 }
 /* }}} */
@@ -1645,8 +1643,7 @@ zend_object_iterator *spl_filesystem_dir_get_iterator(zend_class_entry *ce, zval
        }
        dir_object = Z_SPLFILESYSTEM_P(object);
        iterator = spl_filesystem_object_to_iterator(dir_object);
-       Z_ADDREF_P(object);
-       ZVAL_OBJ(&iterator->intern.data, Z_OBJ_P(object));
+       ZVAL_OBJ_COPY(&iterator->intern.data, Z_OBJ_P(object));
        iterator->intern.funcs = &spl_filesystem_dir_it_funcs;
        /* ->current must be initialized; rewind doesn't set it and valid
         * doesn't check whether it's set */
@@ -1847,8 +1844,7 @@ zend_object_iterator *spl_filesystem_tree_get_iterator(zend_class_entry *ce, zva
        dir_object = Z_SPLFILESYSTEM_P(object);
        iterator = spl_filesystem_object_to_iterator(dir_object);
 
-       Z_ADDREF_P(object);
-       ZVAL_OBJ(&iterator->intern.data, Z_OBJ_P(object));
+       ZVAL_OBJ_COPY(&iterator->intern.data, Z_OBJ_P(object));
        iterator->intern.funcs = &spl_filesystem_tree_it_funcs;
 
        return &iterator->intern;
index 0462c46aa47cf3ecccdd25f74f5f44c9cd6cb754..adf3d354cccd8b2b1a584425b59fbe9dc69a4136 100644 (file)
@@ -1351,8 +1351,7 @@ zend_object_iterator *spl_dllist_get_iterator(zend_class_entry *ce, zval *object
 
        zend_iterator_init((zend_object_iterator*)iterator);
 
-       Z_ADDREF_P(object);
-       ZVAL_OBJ(&iterator->intern.it.data, Z_OBJ_P(object));
+       ZVAL_OBJ_COPY(&iterator->intern.it.data, Z_OBJ_P(object));
        iterator->intern.it.funcs    = &spl_dllist_it_funcs;
        iterator->intern.ce          = ce;
        iterator->traverse_position  = dllist_object->traverse_position;
index 2b86a85d5155d4c6600a0fba73722222c3fb8b32..63a3ef78fa286e0311992db5b0ec9d7ad2ca6582 100644 (file)
@@ -980,8 +980,7 @@ zend_object_iterator *spl_fixedarray_get_iterator(zend_class_entry *ce, zval *ob
 
        zend_iterator_init((zend_object_iterator*)iterator);
 
-       Z_ADDREF_P(object);
-       ZVAL_OBJ(&iterator->intern.it.data, Z_OBJ_P(object));
+       ZVAL_OBJ_COPY(&iterator->intern.it.data, Z_OBJ_P(object));
        iterator->intern.it.funcs = &spl_fixedarray_it_funcs;
        iterator->intern.ce = ce;
        ZVAL_UNDEF(&iterator->intern.value);
index a6ccc855c0ef915d4c2396c0b7f378987eb5d872..8ddd413cf3d900a86a2de4843ae5893db13064d5 100644 (file)
@@ -459,8 +459,7 @@ static zend_object_iterator *spl_recursive_it_get_iterator(zend_class_entry *ce,
 
        zend_iterator_init((zend_object_iterator*)iterator);
 
-       Z_ADDREF_P(zobject);
-       ZVAL_OBJ(&iterator->intern.data, Z_OBJ_P(zobject));
+       ZVAL_OBJ_COPY(&iterator->intern.data, Z_OBJ_P(zobject));
        iterator->intern.funcs = &spl_recursive_it_iterator_funcs;
        return (zend_object_iterator*)iterator;
 }
index c309d5d545e053cbcc2a2460f931907459bf43d6..3102592238da985829588691939e1cf23634dd36 100644 (file)
@@ -534,8 +534,7 @@ PHP_METHOD(SQLite3, prepare)
        object_init_ex(return_value, php_sqlite3_stmt_entry);
        stmt_obj = Z_SQLITE3_STMT_P(return_value);
        stmt_obj->db_obj = db_obj;
-       Z_ADDREF_P(object);
-       ZVAL_OBJ(&stmt_obj->db_obj_zval, Z_OBJ_P(object));
+       ZVAL_OBJ_COPY(&stmt_obj->db_obj_zval, Z_OBJ_P(object));
 
        errcode = sqlite3_prepare_v2(db_obj->db, ZSTR_VAL(sql), ZSTR_LEN(sql), &(stmt_obj->stmt), NULL);
        if (errcode != SQLITE_OK) {
@@ -590,8 +589,7 @@ PHP_METHOD(SQLite3, query)
        object_init_ex(&stmt, php_sqlite3_stmt_entry);
        stmt_obj = Z_SQLITE3_STMT_P(&stmt);
        stmt_obj->db_obj = db_obj;
-       Z_ADDREF_P(object);
-       ZVAL_OBJ(&stmt_obj->db_obj_zval, Z_OBJ_P(object));
+       ZVAL_OBJ_COPY(&stmt_obj->db_obj_zval, Z_OBJ_P(object));
 
        return_code = sqlite3_prepare_v2(db_obj->db, ZSTR_VAL(sql), ZSTR_LEN(sql), &(stmt_obj->stmt), NULL);
        if (return_code != SQLITE_OK) {
@@ -1879,8 +1877,7 @@ PHP_METHOD(SQLite3Stmt, execute)
                        result->is_prepared_statement = 1;
                        result->db_obj = stmt_obj->db_obj;
                        result->stmt_obj = stmt_obj;
-                       Z_ADDREF_P(object);
-                       ZVAL_OBJ(&result->stmt_obj_zval, Z_OBJ_P(object));
+                       ZVAL_OBJ_COPY(&result->stmt_obj_zval, Z_OBJ_P(object));
 
                        break;
                }
@@ -1929,8 +1926,7 @@ PHP_METHOD(SQLite3Stmt, __construct)
        }
 
        stmt_obj->db_obj = db_obj;
-       Z_ADDREF_P(db_zval);
-       ZVAL_OBJ(&stmt_obj->db_obj_zval, Z_OBJ_P(db_zval));
+       ZVAL_OBJ_COPY(&stmt_obj->db_obj_zval, Z_OBJ_P(db_zval));
 
        errcode = sqlite3_prepare_v2(db_obj->db, ZSTR_VAL(sql), ZSTR_LEN(sql), &(stmt_obj->stmt), NULL);
        if (errcode != SQLITE_OK) {
index d942cfc184ce45901466a4aa153ede95b1d5f5a7..0a8484f99965cb0c2dce247b5eab89f99f5b966f 100644 (file)
@@ -2479,8 +2479,7 @@ static void php_compact_var(HashTable *eg_active_symbol_table, zval *return_valu
                } else if (zend_string_equals_literal(Z_STR_P(entry), "this")) {
                        zend_object *object = zend_get_this_object(EG(current_execute_data));
                        if (object) {
-                               GC_ADDREF(object);
-                               ZVAL_OBJ(&data, object);
+                               ZVAL_OBJ_COPY(&data, object);
                                zend_hash_update(Z_ARRVAL_P(return_value), Z_STR_P(entry), &data);
                        }
                } else {
index 5b4fd8fe54fd7786a3641635089ca2577b8573e2..4d47e67e2c7d15b73d492feedad581da6d019bef 100644 (file)
@@ -1001,8 +1001,7 @@ again:
                                        zval *data;
                                        zend_ulong index;
 
-                                       Z_ADDREF_P(struc);
-                                       ZVAL_OBJ(&obj, Z_OBJ_P(struc));
+                                       ZVAL_OBJ_COPY(&obj, Z_OBJ_P(struc));
                                        if (php_var_serialize_call_magic_serialize(&retval, &obj) == FAILURE) {
                                                if (!EG(exception)) {
                                                        smart_str_appendl(buf, "N;", 2);
@@ -1065,8 +1064,7 @@ again:
                                if (ce != PHP_IC_ENTRY && zend_hash_str_exists(&ce->function_table, "__sleep", sizeof("__sleep")-1)) {
                                        zval retval, tmp;
 
-                                       Z_ADDREF_P(struc);
-                                       ZVAL_OBJ(&tmp, Z_OBJ_P(struc));
+                                       ZVAL_OBJ_COPY(&tmp, Z_OBJ_P(struc));
 
                                        if (php_var_serialize_call_sleep(&retval, &tmp) == FAILURE) {
                                                if (!EG(exception)) {
index 19d7238c46d61a72bf0f906e21d464c49158a943..f626dd1636781a4ffff3d3bc4df1d7fc0c37aff3 100644 (file)
@@ -1085,8 +1085,7 @@ PHP_FUNCTION(xml_set_object)
        parser = Z_XMLPARSER_P(pind);
 
        zval_ptr_dtor(&parser->object);
-       Z_ADDREF_P(mythis);
-       ZVAL_OBJ(&parser->object, Z_OBJ_P(mythis));
+       ZVAL_OBJ_COPY(&parser->object, Z_OBJ_P(mythis));
 
        RETVAL_TRUE;
 }