diff options
-rw-r--r-- | Zend/zend_vm_def.h | 8 | ||||
-rw-r--r-- | Zend/zend_vm_execute.h | 8 |
2 files changed, 14 insertions, 2 deletions
diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index e59337ec73..daad1c120d 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -7176,10 +7176,14 @@ ZEND_VM_HANDLER(150, ZEND_USER_OPCODE, ANY, ANY) SAVE_OPLINE(); ret = zend_user_opcode_handlers[opline->opcode](execute_data); - LOAD_OPLINE(); + + if (EG(exception)) { + HANDLE_EXCEPTION(); + } switch (ret) { case ZEND_USER_OPCODE_CONTINUE: + LOAD_OPLINE(); ZEND_VM_CONTINUE(); case ZEND_USER_OPCODE_RETURN: if (UNEXPECTED((EX(func)->op_array.fn_flags & ZEND_ACC_GENERATOR) != 0)) { @@ -7194,8 +7198,10 @@ ZEND_VM_HANDLER(150, ZEND_USER_OPCODE, ANY, ANY) case ZEND_USER_OPCODE_LEAVE: ZEND_VM_LEAVE(); case ZEND_USER_OPCODE_DISPATCH: + ZEND_ASSERT(EX(opline) == opline); ZEND_VM_DISPATCH(opline->opcode, opline); default: + ZEND_ASSERT(EX(opline) == opline); ZEND_VM_DISPATCH((zend_uchar)(ret & 0xff), opline); } } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index eeaf27930d..ea01110d96 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -1563,10 +1563,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_USER_OPCODE_SPEC_HANDLER(ZEND_ SAVE_OPLINE(); ret = zend_user_opcode_handlers[opline->opcode](execute_data); - LOAD_OPLINE(); + + if (EG(exception)) { + HANDLE_EXCEPTION(); + } switch (ret) { case ZEND_USER_OPCODE_CONTINUE: + LOAD_OPLINE(); ZEND_VM_CONTINUE(); case ZEND_USER_OPCODE_RETURN: if (UNEXPECTED((EX(func)->op_array.fn_flags & ZEND_ACC_GENERATOR) != 0)) { @@ -1581,8 +1585,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_USER_OPCODE_SPEC_HANDLER(ZEND_ case ZEND_USER_OPCODE_LEAVE: ZEND_VM_LEAVE(); case ZEND_USER_OPCODE_DISPATCH: + ZEND_ASSERT(EX(opline) == opline); ZEND_VM_DISPATCH(opline->opcode, opline); default: + ZEND_ASSERT(EX(opline) == opline); ZEND_VM_DISPATCH((zend_uchar)(ret & 0xff), opline); } } |