} \
} \
if (ssa_var_info[__var].type != __type) { \
- check_type_narrowing(op_array, ssa, worklist, \
- __var, ssa_var_info[__var].type, __type); \
+ if (ssa_var_info[__var].type & ~__type) { \
+ handle_type_narrowing(op_array, ssa, worklist, \
+ __var, ssa_var_info[__var].type, __type); \
+ return FAILURE; \
+ } \
ssa_var_info[__var].type = __type; \
add_usages(op_array, ssa, worklist, __var); \
} \
#endif
}
-static void check_type_narrowing(const zend_op_array *op_array, zend_ssa *ssa, zend_bitset worklist, int var, uint32_t old_type, uint32_t new_type)
+static void handle_type_narrowing(const zend_op_array *op_array, zend_ssa *ssa, zend_bitset worklist, int var, uint32_t old_type, uint32_t new_type)
{
- /* if new_type set resets some bits from old_type set
- * We have completely recalculate types of some dependent SSA variables
- * (this may occurs mainly because of incremental inter-precudure
- * type inference)
- */
- if (old_type & ~new_type) {
- ZEND_ASSERT(0); /* Currently this should never happen */
+ if (1) {
+ /* Right now, this is always a bug */
+ zend_error(E_WARNING, "Narrowing occurred during type inference. Please file a bug report on bugs.php.net");
+ } else {
+ /* if new_type set resets some bits from old_type set
+ * We have completely recalculate types of some dependent SSA variables
+ * (this may occurs mainly because of incremental inter-precudure
+ * type inference)
+ */
reset_dependent_vars(op_array, ssa, worklist, var);
}
}
return tmp;
}
-static void zend_update_type_info(const zend_op_array *op_array,
+static int zend_update_type_info(const zend_op_array *op_array,
zend_ssa *ssa,
const zend_script *script,
zend_bitset worklist,
}
break;
}
+
+ return SUCCESS;
}
static uint32_t get_class_entry_rank(zend_class_entry *ce) {
}
} else if (ssa_vars[j].definition >= 0) {
i = ssa_vars[j].definition;
- zend_update_type_info(op_array, ssa, script, worklist, i);
+ if (zend_update_type_info(op_array, ssa, script, worklist, i) == FAILURE) {
+ return FAILURE;
+ }
}
} WHILE_WORKLIST_END();
return SUCCESS;