diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 88b46a641d079..56435e2080683 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -5186,15 +5186,14 @@ ZEND_VM_C_LABEL(send_again): const zend_object_iterator_funcs *funcs = iter->funcs; if (funcs->rewind) { funcs->rewind(iter); + if (UNEXPECTED(EG(exception) != NULL)) { + ZEND_VM_C_GOTO(after_loop); + } } for (; funcs->valid(iter) == SUCCESS; ++arg_num) { zval *arg, *top; - if (UNEXPECTED(EG(exception) != NULL)) { - break; - } - arg = funcs->get_current_data(iter); if (UNEXPECTED(EG(exception) != NULL)) { break; @@ -5277,6 +5276,7 @@ ZEND_VM_C_LABEL(send_again): funcs->move_forward(iter); } +ZEND_VM_C_LABEL(after_loop): zend_iterator_dtor(iter); } } else if (EXPECTED(Z_ISREF_P(args))) { diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index d44be7760c43a..ef6578145af0e 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -2324,15 +2324,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_UNPACK_SPEC_HANDLER(ZEND_ const zend_object_iterator_funcs *funcs = iter->funcs; if (funcs->rewind) { funcs->rewind(iter); + if (UNEXPECTED(EG(exception) != NULL)) { + goto after_loop; + } } for (; funcs->valid(iter) == SUCCESS; ++arg_num) { zval *arg, *top; - if (UNEXPECTED(EG(exception) != NULL)) { - break; - } - arg = funcs->get_current_data(iter); if (UNEXPECTED(EG(exception) != NULL)) { break; @@ -2415,6 +2414,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_SEND_UNPACK_SPEC_HANDLER(ZEND_ funcs->move_forward(iter); } +after_loop: zend_iterator_dtor(iter); } } else if (EXPECTED(Z_ISREF_P(args))) {