From: Nikita Popov Date: Wed, 17 Jun 2020 10:34:04 +0000 (+0200) Subject: Add ZVAL_OBJ_COPY macro X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=15846ff115722b2f95d699abf07141d774b0e2cd;p=php Add ZVAL_OBJ_COPY macro For the common ZVAL_OBJ + GC_ADDREF pattern. This mirrors the existing ZVAL_STR_COPY API. --- diff --git a/Zend/zend_API.h b/Zend/zend_API.h index 8ed0e20871..bdcdfaea31 100644 --- a/Zend/zend_API.h +++ b/Zend/zend_API.h @@ -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) diff --git a/Zend/zend_builtin_functions.c b/Zend/zend_builtin_functions.c index 775bab1504..521c2c32de 100644 --- a/Zend/zend_builtin_functions.c +++ b/Zend/zend_builtin_functions.c @@ -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)); diff --git a/Zend/zend_closures.c b/Zend/zend_closures.c index af008c3628..40ebaae0ab 100644 --- a/Zend/zend_closures.c +++ b/Zend/zend_closures.c @@ -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)); } } } diff --git a/Zend/zend_generators.c b/Zend/zend_generators.c index a74ae530b1..803627f9a1 100644 --- a/Zend/zend_generators.c +++ b/Zend/zend_generators.c @@ -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; } diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c index b6a3a891b2..7cee42085b 100644 --- a/Zend/zend_inheritance.c +++ b/Zend/zend_inheritance.c @@ -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, diff --git a/Zend/zend_interfaces.c b/Zend/zend_interfaces.c index 52d3a8ee19..6ac2721f45 100644 --- a/Zend/zend_interfaces.c +++ b/Zend/zend_interfaces.c @@ -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); diff --git a/Zend/zend_types.h b/Zend/zend_types.h index 10a751d1b4..7796979ed8 100644 --- a/Zend/zend_types.h +++ b/Zend/zend_types.h @@ -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); \ diff --git a/Zend/zend_weakrefs.c b/Zend/zend_weakrefs.c index db5ffde2fd..b633a57e9f 100644 --- a/Zend/zend_weakrefs.c +++ b/Zend/zend_weakrefs.c @@ -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) diff --git a/ext/date/php_date.c b/ext/date/php_date.c index a908fed2c7..94e8ab50c7 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -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)); } /* }}} */ diff --git a/ext/dom/dom_iterators.c b/ext/dom/dom_iterators.c index bd83114bd9..c21cc92154 100644 --- a/ext/dom/dom_iterators.c +++ b/ext/dom/dom_iterators.c @@ -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); diff --git a/ext/dom/php_dom.c b/ext/dom/php_dom.c index 9dc50ac287..c90475df1a 100644 --- a/ext/dom/php_dom.c +++ b/ext/dom/php_dom.c @@ -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; } diff --git a/ext/intl/breakiterator/breakiterator_iterators.cpp b/ext/intl/breakiterator/breakiterator_iterators.cpp index c55d9a2d94..7c955a5ecb 100644 --- a/ext/intl/breakiterator/breakiterator_iterators.cpp +++ b/ext/intl/breakiterator/breakiterator_iterators.cpp @@ -110,8 +110,7 @@ U_CFUNC zend_object_iterator *_breakiterator_get_iterator( zoi_with_current *zoi_iter = static_cast(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; diff --git a/ext/pdo/pdo_dbh.c b/ext/pdo/pdo_dbh.c index 769fe25f9d..e1d8c5b92c 100644 --- a/ext/pdo/pdo_dbh.c +++ b/ext/pdo/pdo_dbh.c @@ -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); diff --git a/ext/phar/phar_object.c b/ext/phar/phar_object.c index d273e1d519..881ce96cf6 100644 --- a/ext/phar/phar_object.c +++ b/ext/phar/phar_object.c @@ -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(); } diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index 1f29ff59e4..0a116a0127 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -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(¤t->std); - - ZVAL_OBJ(return_value, (zend_object *) current); + RETURN_OBJ_COPY(¤t->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); } diff --git a/ext/simplexml/simplexml.c b/ext/simplexml/simplexml.c index 85372cb53d..20e20e3a2b 100644 --- a/ext/simplexml/simplexml.c +++ b/ext/simplexml/simplexml.c @@ -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(); diff --git a/ext/soap/soap.c b/ext/soap/soap.c index d2ac5ea662..6356ac7379 100644 --- a/ext/soap/soap.c +++ b/ext/soap/soap.c @@ -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(); } diff --git a/ext/spl/php_spl.c b/ext/spl/php_spl.c index ced58ab20d..e2b361fb5b 100644 --- a/ext/spl/php_spl.c +++ b/ext/spl/php_spl.c @@ -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)); diff --git a/ext/spl/spl_array.c b/ext/spl/spl_array.c index ab263b6195..86a1ad501c 100644 --- a/ext/spl/spl_array.c +++ b/ext/spl/spl_array.c @@ -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)); } } diff --git a/ext/spl/spl_directory.c b/ext/spl/spl_directory.c index df33ae6548..f30d7fcf7f 100644 --- a/ext/spl/spl_directory.c +++ b/ext/spl/spl_directory.c @@ -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; diff --git a/ext/spl/spl_dllist.c b/ext/spl/spl_dllist.c index 0462c46aa4..adf3d354cc 100644 --- a/ext/spl/spl_dllist.c +++ b/ext/spl/spl_dllist.c @@ -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; diff --git a/ext/spl/spl_fixedarray.c b/ext/spl/spl_fixedarray.c index 2b86a85d51..63a3ef78fa 100644 --- a/ext/spl/spl_fixedarray.c +++ b/ext/spl/spl_fixedarray.c @@ -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); diff --git a/ext/spl/spl_iterators.c b/ext/spl/spl_iterators.c index a6ccc855c0..8ddd413cf3 100644 --- a/ext/spl/spl_iterators.c +++ b/ext/spl/spl_iterators.c @@ -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; } diff --git a/ext/sqlite3/sqlite3.c b/ext/sqlite3/sqlite3.c index c309d5d545..3102592238 100644 --- a/ext/sqlite3/sqlite3.c +++ b/ext/sqlite3/sqlite3.c @@ -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) { diff --git a/ext/standard/array.c b/ext/standard/array.c index d942cfc184..0a8484f999 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -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 { diff --git a/ext/standard/var.c b/ext/standard/var.c index 5b4fd8fe54..4d47e67e2c 100644 --- a/ext/standard/var.c +++ b/ext/standard/var.c @@ -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)) { diff --git a/ext/xml/xml.c b/ext/xml/xml.c index 19d7238c46..f626dd1636 100644 --- a/ext/xml/xml.c +++ b/ext/xml/xml.c @@ -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; }