Add RETURN/RETVAL_COPY_DEREF() macros

These were missing from the set...

I think quite a few of these usages don't actually need the DEREF,
but I've just kept things as is for now.
This commit is contained in:
Nikita Popov 2021-07-22 09:38:05 +02:00
parent 23b1c4a982
commit 6d505d4445
17 changed files with 62 additions and 84 deletions

View File

@ -803,6 +803,7 @@ END_EXTERN_C()
#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_COPY_DEREF(zv) ZVAL_COPY_DEREF(return_value, zv)
#define RETVAL_ZVAL(zv, copy, dtor) ZVAL_ZVAL(return_value, zv, copy, dtor)
#define RETVAL_FALSE ZVAL_FALSE(return_value)
#define RETVAL_TRUE ZVAL_TRUE(return_value)
@ -828,6 +829,7 @@ END_EXTERN_C()
#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_COPY_DEREF(zv) do { RETVAL_COPY_DEREF(zv); return; } while (0)
#define RETURN_ZVAL(zv, copy, dtor) do { RETVAL_ZVAL(zv, copy, dtor); return; } while (0)
#define RETURN_FALSE do { RETVAL_FALSE; return; } while (0)
#define RETURN_TRUE do { RETVAL_TRUE; return; } while (0)

View File

@ -206,7 +206,7 @@ ZEND_FUNCTION(func_get_arg)
arg = ZEND_CALL_ARG(ex, requested_offset + 1);
}
if (EXPECTED(!Z_ISUNDEF_P(arg))) {
ZVAL_COPY_DEREF(return_value, arg);
RETURN_COPY_DEREF(arg);
}
}
/* }}} */

View File

