]> granicus.if.org Git - php/commitdiff
ZEND_HASH_FOREACH_* usage
authorDmitry Stogov <dmitry@zend.com>
Fri, 18 Apr 2014 17:49:07 +0000 (21:49 +0400)
committerDmitry Stogov <dmitry@zend.com>
Fri, 18 Apr 2014 17:49:07 +0000 (21:49 +0400)
ext/standard/array.c
ext/standard/string.c

index dfa6471660e48963058c1a8e7bced7feeb061538..d5799196d256c5c8f2df4227e5295da87ab8ecd6 100644 (file)
@@ -2177,7 +2177,6 @@ PHP_FUNCTION(array_slice)
                         pos;                   /* Current position in the array */
        zend_string *string_key;
        ulong num_key;
-       HashPosition hpos;
 
        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "al|zb", &input, &offset, &z_length, &preserve_keys) == FAILURE) {
                return;
@@ -2218,33 +2217,28 @@ PHP_FUNCTION(array_slice)
 
        /* Start at the beginning and go until we hit offset */
        pos = 0;
-       zend_hash_internal_pointer_reset_ex(Z_ARRVAL_P(input), &hpos);
-       while (pos < offset && (entry = zend_hash_get_current_data_ex(Z_ARRVAL_P(input), &hpos)) != NULL) {
+       ZEND_HASH_FOREACH_KEY_VAL(Z_ARRVAL_P(input), num_key, string_key, entry) {
                pos++;
-               zend_hash_move_forward_ex(Z_ARRVAL_P(input), &hpos);
-       }
-
-       /* Copy elements from input array to the one that's returned */
-       while (pos < offset + length && (entry = zend_hash_get_current_data_ex(Z_ARRVAL_P(input), &hpos)) != NULL) {
+               if (pos <= offset) {
+                       continue;
+               }
+               if (pos > offset + length) {
+                       break;
+               }
 
+               /* Copy elements from input array to the one that's returned */
                zval_add_ref(entry);
 
-               switch (zend_hash_get_current_key_ex(Z_ARRVAL_P(input), &string_key, &num_key, 0, &hpos)) {
-                       case HASH_KEY_IS_STRING:
-                               zend_hash_update(Z_ARRVAL_P(return_value), string_key, entry);
-                               break;
-
-                       case HASH_KEY_IS_LONG:
-                               if (preserve_keys) {
-                                       zend_hash_index_update(Z_ARRVAL_P(return_value), num_key, entry);
-                               } else {
-                                       zend_hash_next_index_insert(Z_ARRVAL_P(return_value), entry);
-                               }
-                               break;
+               if (string_key) {
+                       zend_hash_update(Z_ARRVAL_P(return_value), string_key, entry);
+               } else {
+                       if (preserve_keys) {
+                               zend_hash_index_update(Z_ARRVAL_P(return_value), num_key, entry);
+                       } else {
+                               zend_hash_next_index_insert(Z_ARRVAL_P(return_value), entry);
+                       }
                }
-               pos++;
-               zend_hash_move_forward_ex(Z_ARRVAL_P(input), &hpos);
-       }
+       } ZEND_HASH_FOREACH_END();
 }
 /* }}} */
 
index 8f07c332a32746513a93cc9c3ae445b55bcb8f3a..a1ea1cbf45b1f36ca8d5517083f9d9751f2372c7 100644 (file)
@@ -3816,8 +3816,6 @@ static void php_str_replace_in_subject(zval *search, zval *replace, zval *subjec
                /* Duplicate subject string for repeated replacement */
                ZVAL_DUP(result, subject);
 
-               zend_hash_internal_pointer_reset(Z_ARRVAL_P(search));
-
                if (Z_TYPE_P(replace) == IS_ARRAY) {
                        zend_hash_internal_pointer_reset(Z_ARRVAL_P(replace));
                } else {
@@ -3827,12 +3825,11 @@ static void php_str_replace_in_subject(zval *search, zval *replace, zval *subjec
                }
 
                /* For each entry in the search array, get the entry */
-               while ((search_entry = zend_hash_get_current_data(Z_ARRVAL_P(search))) != NULL) {
+               ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(search), search_entry) {
                        /* Make sure we're dealing with strings. */
                        SEPARATE_ZVAL(search_entry);
                        convert_to_string(search_entry);
                        if (Z_STRLEN_P(search_entry) == 0) {
-                               zend_hash_move_forward(Z_ARRVAL_P(search));
                                if (Z_TYPE_P(replace) == IS_ARRAY) {
                                        zend_hash_move_forward(Z_ARRVAL_P(replace));
                                }
@@ -3881,9 +3878,7 @@ static void php_str_replace_in_subject(zval *search, zval *replace, zval *subjec
                                zval_ptr_dtor(&tmp_subject);
                                return;
                        }
-
-                       zend_hash_move_forward(Z_ARRVAL_P(search));
-               }
+               } ZEND_HASH_FOREACH_END();
        } else {
                if (Z_STRLEN_P(search) == 1) {
                        php_char_to_str_ex(Z_STRVAL_P(subject),