From b137441f0e86594c94bc43476ac6577f3510fe52 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Wed, 19 Sep 2018 11:47:02 +0300 Subject: [PATCH] Improve ZEND_VM_SMART_BRANCH() --- Zend/zend_execute.c | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 217cd99ebb..8dd1a8c43c 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -3453,29 +3453,29 @@ static zend_never_inline int ZEND_FASTCALL zend_quick_check_constant( OPLINE = opline; \ ZEND_VM_CONTINUE() # define ZEND_VM_SMART_BRANCH(_result, _check) do { \ - int __result; \ + if ((_check) && UNEXPECTED(EG(exception))) { \ + break; \ + } \ if (EXPECTED((opline+1)->opcode == ZEND_JMPZ)) { \ - __result = (_result); \ + if (_result) { \ + ZEND_VM_SET_NEXT_OPCODE(opline + 2); \ + } else { \ + ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline + 1, (opline+1)->op2)); \ + } \ } else if (EXPECTED((opline+1)->opcode == ZEND_JMPNZ)) { \ - __result = !(_result); \ + if (!(_result)) { \ + ZEND_VM_SET_NEXT_OPCODE(opline + 2); \ + } else { \ + ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline + 1, (opline+1)->op2)); \ + } \ } else { \ break; \ } \ - if ((_check) && UNEXPECTED(EG(exception))) { \ - ZVAL_UNDEF(EX_VAR(opline->result.var)); \ - HANDLE_EXCEPTION(); \ - } \ - if (__result) { \ - ZEND_VM_SET_NEXT_OPCODE(opline + 2); \ - } else { \ - ZEND_VM_SET_OPCODE(OP_JMP_ADDR(opline + 1, (opline+1)->op2)); \ - } \ ZEND_VM_CONTINUE(); \ } while (0) # define ZEND_VM_SMART_BRANCH_JMPZ(_result, _check) do { \ if ((_check) && UNEXPECTED(EG(exception))) { \ - ZVAL_UNDEF(EX_VAR(opline->result.var)); \ - HANDLE_EXCEPTION(); \ + break; \ } \ if (_result) { \ ZEND_VM_SET_NEXT_OPCODE(opline + 2); \ @@ -3486,8 +3486,7 @@ static zend_never_inline int ZEND_FASTCALL zend_quick_check_constant( } while (0) # define ZEND_VM_SMART_BRANCH_JMPNZ(_result, _check) do { \ if ((_check) && UNEXPECTED(EG(exception))) { \ - ZVAL_UNDEF(EX_VAR(opline->result.var)); \ - HANDLE_EXCEPTION(); \ + break; \ } \ if (!(_result)) { \ ZEND_VM_SET_NEXT_OPCODE(opline + 2); \ -- 2.40.0