@ -860,9 +860,7 @@ ZEND_METHOD(Generator, current)
root = zend_generator_get_current(generator);
if (EXPECTED(generator->execute_data != NULL && Z_TYPE(root->value) != IS_UNDEF)) {
zval *value = &root->value;
ZVAL_COPY_DEREF(return_value, value);
RETURN_COPY_DEREF(&root->value);
}
}
/* }}} */
@ -880,9 +878,7 @@ ZEND_METHOD(Generator, key)
root = zend_generator_get_current(generator);
if (EXPECTED(generator->execute_data != NULL && Z_TYPE(root->key) != IS_UNDEF)) {
zval *key = &root->key;
ZVAL_COPY_DEREF(return_value, key);
RETURN_COPY_DEREF(&root->key);
}
}
/* }}} */
@ -931,9 +927,7 @@ ZEND_METHOD(Generator, send)
root = zend_generator_get_current(generator);
if (EXPECTED(generator->execute_data)) {
zval *value = &root->value;
ZVAL_COPY_DEREF(return_value, value);
RETURN_COPY_DEREF(&root->value);
}
}
/* }}} */
@ -963,9 +957,7 @@ ZEND_METHOD(Generator, throw)
root = zend_generator_get_current(generator);
if (generator->execute_data) {
zval *value = &root->value;
ZVAL_COPY_DEREF(return_value, value);
RETURN_COPY_DEREF(&root->value);
}
} else {
/* If the generator is already closed throw the exception in the

View File

@ -507,7 +507,7 @@ ZEND_METHOD(InternalIterator, current) {
zval *data = intern->iter->funcs->get_current_data(intern->iter);
if (data) {
ZVAL_COPY_DEREF(return_value, data);
RETURN_COPY_DEREF(data);
}
}

View File

@ -71,7 +71,7 @@ static void curlfile_get_property(char *name, size_t name_len, INTERNAL_FUNCTION
ZEND_PARSE_PARAMETERS_NONE();
res = zend_read_property(curl_CURLFile_class, Z_OBJ_P(ZEND_THIS), name, name_len, 1, &rv);
ZVAL_COPY_DEREF(return_value, res);
RETURN_COPY_DEREF(res);
}
static void curlfile_set_property(char *name, size_t name_len, INTERNAL_FUNCTION_PARAMETERS)

View File

@ -281,8 +281,7 @@ U_CFUNC PHP_METHOD(IntlPartsIterator, getBreakIterator)
INTLITERATOR_METHOD_FETCH_OBJECT;
zval *biter_zval = &ii->iterator->data;
ZVAL_COPY_DEREF(return_value, biter_zval);
RETURN_COPY_DEREF(return_value, &it->iterator->data);
}
U_CFUNC void breakiterator_register_IntlPartsIterator_class(void)

View File

@ -216,7 +216,7 @@ PHP_METHOD(IntlIterator, current)
INTLITERATOR_METHOD_FETCH_OBJECT;
data = ii->iterator->funcs->get_current_data(ii->iterator);
if (data) {
ZVAL_COPY_DEREF(return_value, data);
RETURN_COPY_DEREF(data);
}
}

View File

@ -3775,7 +3775,7 @@ ZEND_METHOD(ReflectionClassConstant, getName)
RETURN_THROWS();
}
ZVAL_COPY_DEREF(return_value, name);
RETURN_COPY_DEREF(name);
}
/* }}} */
@ -4072,17 +4072,16 @@ ZEND_METHOD(ReflectionClass, getStaticPropertyValue)
prop = zend_std_get_static_property(ce, name, BP_VAR_IS);
EG(fake_scope) = old_scope;
if (!prop) {
if (def_value) {
ZVAL_COPY(return_value, def_value);
} else {
zend_throw_exception_ex(reflection_exception_ptr, 0,
"Property %s::$%s does not exist", ZSTR_VAL(ce->name), ZSTR_VAL(name));
}
return;
} else {
ZVAL_COPY_DEREF(return_value, prop);
if (prop) {
RETURN_COPY_DEREF(prop);
}
if (def_value) {
RETURN_COPY(def_value);
}
zend_throw_exception_ex(reflection_exception_ptr, 0,
"Property %s::$%s does not exist", ZSTR_VAL(ce->name), ZSTR_VAL(name));
}
/* }}} */
@ -5568,7 +5567,7 @@ ZEND_METHOD(ReflectionProperty, getValue)
if (prop_get_flags(ref) & ZEND_ACC_STATIC) {
member_p = zend_read_static_property_ex(intern->ce, ref->unmangled_name, 0);
if (member_p) {
ZVAL_COPY_DEREF(return_value, member_p);
RETURN_COPY_DEREF(member_p);
}
} else {
zval rv;
@ -5586,12 +5585,12 @@ ZEND_METHOD(ReflectionProperty, getValue)
member_p = zend_read_property_ex(intern->ce, Z_OBJ_P(object), ref->unmangled_name, 0, &rv);
if (member_p != &rv) {
ZVAL_COPY_DEREF(return_value, member_p);
RETURN_COPY_DEREF(member_p);
} else {
if (Z_ISREF_P(member_p)) {
zend_unwrap_reference(member_p);
}
ZVAL_COPY_VALUE(return_value, member_p);
RETURN_COPY_VALUE(member_p);
}
}
}

View File

@ -1998,7 +1998,6 @@ PHP_METHOD(SimpleXMLElement, valid)
PHP_METHOD(SimpleXMLElement, current)
{
php_sxe_object *sxe = Z_SXEOBJ_P(ZEND_THIS);
zval *data;
if (zend_parse_parameters_none() == FAILURE) {
RETURN_THROWS();
@ -2009,8 +2008,7 @@ PHP_METHOD(SimpleXMLElement, current)
RETURN_THROWS();
}
data = &sxe->iter.data;
ZVAL_COPY_DEREF(return_value, data);
RETURN_COPY_DEREF(&sxe->iter.data);
}
/* }}} */
@ -2083,7 +2081,6 @@ PHP_METHOD(SimpleXMLElement, hasChildren)
PHP_METHOD(SimpleXMLElement, getChildren)
{
php_sxe_object *sxe = Z_SXEOBJ_P(ZEND_THIS);
zval *data;
if (zend_parse_parameters_none() == FAILURE) {
RETURN_THROWS();
@ -2093,8 +2090,7 @@ PHP_METHOD(SimpleXMLElement, getChildren)
return; /* return NULL */
}
data = &sxe->iter.data;
ZVAL_COPY_DEREF(return_value, data);
RETURN_COPY_DEREF(&sxe->iter.data);
}
static zend_object_handlers sxe_object_handlers;

