@@ -1734,6 +1734,16 @@ static int zend_infer_ranges(const zend_op_array *op_array, zend_ssa *ssa) /* {{
1734
1734
}
1735
1735
/* }}} */
1736
1736
1737
+ static uint32_t get_ssa_alias_types (zend_ssa_alias_kind alias ) {
1738
+ if (alias == PHP_ERRORMSG_ALIAS ) {
1739
+ return MAY_BE_STRING | MAY_BE_RC1 | MAY_BE_RCN ;
1740
+ } else if (alias == HTTP_RESPONSE_HEADER_ALIAS ) {
1741
+ return MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_LONG | MAY_BE_ARRAY_OF_STRING | MAY_BE_RC1 | MAY_BE_RCN ;
1742
+ } else {
1743
+ return MAY_BE_UNDEF | MAY_BE_RC1 | MAY_BE_RCN | MAY_BE_REF | MAY_BE_ANY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF ;
1744
+ }
1745
+ }
1746
+
1737
1747
#define UPDATE_SSA_TYPE (_type , _var ) \
1738
1748
do { \
1739
1749
uint32_t __type = (_type); \
@@ -1742,14 +1752,18 @@ static int zend_infer_ranges(const zend_op_array *op_array, zend_ssa *ssa) /* {{
1742
1752
__type |= MAY_BE_RC1 | MAY_BE_RCN | MAY_BE_ANY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF; \
1743
1753
} \
1744
1754
if (__var >= 0) { \
1745
- if (ssa_vars[__var].var < op_array->last_var) { \
1755
+ zend_ssa_var *__ssa_var = &ssa_vars[__var]; \
1756
+ if (__ssa_var->var < op_array->last_var) { \
1746
1757
if (__type & (MAY_BE_REF|MAY_BE_RCN)) { \
1747
1758
__type |= MAY_BE_RC1 | MAY_BE_RCN; \
1748
1759
} \
1749
1760
if ((__type & MAY_BE_RC1) && (__type & MAY_BE_STRING)) {\
1750
1761
/* TODO: support for array keys and ($str . "")*/ \
1751
1762
__type |= MAY_BE_RCN ; \
1752
1763
} \
1764
+ if (__ssa_var -> alias ) { \
1765
+ __type |= get_ssa_alias_types (__ssa_var -> alias ); \
1766
+ } \
1753
1767
} \
1754
1768
if (ssa_var_info [__var ].type != __type ) { \
1755
1769
if (ssa_var_info [__var ].type & ~__type ) { \
@@ -3880,18 +3894,6 @@ static int zend_infer_types(const zend_op_array *op_array, const zend_script *sc
3880
3894
/* Narrowing integer initialization to doubles */
3881
3895
zend_type_narrowing (op_array , script , ssa );
3882
3896
3883
- for (j = 0 ; j < ssa_vars_count ; j ++ ) {
3884
- if (ssa -> vars [j ].alias ) {
3885
- if (ssa -> vars [j ].alias == PHP_ERRORMSG_ALIAS ) {
3886
- ssa_var_info [j ].type |= MAY_BE_STRING | MAY_BE_RC1 | MAY_BE_RCN ;
3887
- } else if (ssa -> vars [j ].alias == HTTP_RESPONSE_HEADER_ALIAS ) {
3888
- ssa_var_info [j ].type |= MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_LONG | MAY_BE_ARRAY_OF_STRING | MAY_BE_RC1 | MAY_BE_RCN ;
3889
- } else {
3890
- ssa_var_info [j ].type = MAY_BE_UNDEF | MAY_BE_RC1 | MAY_BE_RCN | MAY_BE_REF | MAY_BE_ANY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF ;
3891
- }
3892
- }
3893
- }
3894
-
3895
3897
if (ZEND_FUNC_INFO (op_array )) {
3896
3898
zend_func_return_info (op_array , script , 1 , 0 , & ZEND_FUNC_INFO (op_array )-> return_info );
3897
3899
}
@@ -3919,6 +3921,9 @@ int zend_ssa_inference(zend_arena **arena, const zend_op_array *op_array, const
3919
3921
for (i = 0 ; i < op_array -> last_var ; i ++ ) {
3920
3922
ssa_var_info [i ].type = MAY_BE_UNDEF ;
3921
3923
ssa_var_info [i ].has_range = 0 ;
3924
+ if (ssa -> vars [i ].alias ) {
3925
+ ssa_var_info [i ].type |= get_ssa_alias_types (ssa -> vars [i ].alias );
3926
+ }
3922
3927
}
3923
3928
}
3924
3929
for (i = op_array -> last_var ; i < ssa -> vars_count ; i ++ ) {
0 commit comments