zend_stack_push(&CG(foreach_copy_stack), (void *) &opline->result, sizeof(znode));
/* save the location of the beginning of the loop (array fetching) */
- foreach_token->u.opline_num = get_next_op_number(CG(active_op_array));
+ opline->op2.u.opline_num = foreach_token->u.opline_num = get_next_op_number(CG(active_op_array));
opline = get_next_op(CG(active_op_array) TSRMLS_CC);
opline->opcode = ZEND_FE_FETCH;
array_ptr->refcount++;
}
}
- PZVAL_LOCK(array_ptr);
- EX_T(EX(opline)->result.u.var).var.ptr = array_ptr;
- EX_T(EX(opline)->result.u.var).var.ptr_ptr = &EX_T(EX(opline)->result.u.var).var.ptr;
if ((fe_ht = HASH_OF(array_ptr)) != NULL) {
/* probably redundant */
zend_hash_internal_pointer_reset(fe_ht);
} else {
- /* JMP to the end of foreach - TBD */
+ zend_error(E_WARNING, "Invalid argument supplied for foreach()");
+
+ EX(opline) = op_array->opcodes+EX(opline)->op1.u.opline_num;
+ EX(opline) = op_array->opcodes+EX(opline)->op2.u.opline_num;
+ return 0;
}
+
+ PZVAL_LOCK(array_ptr);
+ EX_T(EX(opline)->result.u.var).var.ptr = array_ptr;
+ EX_T(EX(opline)->result.u.var).var.ptr_ptr = &EX_T(EX(opline)->result.u.var).var.ptr;
+
NEXT_OPCODE();
}