View File

@ -665,7 +665,7 @@ PHP_METHOD(ArrayObject, offsetGet)
}
value = spl_array_read_dimension_ex(0, Z_OBJ_P(ZEND_THIS), index, BP_VAR_R, return_value);
if (value != return_value) {
ZVAL_COPY_DEREF(return_value, value);
RETURN_COPY_DEREF(value);
}
} /* }}} */
@ -1465,7 +1465,7 @@ PHP_METHOD(ArrayIterator, current)
return;
}
}
ZVAL_COPY_DEREF(return_value, entry);
RETURN_COPY_DEREF(entry);
}
/* }}} */

View File

@ -575,7 +575,7 @@ PHP_METHOD(SplDoublyLinkedList, top)
RETURN_THROWS();
}
ZVAL_COPY_DEREF(return_value, value);
RETURN_COPY_DEREF(value);
}
/* }}} */
@ -597,7 +597,7 @@ PHP_METHOD(SplDoublyLinkedList, bottom)
RETURN_THROWS();
}
ZVAL_COPY_DEREF(return_value, value);
RETURN_COPY_DEREF(value);
}
/* }}} */
@ -708,7 +708,7 @@ PHP_METHOD(SplDoublyLinkedList, offsetGet)
RETURN_THROWS();
}
ZVAL_COPY_DEREF(return_value, &element->data);
RETURN_COPY_DEREF(&element->data);
} /* }}} */
/* {{{ Sets the value at the specified $index to $newval. */
@ -1001,7 +1001,7 @@ PHP_METHOD(SplDoublyLinkedList, current)
if (element == NULL || Z_ISUNDEF(element->data)) {
RETURN_NULL();
} else {
ZVAL_COPY_DEREF(return_value, &element->data);
RETURN_COPY_DEREF(&element->data);
}
}
/* }}} */

View File

@ -742,7 +742,7 @@ PHP_METHOD(SplFixedArray, offsetGet)
value = spl_fixedarray_object_read_dimension_helper(intern, zindex);
if (value) {
ZVAL_COPY_DEREF(return_value, value);
RETURN_COPY_DEREF(value);
} else {
RETURN_NULL();
}

View File

@ -860,7 +860,7 @@ PHP_METHOD(SplHeap, top)
RETURN_THROWS();
}
ZVAL_COPY_DEREF(return_value, value);
RETURN_COPY_DEREF(value);
}
/* }}} */
@ -1034,7 +1034,7 @@ PHP_METHOD(SplHeap, current)
RETURN_NULL();
} else {
zval *element = spl_heap_elem(intern->heap, 0);
ZVAL_COPY_DEREF(return_value, element);
RETURN_COPY_DEREF(element);
}
}
/* }}} */

View File

