From: Nikita Popov Date: Wed, 15 Apr 2015 18:26:23 +0000 (+0200) Subject: Remove unnecessary retval members in SPL X-Git-Tag: PRE_PHP7_NSAPI_REMOVAL~275 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e10be0d0fd6255f12140838cc1c3f724e9778125;p=php Remove unnecessary retval members in SPL This is what the rv params are for. Avoid holding onto values longer than necessary. --- diff --git a/ext/spl/spl_array.c b/ext/spl/spl_array.c index 8071a71e55..cee380709a 100644 --- a/ext/spl/spl_array.c +++ b/ext/spl/spl_array.c @@ -64,7 +64,6 @@ PHPAPI zend_class_entry *spl_ce_RecursiveArrayIterator; typedef struct _spl_array_object { zval array; - zval retval; uint32_t ht_iter; int ar_flags; int is_self; @@ -132,7 +131,6 @@ static void spl_array_object_free_storage(zend_object *object) zend_object_std_dtor(&intern->std); zval_ptr_dtor(&intern->array); - zval_ptr_dtor(&intern->retval); if (intern->debug_info != NULL) { zend_hash_destroy(intern->debug_info); @@ -368,26 +366,25 @@ num_index: } } /* }}} */ -static zval *spl_array_read_dimension_ex(int check_inherited, zval *object, zval *offset, int type, zval *zv) /* {{{ */ +static zval *spl_array_read_dimension_ex(int check_inherited, zval *object, zval *offset, int type, zval *rv) /* {{{ */ { zval *ret; if (check_inherited) { spl_array_object *intern = Z_SPLARRAY_P(object); if (intern->fptr_offset_get) { - zval rv, tmp; + zval tmp; if (!offset) { ZVAL_UNDEF(&tmp); offset = &tmp; } else { SEPARATE_ARG_IF_REF(offset); } - zend_call_method_with_1_params(object, Z_OBJCE_P(object), &intern->fptr_offset_get, "offsetGet", &rv, offset); + zend_call_method_with_1_params(object, Z_OBJCE_P(object), &intern->fptr_offset_get, "offsetGet", rv, offset); zval_ptr_dtor(offset); - if (!Z_ISUNDEF(rv)) { - zval_ptr_dtor(&intern->retval); - ZVAL_ZVAL(&intern->retval, &rv, 0, 0); - return &intern->retval; + + if (!Z_ISUNDEF_P(rv)) { + return rv; } return &EG(uninitialized_zval); } @@ -663,7 +660,13 @@ num_index: } } - return check_empty ? zend_is_true(value) : Z_TYPE_P(value) != IS_NULL; + { + zend_bool result = check_empty ? zend_is_true(value) : Z_TYPE_P(value) != IS_NULL; + if (value == &rv) { + zval_ptr_dtor(&rv); + } + return result; + } } /* }}} */ static int spl_array_has_dimension(zval *object, zval *offset, int check_empty) /* {{{ */ @@ -1371,10 +1374,8 @@ int spl_array_object_count_elements(zval *object, zend_long *count) /* {{{ */ zval rv; zend_call_method_with_0_params(object, intern->std.ce, &intern->fptr_count, "count", &rv); if (Z_TYPE(rv) != IS_UNDEF) { - zval_ptr_dtor(&intern->retval); - ZVAL_ZVAL(&intern->retval, &rv, 0, 0); - convert_to_long(&intern->retval); - *count = (zend_long)Z_LVAL(intern->retval); + *count = zval_get_long(&rv); + zval_ptr_dtor(&rv); return SUCCESS; } *count = 0; diff --git a/ext/spl/spl_fixedarray.c b/ext/spl/spl_fixedarray.c index 48e9d2f85f..faac492b2a 100644 --- a/ext/spl/spl_fixedarray.c +++ b/ext/spl/spl_fixedarray.c @@ -50,7 +50,6 @@ typedef struct _spl_fixedarray { /* {{{ */ typedef struct _spl_fixedarray_object { /* {{{ */ spl_fixedarray *array; - zval retval; zend_function *fptr_offset_get; zend_function *fptr_offset_set; zend_function *fptr_offset_has; @@ -208,7 +207,6 @@ static void spl_fixedarray_object_free_storage(zend_object *object) /* {{{ */ } zend_object_std_dtor(&intern->std); - zval_ptr_dtor(&intern->retval); } /* }}} */ @@ -361,19 +359,17 @@ static zval *spl_fixedarray_object_read_dimension(zval *object, zval *offset, in intern = Z_SPLFIXEDARRAY_P(object); if (intern->fptr_offset_get) { - zval tmp, rv; + zval tmp; if (!offset) { ZVAL_UNDEF(&tmp); offset = &tmp; } else { SEPARATE_ARG_IF_REF(offset); } - zend_call_method_with_1_params(object, intern->std.ce, &intern->fptr_offset_get, "offsetGet", &rv, offset); + zend_call_method_with_1_params(object, intern->std.ce, &intern->fptr_offset_get, "offsetGet", rv, offset); zval_ptr_dtor(offset); - if (!Z_ISUNDEF(rv)) { - zval_ptr_dtor(&intern->retval); - ZVAL_ZVAL(&intern->retval, &rv, 0, 0); - return &intern->retval; + if (!Z_ISUNDEF_P(rv)) { + return rv; } return &EG(uninitialized_zval); } @@ -517,9 +513,9 @@ static int spl_fixedarray_object_has_dimension(zval *object, zval *offset, int c zend_call_method_with_1_params(object, intern->std.ce, &intern->fptr_offset_has, "offsetExists", &rv, offset); zval_ptr_dtor(offset); if (!Z_ISUNDEF(rv)) { - zval_ptr_dtor(&intern->retval); - ZVAL_ZVAL(&intern->retval, &rv, 0, 0); - return zend_is_true(&intern->retval); + zend_bool result = zend_is_true(&rv); + zval_ptr_dtor(&rv); + return result; } return 0; } @@ -537,10 +533,8 @@ static int spl_fixedarray_object_count_elements(zval *object, zend_long *count) zval rv; zend_call_method_with_0_params(object, intern->std.ce, &intern->fptr_count, "count", &rv); if (!Z_ISUNDEF(rv)) { - zval_ptr_dtor(&intern->retval); - ZVAL_ZVAL(&intern->retval, &rv, 0, 0); - convert_to_long(&intern->retval); - *count = (zend_long) Z_LVAL(intern->retval); + *count = zval_get_long(&rv); + zval_ptr_dtor(&rv); return SUCCESS; } } else if (intern->array) { diff --git a/ext/spl/spl_heap.c b/ext/spl/spl_heap.c index 8e9f3ad66f..98f4217be9 100644 --- a/ext/spl/spl_heap.c +++ b/ext/spl/spl_heap.c @@ -69,7 +69,6 @@ typedef struct _spl_heap_it spl_heap_it; struct _spl_heap_object { spl_ptr_heap *heap; - zval retval; int flags; zend_class_entry *ce_get_iterator; zend_function *fptr_cmp; @@ -371,8 +370,6 @@ static void spl_heap_object_free_storage(zend_object *object) /* {{{ */ spl_ptr_heap_destroy(intern->heap); - zval_ptr_dtor(&intern->retval); - if (intern->debug_info != NULL) { zend_hash_destroy(intern->debug_info); efree(intern->debug_info); @@ -491,10 +488,8 @@ static int spl_heap_object_count_elements(zval *object, zend_long *count) /* {{{ zval rv; zend_call_method_with_0_params(object, intern->std.ce, &intern->fptr_count, "count", &rv); if (!Z_ISUNDEF(rv)) { - zval_ptr_dtor(&intern->retval); - ZVAL_ZVAL(&intern->retval, &rv, 0, 0); - convert_to_long(&intern->retval); - *count = (zend_long) Z_LVAL(intern->retval); + *count = zval_get_long(&rv); + zval_ptr_dtor(&rv); return SUCCESS; } *count = 0;