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:
*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;
}
}