@ -687,7 +687,7 @@ PHP_METHOD(RecursiveIteratorIterator, current)
data = iterator->funcs->get_current_data(iterator);
if (data) {
ZVAL_COPY_DEREF(return_value, data);
RETURN_COPY_DEREF(data);
}
} /* }}} */
@ -739,7 +739,7 @@ PHP_METHOD(RecursiveIteratorIterator, getSubIterator)
}
value = &object->iterators[level].zobject;
ZVAL_COPY_DEREF(return_value, value);
RETURN_COPY_DEREF(value);
} /* }}} */
/* {{{ The current active sub iterator */
@ -754,7 +754,7 @@ PHP_METHOD(RecursiveIteratorIterator, getInnerIterator)
SPL_FETCH_SUB_ELEMENT_ADDR(zobject, object, zobject);
ZVAL_COPY_DEREF(return_value, zobject);
RETURN_COPY_DEREF(zobject);
} /* }}} */
/* {{{ Called when iteration begins (after first rewind() call) */
@ -1172,8 +1172,7 @@ PHP_METHOD(RecursiveTreeIterator, current)
SPL_FETCH_SUB_ITERATOR(iterator, object);
data = iterator->funcs->get_current_data(iterator);
if (data) {
ZVAL_COPY_DEREF(return_value, data);
return;
RETURN_COPY_DEREF(data);
} else {
RETURN_NULL();
}
@ -1461,8 +1460,7 @@ PHP_METHOD(IteratorIterator, getInnerIterator)
if (!Z_ISUNDEF(intern->inner.zobject)) {
zval *value = &intern->inner.zobject;
ZVAL_COPY_DEREF(return_value, value);
RETURN_COPY_DEREF(value);
} else {
RETURN_NULL();
}
@ -1589,9 +1587,7 @@ PHP_METHOD(IteratorIterator, key)
SPL_FETCH_AND_CHECK_DUAL_IT(intern, ZEND_THIS);
if (Z_TYPE(intern->current.key) != IS_UNDEF) {
zval *value = &intern->current.key;
ZVAL_COPY_DEREF(return_value, value);
RETURN_COPY_DEREF(&intern->current.key);
} else {
RETURN_NULL();
}
@ -1609,9 +1605,7 @@ PHP_METHOD(IteratorIterator, current)
SPL_FETCH_AND_CHECK_DUAL_IT(intern, ZEND_THIS);
if (Z_TYPE(intern->current.data) != IS_UNDEF) {
zval *value = &intern->current.data;
ZVAL_COPY_DEREF(return_value, value);
RETURN_COPY_DEREF(&intern->current.data);
} else {
RETURN_NULL();
}
@ -2526,7 +2520,7 @@ PHP_METHOD(CachingIterator, offsetGet)
return;
}
ZVAL_COPY_DEREF(return_value, value);
RETURN_COPY_DEREF(value);
}
/* }}} */
@ -2695,7 +2689,7 @@ PHP_METHOD(RecursiveCachingIterator, getChildren)
if (Z_TYPE(intern->u.caching.zchildren) != IS_UNDEF) {
zval *value = &intern->u.caching.zchildren;
ZVAL_COPY_DEREF(return_value, value);
RETURN_COPY_DEREF(value);
} else {
RETURN_NULL();
}
@ -2766,7 +2760,7 @@ PHP_METHOD(NoRewindIterator, current)
SPL_FETCH_AND_CHECK_DUAL_IT(intern, ZEND_THIS);
data = intern->inner.iterator->funcs->get_current_data(intern->inner.iterator);
if (data) {
ZVAL_COPY_DEREF(return_value, data);
RETURN_COPY_DEREF(data);
}
} /* }}} */
@ -2952,9 +2946,7 @@ PHP_METHOD(AppendIterator, current)
spl_dual_it_fetch(intern, 1);
if (Z_TYPE(intern->current.data) != IS_UNDEF) {
zval *value = &intern->current.data;
ZVAL_COPY_DEREF(return_value, value);
RETURN_COPY_DEREF(&intern->current.data);
} else {
RETURN_NULL();
}
@ -3033,7 +3025,7 @@ PHP_METHOD(AppendIterator, getArrayIterator)
SPL_FETCH_AND_CHECK_DUAL_IT(intern, ZEND_THIS);
value = &intern->u.append.zarrayit;
ZVAL_COPY_DEREF(return_value, value);
RETURN_COPY_DEREF(value);
} /* }}} */
PHPAPI int spl_iterator_apply(zval *obj, spl_iterator_apply_func_t apply_func, void *puser)

View File

@ -411,9 +411,7 @@ PHP_METHOD(SplObjectStorage, offsetGet)
if (!element) {
zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0, "Object not found");
} else {
zval *value = &element->inf;
ZVAL_COPY_DEREF(return_value, value);
RETURN_COPY_DEREF(&element->inf);
}
} /* }}} */

