]> granicus.if.org Git - php/commitdiff
Respect proeprty visibility in foreach
authorMarcus Boerger <helly@php.net>
Sun, 25 Jan 2004 13:32:02 +0000 (13:32 +0000)
committerMarcus Boerger <helly@php.net>
Sun, 25 Jan 2004 13:32:02 +0000 (13:32 +0000)
Zend/zend_execute.c
Zend/zend_iterators.c
Zend/zend_iterators.h

index 08a77d1c6b63a92c96fe9e8fca640913339a2a41..7ee8a4c6fee228af23ce86cca1f2f53f265517e1 100644 (file)
@@ -3643,36 +3643,37 @@ int zend_fe_fetch_handler(ZEND_OPCODE_HANDLER_ARGS)
                        EX(opline) = op_array->opcodes+EX(opline)->op2.u.opline_num;
                        return 0; /* CHECK_ME */
                        
-               case ZEND_ITER_PLAIN_ARRAY:
-                       /* good old fashioned foreach on an array */
+               case ZEND_ITER_PLAIN_OBJECT: {
+                       char *class_name, *prop_name;
+                       zend_object *zobj = zend_objects_get_address(array TSRMLS_CC);
+
                        fe_ht = HASH_OF(array);
-                       if (Z_TYPE_P(array) == IS_OBJECT) {
-                               char *class_name, *prop_name;
-                               zend_object *zobj = zend_objects_get_address(array TSRMLS_CC);
-
-                               do {
-                                       if (zend_hash_get_current_data(fe_ht, (void **) &value)==FAILURE) {
-                                               /* reached end of iteration */
-                                               EX(opline) = op_array->opcodes+EX(opline)->op2.u.opline_num;
-                                               return 0; /* CHECK_ME */
-                                       }
-                                       key_type = zend_hash_get_current_key_ex(fe_ht, &str_key, &str_key_len, &int_key, 0, NULL);
-
-                                       zend_hash_move_forward(fe_ht);
-                               } while (zend_check_property_access(zobj, str_key TSRMLS_CC) != SUCCESS);
-                               zend_unmangle_property_name(str_key, &class_name, &prop_name);
-                               str_key_len = strlen(prop_name);
-                               str_key = estrndup(prop_name, str_key_len);
-                               str_key_len++;
-                       } else {
+                       do {
                                if (zend_hash_get_current_data(fe_ht, (void **) &value)==FAILURE) {
                                        /* reached end of iteration */
                                        EX(opline) = op_array->opcodes+EX(opline)->op2.u.opline_num;
                                        return 0; /* CHECK_ME */
                                }
-                               key_type = zend_hash_get_current_key_ex(fe_ht, &str_key, &str_key_len, &int_key, 1, NULL);
+                               key_type = zend_hash_get_current_key_ex(fe_ht, &str_key, &str_key_len, &int_key, 0, NULL);
+
                                zend_hash_move_forward(fe_ht);
+                       } while (zend_check_property_access(zobj, str_key TSRMLS_CC) != SUCCESS);
+                       zend_unmangle_property_name(str_key, &class_name, &prop_name);
+                       str_key_len = strlen(prop_name);
+                       str_key = estrndup(prop_name, str_key_len);
+                       str_key_len++;
+                       break;
+               }
+
+               case ZEND_ITER_PLAIN_ARRAY:
+                       fe_ht = HASH_OF(array);
+                       if (zend_hash_get_current_data(fe_ht, (void **) &value)==FAILURE) {
+                               /* reached end of iteration */
+                               EX(opline) = op_array->opcodes+EX(opline)->op2.u.opline_num;
+                               return 0; /* CHECK_ME */
                        }
+                       key_type = zend_hash_get_current_key_ex(fe_ht, &str_key, &str_key_len, &int_key, 1, NULL);
+                       zend_hash_move_forward(fe_ht);
                        break;
 
                case ZEND_ITER_OBJECT:
index 4d08c504e602afb862536757650c4bb3fd2a1735..55b67a064ab068e7802d47220ef88c7ab448e3bb 100755 (executable)
@@ -81,15 +81,19 @@ ZEND_API enum zend_object_iterator_kind zend_iterator_unwrap(
                                *iter = (zend_object_iterator *)zend_object_store_get_object(array_ptr TSRMLS_CC);
                                return ZEND_ITER_OBJECT;
                        }
-                       /* Until we have a default iterator that respects visibility we do the array trick */
-                       /*return ZEND_ITER_INVALID*/;
+                       if (HASH_OF(array_ptr)) {
+                               return ZEND_ITER_PLAIN_OBJECT;
+                       }
+                       return ZEND_ITER_INVALID;
+                       
                        
                case IS_ARRAY:
-                       *iter = NULL;
-                       return HASH_OF(array_ptr) ? ZEND_ITER_PLAIN_ARRAY : ZEND_ITER_INVALID;
+                       if (HASH_OF(array_ptr)) {
+                               return ZEND_ITER_PLAIN_ARRAY;
+                       }
+                       return ZEND_ITER_INVALID;
                        
                default:
-                       *iter = NULL;
                        return ZEND_ITER_INVALID;
        }
 }
index dec10f9c542366825a1bb55e764ee6b6b80af862..0398f118c7bbd7c0dea3099b4ed8e0f1fcbeeea1 100755 (executable)
@@ -70,6 +70,7 @@ typedef struct _zend_class_iterator_funcs {
 enum zend_object_iterator_kind {
        ZEND_ITER_INVALID,
        ZEND_ITER_PLAIN_ARRAY,
+       ZEND_ITER_PLAIN_OBJECT,
        ZEND_ITER_OBJECT
 };