diff options
Diffstat (limited to 'Zend/zend_execute.c')
-rw-r--r-- | Zend/zend_execute.c | 45 |
1 files changed, 23 insertions, 22 deletions
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: |