diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index d7914f7209e..69bf58fca67 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -1446,7 +1446,7 @@ ZEND_API void execute_internal(zend_execute_data *execute_data_ptr, int return_v EX(opline)++; \ } -#define ZEND_VM_RETURN_FROM_EXECUTE_LOOP() \ +#define ZEND_VM_EXIT_FROM_EXECUTE_LOOP() \ free_alloca(EX(CVs)); \ if (EX(op_array)->T < TEMP_VAR_STACK_LIMIT) { \ free_alloca(EX(Ts)); \ @@ -1455,7 +1455,10 @@ ZEND_API void execute_internal(zend_execute_data *execute_data_ptr, int return_v } \ EG(in_execution) = EX(original_in_execution); \ EG(current_execute_data) = EX(prev_execute_data); \ - EG(opline_ptr) = NULL; \ + EG(opline_ptr) = NULL; + +#define ZEND_VM_RETURN_FROM_EXECUTE_LOOP() \ + ZEND_VM_EXIT_FROM_EXECUTE_LOOP(); \ ZEND_VM_RETURN() #include "zend_vm_execute.h" diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 386a1e65a15..7227a8fc46e 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -3885,6 +3885,7 @@ ZEND_VM_HANDLER(79, ZEND_EXIT, CONST|TMP|VAR|UNUSED|CV, ANY) FREE_OP1(); } #endif + ZEND_VM_EXIT_FROM_EXECUTE_LOOP(); zend_bailout(); ZEND_VM_NEXT_OPCODE(); } @@ -4159,7 +4160,7 @@ ZEND_VM_HANDLER(150, ZEND_USER_OPCODE, ANY, ANY) case ZEND_USER_OPCODE_CONTINUE: ZEND_VM_CONTINUE(); case ZEND_USER_OPCODE_RETURN: - ZEND_VM_RETURN(); + ZEND_VM_RETURN_FROM_EXECUTE_LOOP(); case ZEND_USER_OPCODE_DISPATCH: ZEND_VM_DISPATCH(EX(opline)->opcode, EX(opline)); default: diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 7c93532c8fc..02952a257c5 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -615,7 +615,7 @@ static int ZEND_USER_OPCODE_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS) case ZEND_USER_OPCODE_CONTINUE: ZEND_VM_CONTINUE(); case ZEND_USER_OPCODE_RETURN: - ZEND_VM_RETURN(); + ZEND_VM_RETURN_FROM_EXECUTE_LOOP(); case ZEND_USER_OPCODE_DISPATCH: ZEND_VM_DISPATCH(EX(opline)->opcode, EX(opline)); default: @@ -2194,6 +2194,7 @@ static int ZEND_EXIT_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) } #endif + ZEND_VM_EXIT_FROM_EXECUTE_LOOP(); zend_bailout(); ZEND_VM_NEXT_OPCODE(); } @@ -5402,6 +5403,7 @@ static int ZEND_EXIT_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) zval_dtor(free_op1.var); } #endif + ZEND_VM_EXIT_FROM_EXECUTE_LOOP(); zend_bailout(); ZEND_VM_NEXT_OPCODE(); } @@ -8854,6 +8856,7 @@ static int ZEND_EXIT_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) if (free_op1.var) {zval_ptr_dtor(&free_op1.var);}; } #endif + ZEND_VM_EXIT_FROM_EXECUTE_LOOP(); zend_bailout(); ZEND_VM_NEXT_OPCODE(); } @@ -16467,6 +16470,7 @@ static int ZEND_EXIT_SPEC_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) } #endif + ZEND_VM_EXIT_FROM_EXECUTE_LOOP(); zend_bailout(); ZEND_VM_NEXT_OPCODE(); } @@ -22219,6 +22223,7 @@ static int ZEND_EXIT_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) } #endif + ZEND_VM_EXIT_FROM_EXECUTE_LOOP(); zend_bailout(); ZEND_VM_NEXT_OPCODE(); }