View File

@ -1082,7 +1082,7 @@ PHP_FUNCTION(end)
entry = Z_INDIRECT_P(entry);
}
ZVAL_COPY_DEREF(return_value, entry);
RETURN_COPY_DEREF(entry);
}
}
/* }}} */
@ -1109,7 +1109,7 @@ PHP_FUNCTION(prev)
entry = Z_INDIRECT_P(entry);
}
ZVAL_COPY_DEREF(return_value, entry);
RETURN_COPY_DEREF(entry);
}
}
/* }}} */
@ -1136,7 +1136,7 @@ PHP_FUNCTION(next)
entry = Z_INDIRECT_P(entry);
}
ZVAL_COPY_DEREF(return_value, entry);
RETURN_COPY_DEREF(entry);
}
}
/* }}} */
@ -1163,7 +1163,7 @@ PHP_FUNCTION(reset)
entry = Z_INDIRECT_P(entry);
}
ZVAL_COPY_DEREF(return_value, entry);
RETURN_COPY_DEREF(entry);
}
}
/* }}} */
@ -1187,7 +1187,7 @@ PHP_FUNCTION(current)
entry = Z_INDIRECT_P(entry);
}
ZVAL_COPY_DEREF(return_value, entry);
RETURN_COPY_DEREF(entry);
}
/* }}} */
@ -1226,7 +1226,7 @@ PHP_FUNCTION(min)
} else {
zval *result = zend_hash_minmax(Z_ARRVAL(args[0]), php_array_data_compare_unstable, 0);
if (result) {
ZVAL_COPY_DEREF(return_value, result);
RETURN_COPY_DEREF(result);
} else {
zend_argument_value_error(1, "must contain at least one element");
RETURN_THROWS();
@ -1246,7 +1246,7 @@ PHP_FUNCTION(min)
}
}
ZVAL_COPY(return_value, min);
RETURN_COPY(min);
}
}
/* }}} */
@ -1272,7 +1272,7 @@ PHP_FUNCTION(max)
} else {
zval *result = zend_hash_minmax(Z_ARRVAL(args[0]), php_array_data_compare_unstable, 1);
if (result) {
ZVAL_COPY_DEREF(return_value, result);
RETURN_COPY_DEREF(result);
} else {
zend_argument_value_error(1, "must contain at least one element");
RETURN_THROWS();
@ -1292,7 +1292,7 @@ PHP_FUNCTION(max)
}
}
ZVAL_COPY(return_value, max);
RETURN_COPY(max);
}
}
/* }}} */
@ -3137,7 +3137,7 @@ PHP_FUNCTION(array_pop)
break;
}
}
ZVAL_COPY_DEREF(return_value, val);
RETVAL_COPY_DEREF(val);
if (!p->key && (zend_long)p->h == (Z_ARRVAL_P(stack)->nNextFreeElement - 1)) {
Z_ARRVAL_P(stack)->nNextFreeElement = Z_ARRVAL_P(stack)->nNextFreeElement - 1;
@ -3178,7 +3178,7 @@ PHP_FUNCTION(array_shift)
}
idx++;
}
ZVAL_COPY_DEREF(return_value, val);
RETVAL_COPY_DEREF(val);
/* Delete the first value */
zend_hash_del_bucket(Z_ARRVAL_P(stack), p);

View File

@ -1738,13 +1738,13 @@ PHP_FUNCTION(pathinfo)
}
if (opt == PHP_PATHINFO_ALL) {
ZVAL_COPY_VALUE(return_value, &tmp);
RETURN_COPY_VALUE(&tmp);
} else {
zval *element;
if ((element = zend_hash_get_current_data(Z_ARRVAL(tmp))) != NULL) {
ZVAL_COPY_DEREF(return_value, element);
RETVAL_COPY_DEREF(element);
} else {
ZVAL_EMPTY_STRING(return_value);
RETVAL_EMPTY_STRING();
}
zval_ptr_dtor(&tmp);
}