Skip to content

Commit 34e2dc5

Browse files
authored
Improve is_instanceof inference (#13238)
When a class is final, it may be treated as !is_instanceof.
1 parent 52dba99 commit 34e2dc5

File tree

1 file changed

+9
-4
lines changed

1 file changed

+9
-4
lines changed

Zend/Optimizer/zend_inference.c

+9-4
Original file line numberDiff line numberDiff line change
@@ -2003,10 +2003,15 @@ static uint32_t get_ssa_alias_types(zend_ssa_alias_kind alias) {
20032003
#define UPDATE_SSA_OBJ_TYPE(_ce, _is_instanceof, var) \
20042004
do { \
20052005
if (var >= 0) { \
2006-
if (ssa_var_info[var].ce != (_ce) || \
2007-
ssa_var_info[var].is_instanceof != (_is_instanceof)) { \
2008-
ssa_var_info[var].ce = (_ce); \
2009-
ssa_var_info[var].is_instanceof = (_is_instanceof); \
2006+
zend_class_entry *__ce = (_ce); \
2007+
bool __is_instanceof = (_is_instanceof); \
2008+
if (__ce && (__ce->ce_flags & ZEND_ACC_FINAL)) { \
2009+
__is_instanceof = false; \
2010+
} \
2011+
if (ssa_var_info[var].ce != __ce || \
2012+
ssa_var_info[var].is_instanceof != __is_instanceof) { \
2013+
ssa_var_info[var].ce = __ce; \
2014+
ssa_var_info[var].is_instanceof = __is_instanceof; \
20102015
if (update_worklist) { \
20112016
add_usages(op_array, ssa, worklist, var); \
20122017
} \

0 commit comments

Comments
 (0)