From e90505105286b6d6ef27799d1431733766733bd3 Mon Sep 17 00:00:00 2001 From: Ilija Tovilo Date: Wed, 24 Jan 2024 16:21:08 +0100 Subject: [PATCH] Improve is_instanceof inference When a class is final, it may be treated as !is_instanceof. --- Zend/Optimizer/zend_inference.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/Zend/Optimizer/zend_inference.c b/Zend/Optimizer/zend_inference.c index af6c301fd9347..046d346f8d7d9 100644 --- a/Zend/Optimizer/zend_inference.c +++ b/Zend/Optimizer/zend_inference.c @@ -2003,10 +2003,15 @@ static uint32_t get_ssa_alias_types(zend_ssa_alias_kind alias) { #define UPDATE_SSA_OBJ_TYPE(_ce, _is_instanceof, var) \ do { \ if (var >= 0) { \ - if (ssa_var_info[var].ce != (_ce) || \ - ssa_var_info[var].is_instanceof != (_is_instanceof)) { \ - ssa_var_info[var].ce = (_ce); \ - ssa_var_info[var].is_instanceof = (_is_instanceof); \ + zend_class_entry *__ce = (_ce); \ + bool __is_instanceof = (_is_instanceof); \ + if (__ce && (__ce->ce_flags & ZEND_ACC_FINAL)) { \ + __is_instanceof = false; \ + } \ + if (ssa_var_info[var].ce != __ce || \ + ssa_var_info[var].is_instanceof != __is_instanceof) { \ + ssa_var_info[var].ce = __ce; \ + ssa_var_info[var].is_instanceof = __is_instanceof; \ if (update_worklist) { \ add_usages(op_array, ssa, worklist, var); \ } \