Browse Source

Respect proeprty visibility in foreach

PEAR_1_4DEV
Marcus Boerger 23 years ago
parent
commit
6e2cf148a4
  1. 45
      Zend/zend_execute.c
  2. 14
      Zend/zend_iterators.c
  3. 1
      Zend/zend_iterators.h

45
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:

14
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;
}
}

1
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
};

Loading…
Cancel
Save