Switch from ZVAL_ZVAL() to simpler macros where possible (it makes sense to review remaining places)
zval_dtor(arg);
ZVAL_NULL(arg);
if (!zend_make_printable_zval(z, arg)) {
- ZVAL_ZVAL(arg, z, 1, 1);
+ ZVAL_COPY_VALUE(arg, z);
}
*dest = Z_STR_P(arg);
return 1;
zval *__z = (z); \
zval *__zv = (zv); \
if (EXPECTED(!Z_ISREF_P(__zv))) { \
- ZVAL_COPY_VALUE(__z, __zv); \
- } else { \
- ZVAL_COPY_VALUE(__z, \
- Z_REFVAL_P(__zv)); \
- } \
- if (copy) { \
- zval_opt_copy_ctor(__z); \
- } \
- if (dtor) { \
- if (!copy) { \
- ZVAL_NULL(__zv); \
+ if (copy && !dtor) { \
+ ZVAL_COPY(__z, __zv); \
+ } else { \
+ ZVAL_COPY_VALUE(__z, __zv); \
+ } \
+ } else { \
+ ZVAL_COPY(__z, Z_REFVAL_P(__zv)); \
+ if (dtor || !copy) { \
+ zval_ptr_dtor(__zv); \
} \
- zval_ptr_dtor(__zv); \
- } \
+ } \
} while (0)
#define RETVAL_BOOL(b) ZVAL_BOOL(return_value, b)
#define RETURN_FALSE { RETVAL_FALSE; return; }
#define RETURN_TRUE { RETVAL_TRUE; return; }
-#define RETVAL_ZVAL_FAST(z) do { \
- zval *_z = (z); \
- if (Z_ISREF_P(_z)) { \
- RETVAL_ZVAL(_z, 1, 0); \
- } else { \
- zval_ptr_dtor(return_value); \
- ZVAL_COPY(return_value, _z); \
- } \
-} while (0)
-
-#define RETURN_ZVAL_FAST(z) { RETVAL_ZVAL_FAST(z); return; }
-
#define HASH_OF(p) (Z_TYPE_P(p)==IS_ARRAY ? Z_ARRVAL_P(p) : ((Z_TYPE_P(p)==IS_OBJECT ? Z_OBJ_HT_P(p)->get_properties((p)) : NULL)))
#define ZVAL_IS_NULL(z) (Z_TYPE_P(z) == IS_NULL)
zval tmp;
zend_fetch_dimension_by_zval(&tmp, &op1, &op2);
- ZVAL_ZVAL(result, &tmp, 1, 1);
+ if (UNEXPECTED(Z_ISREF(tmp))) {
+ ZVAL_DUP(result, Z_REFVAL(tmp));
+ } else {
+ ZVAL_DUP(result, &tmp);
+ }
+ zval_ptr_dtor(&tmp);
zval_dtor(&op1);
zval_dtor(&op2);
}
} else {
arg = ZEND_CALL_ARG(ex, requested_offset + 1);
}
- RETURN_ZVAL_FAST(arg);
+ RETURN_ZVAL(arg, 1, 0);
}
/* }}} */
}
if (Z_TYPE(EG(user_error_handler)) != IS_UNDEF) {
- RETVAL_ZVAL(&EG(user_error_handler), 1, 0);
+ ZVAL_COPY(return_value, &EG(user_error_handler));
zend_stack_push(&EG(user_error_handlers_error_reporting), &EG(user_error_handler_error_reporting));
zend_stack_push(&EG(user_error_handlers), &EG(user_error_handler));
return;
}
- ZVAL_DUP(&EG(user_error_handler), error_handler);
+ ZVAL_COPY(&EG(user_error_handler), error_handler);
EG(user_error_handler_error_reporting) = (int)error_type;
}
/* }}} */
}
if (Z_TYPE(EG(user_exception_handler)) != IS_UNDEF) {
- RETVAL_ZVAL(&EG(user_exception_handler), 1, 0);
+ ZVAL_COPY(return_value, &EG(user_exception_handler));
zend_stack_push(&EG(user_exception_handlers), &EG(user_exception_handler));
}
return;
}
- ZVAL_DUP(&EG(user_exception_handler), exception_handler);
+ ZVAL_COPY(&EG(user_exception_handler), exception_handler);
}
/* }}} */
root = zend_generator_get_current(generator);
if (Z_TYPE(root->value) != IS_UNDEF) {
- RETURN_ZVAL_FAST(&root->value);
+ RETURN_ZVAL(&root->value, 1, 0);
}
}
/* }}} */
root = zend_generator_get_current(generator);
if (Z_TYPE(root->key) != IS_UNDEF) {
- RETURN_ZVAL_FAST(&root->key);
+ RETURN_ZVAL(&root->key, 1, 0);
}
}
/* }}} */
root = zend_generator_get_current(generator);
if (Z_TYPE(root->value) != IS_UNDEF) {
- RETURN_ZVAL_FAST(&root->value);
+ RETURN_ZVAL(&root->value, 1, 0);
}
}
/* }}} */
root = zend_generator_get_current(generator);
if (Z_TYPE(root->value) != IS_UNDEF) {
- RETURN_ZVAL_FAST(&root->value);
+ RETURN_ZVAL(&root->value, 1, 0);
}
} else {
/* If the generator is already closed throw the exception in the
zval *timezone_object = NULL;
char *time_str = NULL;
size_t time_str_len = 0;
- zval datetime_object;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "|sO!", &time_str, &time_str_len, &timezone_object, date_ce_timezone) == FAILURE) {
RETURN_FALSE;
}
- php_date_instantiate(date_ce_date, &datetime_object);
- if (!php_date_initialize(Z_PHPDATE_P(&datetime_object), time_str, time_str_len, NULL, timezone_object, 0)) {
- zval_dtor(&datetime_object);
+ php_date_instantiate(date_ce_date, return_value);
+ if (!php_date_initialize(Z_PHPDATE_P(return_value), time_str, time_str_len, NULL, timezone_object, 0)) {
+ zval_ptr_dtor(return_value);
RETURN_FALSE;
}
- RETVAL_ZVAL(&datetime_object, 0, 0);
}
/* }}} */
zval *timezone_object = NULL;
char *time_str = NULL;
size_t time_str_len = 0;
- zval datetime_object;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "|sO!", &time_str, &time_str_len, &timezone_object, date_ce_timezone) == FAILURE) {
RETURN_FALSE;
}
- php_date_instantiate(date_ce_immutable, &datetime_object);
- if (!php_date_initialize(Z_PHPDATE_P(&datetime_object), time_str, time_str_len, NULL, timezone_object, 0)) {
- zval_dtor(&datetime_object);
+ php_date_instantiate(date_ce_immutable, return_value);
+ if (!php_date_initialize(Z_PHPDATE_P(return_value), time_str, time_str_len, NULL, timezone_object, 0)) {
+ zval_ptr_dtor(return_value);
RETURN_FALSE;
}
- RETVAL_ZVAL(&datetime_object, 0, 0);
}
/* }}} */
zval *timezone_object = NULL;
char *time_str = NULL, *format_str = NULL;
size_t time_str_len = 0, format_str_len = 0;
- zval datetime_object;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss|O!", &format_str, &format_str_len, &time_str, &time_str_len, &timezone_object, date_ce_timezone) == FAILURE) {
RETURN_FALSE;
}
- php_date_instantiate(date_ce_date, &datetime_object);
- if (!php_date_initialize(Z_PHPDATE_P(&datetime_object), time_str, time_str_len, format_str, timezone_object, 0)) {
- zval_dtor(&datetime_object);
+ php_date_instantiate(date_ce_date, return_value);
+ if (!php_date_initialize(Z_PHPDATE_P(return_value), time_str, time_str_len, format_str, timezone_object, 0)) {
+ zval_ptr_dtor(return_value);
RETURN_FALSE;
}
- RETVAL_ZVAL(&datetime_object, 0, 0);
}
/* }}} */
zval *timezone_object = NULL;
char *time_str = NULL, *format_str = NULL;
size_t time_str_len = 0, format_str_len = 0;
- zval datetime_object;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss|O!", &format_str, &format_str_len, &time_str, &time_str_len, &timezone_object, date_ce_timezone) == FAILURE) {
RETURN_FALSE;
}
- php_date_instantiate(date_ce_immutable, &datetime_object);
- if (!php_date_initialize(Z_PHPDATE_P(&datetime_object), time_str, time_str_len, format_str, timezone_object, 0)) {
- zval_dtor(&datetime_object);
+ php_date_instantiate(date_ce_immutable, return_value);
+ if (!php_date_initialize(Z_PHPDATE_P(return_value), time_str, time_str_len, format_str, timezone_object, 0)) {
+ zval_ptr_dtor(return_value);
RETURN_FALSE;
}
- RETVAL_ZVAL(&datetime_object, 0, 0);
}
/* }}} */
RETURN_FALSE;
}
- if (php_date_modify(object, modify, modify_len)) {
- RETURN_ZVAL(object, 1, 0);
+ if (!php_date_modify(object, modify, modify_len)) {
+ RETURN_FALSE;
}
- RETURN_FALSE;
+ ZVAL_COPY(return_value, object);
}
/* }}} */
}
date_clone_immutable(object, &new_object);
- if (php_date_modify(&new_object, modify, modify_len)) {
- RETURN_ZVAL(&new_object, 0, 1);
+ if (!php_date_modify(&new_object, modify, modify_len)) {
+ RETURN_FALSE;
}
- RETURN_FALSE;
+ ZVAL_COPY_VALUE(return_value, &new_object);
}
/* }}} */
php_date_add(object, interval, return_value);
- RETURN_ZVAL(object, 1, 0);
+ ZVAL_COPY(return_value, object);
}
/* }}} */
date_clone_immutable(object, &new_object);
php_date_add(&new_object, interval, return_value);
- RETURN_ZVAL(&new_object, 0, 1);
+ ZVAL_COPY_VALUE(return_value, &new_object);
}
/* }}} */
php_date_sub(object, interval, return_value);
- RETURN_ZVAL(object, 1, 0);
+ ZVAL_COPY(return_value, object);
}
/* }}} */
date_clone_immutable(object, &new_object);
php_date_sub(&new_object, interval, return_value);
- RETURN_ZVAL(&new_object, 0, 1);
+ ZVAL_COPY_VALUE(return_value, &new_object);
}
/* }}} */
php_date_timezone_set(object, timezone_object, return_value);
- RETURN_ZVAL(object, 1, 0);
+ ZVAL_COPY(return_value, object);
}
/* }}} */
date_clone_immutable(object, &new_object);
php_date_timezone_set(&new_object, timezone_object, return_value);
- RETURN_ZVAL(&new_object, 0, 1);
+ ZVAL_COPY_VALUE(return_value, &new_object);
}
/* }}} */
php_date_time_set(object, h, i, s, return_value);
- RETURN_ZVAL(object, 1, 0);
+ ZVAL_COPY(return_value, object);
}
/* }}} */
date_clone_immutable(object, &new_object);
php_date_time_set(&new_object, h, i, s, return_value);
- RETURN_ZVAL(&new_object, 0, 1);
+ ZVAL_COPY_VALUE(return_value, &new_object);
}
/* }}} */
php_date_date_set(object, y, m, d, return_value);
- RETURN_ZVAL(object, 1, 0);
+ ZVAL_COPY(return_value, object);
}
/* }}} */
date_clone_immutable(object, &new_object);
php_date_date_set(&new_object, y, m, d, return_value);
- RETURN_ZVAL(&new_object, 0, 1);
+ ZVAL_COPY_VALUE(return_value, &new_object);
}
/* }}} */
php_date_isodate_set(object, y, w, d, return_value);
- RETURN_ZVAL(object, 1, 0);
+ ZVAL_COPY(return_value, object);
}
/* }}} */
date_clone_immutable(object, &new_object);
php_date_isodate_set(&new_object, y, w, d, return_value);
- RETURN_ZVAL(&new_object, 0, 1);
+ ZVAL_COPY_VALUE(return_value, &new_object);
}
/* }}} */
php_date_timestamp_set(object, timestamp, return_value);
- RETURN_ZVAL(object, 1, 0);
+ ZVAL_COPY(return_value, object);
}
/* }}} */
date_clone_immutable(object, &new_object);
php_date_timestamp_set(&new_object, timestamp, return_value);
- RETURN_ZVAL(&new_object, 0, 1);
+ ZVAL_COPY_VALUE(return_value, &new_object);
}
/* }}} */
&TIMEZONE_ERROR(to), "intltz_to_date_time_zone", &tmp);
if (ret) {
- RETURN_ZVAL(ret, 1, 1);
+ ZVAL_COPY_VALUE(return_value, ret);
} else {
RETURN_FALSE;
}
ZVAL_UNDEF(&phar_obj->archive->metadata);
}
- ZVAL_ZVAL(&phar_obj->archive->metadata, metadata, 1, 0);
+ ZVAL_COPY(&phar_obj->archive->metadata, metadata);
phar_obj->archive->is_modified = 1;
phar_flush(phar_obj->archive, 0, 0, 0, &error);
ZVAL_UNDEF(&entry_obj->entry->metadata);
}
- ZVAL_ZVAL(&entry_obj->entry->metadata, metadata, 1, 0);
+ ZVAL_COPY(&entry_obj->entry->metadata, metadata);
entry_obj->entry->is_modified = 1;
entry_obj->entry->phar->is_modified = 1;
if (!Z_ISUNDEF(intern->obj)) {
closure_this = zend_get_closure_this_ptr(&intern->obj);
if (!Z_ISUNDEF_P(closure_this)) {
- RETURN_ZVAL(closure_this, 1, 0);
+ ZVAL_COPY(return_value, closure_this);
}
}
}
if (Z_OBJCE_P(obj) == zend_ce_closure &&
(mptr->internal_function.fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE))
{
- RETURN_ZVAL(obj, 1, 0);
+ ZVAL_COPY(return_value, obj);
} else {
zend_create_closure(return_value, mptr, mptr->common.scope, Z_OBJCE_P(obj), obj);
}
Returns the string content */
SXE_METHOD(__toString)
{
- zval result;
-
- if (sxe_object_cast_ex(getThis(), &result, IS_STRING) == SUCCESS) {
- RETURN_ZVAL(&result, 0, 0);
- } else {
- zval_ptr_dtor(&result);
+ if (sxe_object_cast_ex(getThis(), return_value, IS_STRING) != SUCCESS) {
+ zval_ptr_dtor(return_value);
RETURN_EMPTY_STRING();
}
}
if (!Z_ISUNDEF(intern->tmp)) {
zval_ptr_dtor(&intern->tmp);
}
- ZVAL_ZVAL(&intern->tmp, &rv, 0, 0);
- convert_to_long(&intern->tmp);
- *count = (zend_long)Z_LVAL(intern->tmp);
+ ZVAL_LONG(&intern->tmp, zval_get_long(&rv));
+ zval_ptr_dtor(&rv);
+ *count = Z_LVAL(intern->tmp);
return SUCCESS;
}
return FAILURE;
zval *retval_ptr = &retval;
ZVAL_STRINGL(retval_ptr, intern->file_name, intern->file_name_len);
- zval_dtor(readobj);
- ZVAL_ZVAL(writeobj, retval_ptr, 0, 0);
+ zval_ptr_dtor(readobj);
+ ZVAL_COPY_VALUE(writeobj, retval_ptr);
} else {
ZVAL_STRINGL(writeobj, intern->file_name, intern->file_name_len);
}
zval *retval_ptr = &retval;
ZVAL_STRING(retval_ptr, intern->u.dir.entry.d_name);
- zval_dtor(readobj);
- ZVAL_ZVAL(writeobj, retval_ptr, 0, 0);
+ zval_ptr_dtor(readobj);
+ ZVAL_COPY_VALUE(writeobj, retval_ptr);
} else {
ZVAL_STRING(writeobj, intern->u.dir.entry.d_name);
}
return SUCCESS;
}
if (readobj == writeobj) {
- zval_dtor(readobj);
+ zval_ptr_dtor(readobj);
}
ZVAL_NULL(writeobj);
return FAILURE;
php_fgetcsv(intern->u.file.stream, delimiter, enclosure, escape, buf_len, buf, &intern->u.file.current_zval);
if (return_value) {
if (Z_TYPE_P(return_value) != IS_NULL) {
- zval_dtor(return_value);
+ zval_ptr_dtor(return_value);
ZVAL_NULL(return_value);
}
ZVAL_ZVAL(return_value, &intern->u.file.current_zval, 1, 0);
}
if (user_caching_it_flags) {
- ZVAL_ZVAL(&caching_it_flags, user_caching_it_flags, 1, 0);
+ ZVAL_COPY(&caching_it_flags, user_caching_it_flags);
} else {
ZVAL_LONG(&caching_it_flags, CIT_CATCH_GET_CHILD);
}
if (data) {
RETVAL_ZVAL(data, 1, 0);
if (Z_TYPE_P(return_value) == IS_ARRAY) {
- zval_dtor(return_value);
+ zval_ptr_dtor(return_value);
ZVAL_STRINGL(return_value, "Array", sizeof("Array")-1);
} else {
- convert_to_string(return_value);
+ convert_to_string_ex(return_value);
}
}
zend_restore_error_handling(&error_handling);
}
if (object->flags & RTIT_BYPASS_KEY) {
- zval *key_ptr = &key;
- RETVAL_ZVAL(key_ptr, 1, 0);
- zval_dtor(&key);
+ RETVAL_ZVAL(&key, 1, 1);
return;
}
}
if (replacement == &tmp_replacement) {
- zval_dtor(replacement);
+ zval_ptr_dtor(replacement);
}
RETVAL_BOOL(count > 0);
}
return ZEND_HASH_APPLY_STOP;
}
array_set_zval_key(Z_ARRVAL_P(return_value), &key, data);
- zval_dtor(&key);
+ zval_ptr_dtor(&key);
} else {
Z_TRY_ADDREF_P(data);
add_next_index_zval(return_value, data);
array_init(return_value);
if (spl_iterator_apply(obj, use_keys ? spl_iterator_to_array_apply : spl_iterator_to_values_apply, (void*)return_value) != SUCCESS) {
- zval_dtor(return_value);
+ zval_ptr_dtor(return_value);
RETURN_NULL();
}
} /* }}} */
if ((element = zend_hash_get_current_data_ptr_ex(&intern->storage, &intern->pos)) == NULL) {
return;
}
- RETVAL_ZVAL(&element->obj, 1, 0);
+ ZVAL_COPY(return_value, &element->obj);
} /* }}} */
/* {{{ proto mixed SplObjectStorage::getInfo()
if ((element = zend_hash_get_current_data_ptr_ex(&intern->storage, &intern->pos)) == NULL) {
return;
}
- RETVAL_ZVAL(&element->inf, 1, 0);
+ ZVAL_COPY(return_value, &element->inf);
} /* }}} */
/* {{{ proto mixed SplObjectStorage::setInfo(mixed $inf)
return;
}
zval_ptr_dtor(&element->inf);
- ZVAL_ZVAL(&element->inf, inf, 1, 0);
+ ZVAL_COPY(&element->inf, inf);
} /* }}} */
/* {{{ proto void SplObjectStorage::next()
entry = Z_INDIRECT_P(entry);
}
- RETURN_ZVAL_FAST(entry);
+ RETURN_ZVAL(entry, 1, 0);
}
}
/* }}} */
entry = Z_INDIRECT_P(entry);
}
- RETURN_ZVAL_FAST(entry);
+ RETURN_ZVAL(entry, 1, 0);
}
}
/* }}} */
entry = Z_INDIRECT_P(entry);
}
- RETURN_ZVAL_FAST(entry);
+ RETURN_ZVAL(entry, 1, 0);
}
}
/* }}} */
entry = Z_INDIRECT_P(entry);
}
- RETURN_ZVAL_FAST(entry);
+ RETURN_ZVAL(entry, 1, 0);
}
}
/* }}} */
entry = Z_INDIRECT_P(entry);
}
- RETURN_ZVAL_FAST(entry);
+ RETURN_ZVAL(entry, 1, 0);
}
/* }}} */
RETVAL_NULL();
} else {
if ((result = zend_hash_minmax(Z_ARRVAL(args[0]), php_array_data_compare, 0)) != NULL) {
- RETVAL_ZVAL_FAST(result);
+ RETVAL_ZVAL(result, 1, 0);
} else {
php_error_docref(NULL, E_WARNING, "Array must contain at least one element");
RETVAL_FALSE;
}
}
- RETVAL_ZVAL_FAST(min);
+ RETVAL_ZVAL(min, 1, 0);
}
}
/* }}} */
RETVAL_NULL();
} else {
if ((result = zend_hash_minmax(Z_ARRVAL(args[0]), php_array_data_compare, 1)) != NULL) {
- RETVAL_ZVAL_FAST(result);
+ RETVAL_ZVAL(result, 1, 0);
} else {
php_error_docref(NULL, E_WARNING, "Array must contain at least one element");
RETVAL_FALSE;
}
}
- RETVAL_ZVAL_FAST(max);
+ RETVAL_ZVAL(max, 1, 0);
}
}
/* }}} */
htbl = Z_ARRVAL_P(input);
if (zend_hash_num_elements(htbl) == 0) {
- RETURN_ZVAL(&result, 1, 1);
+ ZVAL_COPY_VALUE(return_value, &result);
+ return;
}
fci.retval = &retval;
/* Short-circuit: if no callback and only one array, just return it. */
if (!ZEND_FCI_INITIALIZED(fci)) {
- RETVAL_ZVAL(&arrays[0], 1, 0);
+ ZVAL_COPY(return_value, &arrays[0]);
return;
}
add_assoc_zval_ex(return_value, "notification", sizeof("notification")-1, &context->notifier->ptr);
if (Z_REFCOUNTED(context->notifier->ptr)) Z_ADDREF(context->notifier->ptr);
}
- ZVAL_ZVAL(&options, &context->options, 1, 0);
- add_assoc_zval_ex(return_value, "options", sizeof("options")-1, &options);
+ if (Z_REFCOUNTED(context->options)) Z_ADDREF(context->options);
+ add_assoc_zval_ex(return_value, "options", sizeof("options")-1, &context->options);
}
/* }}} */
}
if (opt == PHP_PATHINFO_ALL) {
- RETURN_ZVAL(&tmp, 0, 1);
+ ZVAL_COPY_VALUE(return_value, &tmp);
} else {
zval *element;
if ((element = zend_hash_get_current_data(Z_ARRVAL(tmp))) != NULL) {
} else {
ZVAL_EMPTY_STRING(return_value);
}
+ zval_ptr_dtor(&tmp);
}
-
- zval_ptr_dtor(&tmp);
}
/* }}} */
ZEND_PARSE_PARAMETERS_END();
#endif
- RETVAL_ZVAL(num, 1, 0);
+ ZVAL_DUP(return_value, num);
convert_to_long_base(return_value, (int)base);
}
/* }}} */
return;
}
- RETVAL_ZVAL(num, 1, 0);
- convert_to_double(return_value);
+ RETURN_DOUBLE(zval_get_double(num));
}
/* }}} */
array_init(&token_stream);
if((success = (zendparse() == SUCCESS))) {
- ZVAL_ZVAL(return_value, &token_stream, 1, 0);
+ ZVAL_COPY_VALUE(return_value, &token_stream);
+ } else {
+ zval_ptr_dtor(&token_stream);
}
- zval_dtor(&token_stream);
zend_ast_destroy(CG(ast));
zend_arena_destroy(CG(ast_arena));