summaryrefslogtreecommitdiff
path: root/Zend/zend_execute.c
diff options
context:
space:
mode:
Diffstat (limited to 'Zend/zend_execute.c')
-rw-r--r--Zend/zend_execute.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c
index 9190eff2c3..27274d334d 100644
--- a/Zend/zend_execute.c
+++ b/Zend/zend_execute.c
@@ -2428,9 +2428,21 @@ static zend_always_inline zend_generator *zend_get_running_generator(zend_execut
# define ZEND_VM_SMART_BRANCH(_result, _check) do { \
int __result; \
if (EXPECTED((opline+1)->opcode == ZEND_JMPZ)) { \
- __result = (_result); \
+ if (UNEXPECTED((opline+1)->op1_type == IS_CONST)) { \
+ zend_uchar __type = Z_TYPE_P(EX_CONSTANT((opline+1)->op1)); \
+ ZEND_ASSERT(__type == IS_TRUE || __type == IS_FALSE); /* assume boolean */ \
+ __result = __type == IS_TRUE; \
+ } else { \
+ __result = (_result); \
+ } \
} else if (EXPECTED((opline+1)->opcode == ZEND_JMPNZ)) { \
- __result = !(_result); \
+ if (UNEXPECTED((opline+1)->op1_type == IS_CONST)) { \
+ zend_uchar __type = Z_TYPE_P(EX_CONSTANT((opline+1)->op1)); \
+ ZEND_ASSERT(__type == IS_TRUE || __type == IS_FALSE); /* assume boolean */ \
+ __result = __type != IS_TRUE; \
+ } else { \
+ __result = !(_result); \
+ } \
} else { \
break; \
} \