From: Marcus Boerger Date: Sun, 25 Jan 2004 13:32:02 +0000 (+0000) Subject: Respect proeprty visibility in foreach X-Git-Tag: RELEASE_1_3b6~22 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6e2cf148a447bf8f6ce9a8c788ee4b77b69ed444;p=php Respect proeprty visibility in foreach --- diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 08a77d1c6b..7ee8a4c6fe 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -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: diff --git a/Zend/zend_iterators.c b/Zend/zend_iterators.c index 4d08c504e6..55b67a064a 100755 --- a/Zend/zend_iterators.c +++ b/Zend/zend_iterators.c @@ -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; } } diff --git a/Zend/zend_iterators.h b/Zend/zend_iterators.h index dec10f9c54..0398f118c7 100755 --- a/Zend/zend_iterators.h +++ b/Zend/zend_iterators.h @@ -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 };