From 68112224221d47169c69ea353beeb73c58ebbe3a Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Mon, 20 Jan 2020 10:34:17 +0100 Subject: [PATCH] Eliminate uses of ZVAL_ZVAL and friends Instead add RETURN_COPY(_VALUE) macros will the expected behavior. RETURN_ZVAL doesn't make any sense since PHP 7, but has stuck around, probably because the alternative was to write directly to the return_value variable. --- Zend/zend_API.h | 4 ++++ Zend/zend_closures.c | 2 +- Zend/zend_interfaces.c | 2 +- ext/oci8/oci8_interface.c | 4 +--- ext/pcntl/pcntl.c | 2 +- ext/pgsql/pgsql.c | 4 ++-- ext/sockets/sockets.c | 4 ++-- ext/spl/spl_directory.c | 10 +++------- ext/spl/spl_iterators.c | 11 ++--------- ext/standard/array.c | 6 +++--- 10 files changed, 20 insertions(+), 29 deletions(-) diff --git a/Zend/zend_API.h b/Zend/zend_API.h index 5b100a713b..70879fe2a8 100644 --- a/Zend/zend_API.h +++ b/Zend/zend_API.h @@ -652,6 +652,8 @@ 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_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) #define RETVAL_FALSE ZVAL_FALSE(return_value) #define RETVAL_TRUE ZVAL_TRUE(return_value) @@ -671,6 +673,8 @@ 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_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) #define RETURN_FALSE do { RETVAL_FALSE; return; } while (0) #define RETURN_TRUE do { RETVAL_TRUE; return; } while (0) diff --git a/Zend/zend_closures.c b/Zend/zend_closures.c index 717186295e..06a54f943c 100644 --- a/Zend/zend_closures.c +++ b/Zend/zend_closures.c @@ -338,7 +338,7 @@ ZEND_METHOD(Closure, fromCallable) if (Z_TYPE_P(callable) == IS_OBJECT && instanceof_function(Z_OBJCE_P(callable), zend_ce_closure)) { /* It's already a closure */ - RETURN_ZVAL(callable, 1, 0); + RETURN_COPY(callable); } /* create closure as if it were called from parent scope */ diff --git a/Zend/zend_interfaces.c b/Zend/zend_interfaces.c index d2b96e6bf3..b6fdec95be 100644 --- a/Zend/zend_interfaces.c +++ b/Zend/zend_interfaces.c @@ -193,7 +193,7 @@ ZEND_API void zend_user_it_get_current_key(zend_object_iterator *_iter, zval *ke zend_call_method_with_0_params(Z_OBJ_P(object), iter->ce, &iter->ce->iterator_funcs_ptr->zf_key, "key", &retval); if (Z_TYPE(retval) != IS_UNDEF) { - ZVAL_ZVAL(key, &retval, 1, 1); + ZVAL_COPY_VALUE(key, &retval); } else { if (!EG(exception)) { zend_error(E_WARNING, "Nothing returned from %s::key()", ZSTR_VAL(iter->ce->name)); diff --git a/ext/oci8/oci8_interface.c b/ext/oci8/oci8_interface.c index b48294e3a5..299788cab6 100644 --- a/ext/oci8/oci8_interface.c +++ b/ext/oci8/oci8_interface.c @@ -2382,11 +2382,9 @@ PHP_FUNCTION(oci_collection_element_get) PHP_OCI_ZVAL_TO_COLLECTION(tmp, collection); - if (php_oci_collection_element_get(collection, element_index, &value)) { + if (php_oci_collection_element_get(collection, element_index, return_value)) { RETURN_FALSE; } - - RETURN_ZVAL(&value, 1, 1); } /* }}} */ diff --git a/ext/pcntl/pcntl.c b/ext/pcntl/pcntl.c index 17f49ce243..0cf698c9a8 100644 --- a/ext/pcntl/pcntl.c +++ b/ext/pcntl/pcntl.c @@ -1028,7 +1028,7 @@ PHP_FUNCTION(pcntl_signal_get_handler) } if ((prev_handle = zend_hash_index_find(&PCNTL_G(php_signal_table), signo)) != NULL) { - RETURN_ZVAL(prev_handle, 1, 0); + RETURN_COPY(prev_handle); } else { RETURN_LONG((zend_long)SIG_DFL); } diff --git a/ext/pgsql/pgsql.c b/ext/pgsql/pgsql.c index c92a1ffaa5..9450bf0f61 100644 --- a/ext/pgsql/pgsql.c +++ b/ext/pgsql/pgsql.c @@ -2337,14 +2337,14 @@ PHP_FUNCTION(pg_last_notice) if ((notice = zend_hash_get_current_data(Z_ARRVAL_P(notices))) == NULL) { RETURN_EMPTY_STRING(); } - RETURN_ZVAL(notice, 1, 0); + RETURN_COPY(notice); } else { RETURN_EMPTY_STRING(); } break; case PGSQL_NOTICE_ALL: if (notices) { - RETURN_ZVAL(notices, 1, 0); + RETURN_COPY(notices); } else { array_init(return_value); return; diff --git a/ext/sockets/sockets.c b/ext/sockets/sockets.c index ea76fa9100..b4f5da6b01 100644 --- a/ext/sockets/sockets.c +++ b/ext/sockets/sockets.c @@ -2278,7 +2278,7 @@ PHP_FUNCTION(socket_export_stream) /* Either we already exported a stream or the socket came from an import, * just return the existing stream */ if (!Z_ISUNDEF(socket->zstream)) { - RETURN_ZVAL(&socket->zstream, 1, 0); + RETURN_COPY(&socket->zstream); } /* Determine if socket is using a protocol with one of the default registered @@ -2350,7 +2350,7 @@ PHP_FUNCTION(socket_export_stream) php_stream_to_zval(stream, &socket->zstream); - RETURN_ZVAL(&socket->zstream, 1, 0); + RETURN_COPY(&socket->zstream); } /* }}} */ diff --git a/ext/spl/spl_directory.c b/ext/spl/spl_directory.c index 08aa5558b0..18b17ea0f2 100644 --- a/ext/spl/spl_directory.c +++ b/ext/spl/spl_directory.c @@ -2053,7 +2053,7 @@ static int spl_filesystem_file_call(spl_filesystem_object *intern, zend_function { zend_fcall_info fci; zend_fcall_info_cache fcic; - zval *zresource_ptr = &intern->u.file.zresource, retval; + zval *zresource_ptr = &intern->u.file.zresource; int result; int num_args = pass_num_args + (arg2 ? 2 : 1); @@ -2070,11 +2070,9 @@ static int spl_filesystem_file_call(spl_filesystem_object *intern, zend_function WRONG_PARAM_COUNT_WITH_RETVAL(FAILURE); } - ZVAL_UNDEF(&retval); - fci.size = sizeof(fci); fci.object = NULL; - fci.retval = &retval; + fci.retval = return_value; fci.param_count = num_args; fci.params = params; fci.no_separation = 1; @@ -2086,10 +2084,8 @@ static int spl_filesystem_file_call(spl_filesystem_object *intern, zend_function result = zend_call_function(&fci, &fcic); - if (result == FAILURE || Z_ISUNDEF(retval)) { + if (result == FAILURE || Z_ISUNDEF_P(return_value)) { RETVAL_FALSE; - } else { - ZVAL_ZVAL(return_value, &retval, 0, 0); } efree(params); diff --git a/ext/spl/spl_iterators.c b/ext/spl/spl_iterators.c index 5e021ce493..666f3ebf64 100644 --- a/ext/spl/spl_iterators.c +++ b/ext/spl/spl_iterators.c @@ -1271,8 +1271,7 @@ SPL_METHOD(RecursiveTreeIterator, key) } if (object->flags & RTIT_BYPASS_KEY) { - RETVAL_ZVAL(&key, 1, 1); - return; + RETURN_COPY_VALUE(&key); } if (Z_TYPE(key) != IS_STRING) { @@ -1842,7 +1841,6 @@ SPL_METHOD(RecursiveFilterIterator, __construct) SPL_METHOD(RecursiveFilterIterator, hasChildren) { spl_dual_it_object *intern; - zval retval; if (zend_parse_parameters_none() == FAILURE) { RETURN_THROWS(); @@ -1850,12 +1848,7 @@ SPL_METHOD(RecursiveFilterIterator, hasChildren) SPL_FETCH_AND_CHECK_DUAL_IT(intern, ZEND_THIS); - zend_call_method_with_0_params(Z_OBJ(intern->inner.zobject), intern->inner.ce, NULL, "haschildren", &retval); - if (Z_TYPE(retval) != IS_UNDEF) { - RETURN_ZVAL(&retval, 0, 1); - } else { - RETURN_FALSE; - } + zend_call_method_with_0_params(Z_OBJ(intern->inner.zobject), intern->inner.ce, NULL, "haschildren", return_value); } /* }}} */ /* {{{ proto RecursiveFilterIterator RecursiveFilterIterator::getChildren() diff --git a/ext/standard/array.c b/ext/standard/array.c index e8f06cf99d..91e3c388d4 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -3970,7 +3970,7 @@ PHP_FUNCTION(array_keys) /* Base case: empty input */ if (!elem_count) { - RETURN_ZVAL(input, 1, 0); + RETURN_COPY(input); } /* Initialize return array */ @@ -4086,7 +4086,7 @@ PHP_FUNCTION(array_values) /* Return vector-like packed arrays as-is */ if (HT_IS_PACKED(arrval) && HT_IS_WITHOUT_HOLES(arrval) && arrval->nNextFreeElement == arrlen) { - RETURN_ZVAL(input, 1, 0); + RETURN_COPY(input); } /* Initialize return array */ @@ -6064,7 +6064,7 @@ PHP_FUNCTION(array_reduce) } ZEND_HASH_FOREACH_END(); zend_release_fcall_info_cache(&fci_cache); - RETVAL_ZVAL(&result, 1, 1); + RETURN_COPY_VALUE(&result); } /* }}} */ -- 2.40.0