]> granicus.if.org Git - php/commitdiff
Remove unnecessary retval members in SPL
authorNikita Popov <nikic@php.net>
Wed, 15 Apr 2015 18:26:23 +0000 (20:26 +0200)
committerNikita Popov <nikic@php.net>
Wed, 15 Apr 2015 18:39:08 +0000 (20:39 +0200)
This is what the rv params are for. Avoid holding onto values
longer than necessary.

ext/spl/spl_array.c
ext/spl/spl_fixedarray.c
ext/spl/spl_heap.c

index 8071a71e557c007fe7e339e8c7136a011f00a599..cee380709aedceab7f9ac7e7c2a62510a61602ce 100644 (file)
@@ -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;
index 48e9d2f85f3e8a69fc05aae33ab2b8f775f70b62..faac492b2a4f181fb1366828d24a3d2893aca19a 100644 (file)
@@ -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) {
index 8e9f3ad66f1efe19270c9a92e9b23518db2cc528..98f4217be9c7a1e2a50a879778259c03542a21f2 100644 (file)
@@ -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;