summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2016-09-15 03:07:31 +0300
committerDmitry Stogov <dmitry@zend.com>2016-09-30 02:41:08 +0300
commitc218c4f01eccc39bea20d5e18eac04dd6bb562f3 (patch)
treec29c0ab88281d533d442ce60c47536d1d3570d43
parent0edb16e768b45cfb9d1abdf962f0581102a1ef2c (diff)
downloadphp-git-c218c4f01eccc39bea20d5e18eac04dd6bb562f3.tar.gz
Special handling for $php_errormsg and $http_response_header.
-rw-r--r--ext/opcache/Optimizer/zend_inference.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/ext/opcache/Optimizer/zend_inference.c b/ext/opcache/Optimizer/zend_inference.c
index 5abab01ac4..f9fd26748d 100644
--- a/ext/opcache/Optimizer/zend_inference.c
+++ b/ext/opcache/Optimizer/zend_inference.c
@@ -4063,13 +4063,19 @@ static int zend_infer_types(const zend_op_array *op_array, const zend_script *sc
zend_type_narrowing(op_array, script, ssa);
for (j = 0; j < op_array->last_var; j++) {
+ /* $php_errormsg and $http_response_header may be updated indirectly */
if (zend_string_equals_literal(op_array->vars[j], "php_errormsg")) {
- /* Mark all SSA vars for $php_errormsg as references,
- * to make sure we don't optimize it. */
int i;
for (i = 0; i < ssa_vars_count; i++) {
if (ssa->vars[i].var == j) {
- ssa_var_info[i].type |= MAY_BE_REF | MAY_BE_ANY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF;
+ ssa_var_info[i].type |= MAY_BE_STRING | MAY_BE_RC1 | MAY_BE_RCN;
+ }
+ }
+ } else if (zend_string_equals_literal(op_array->vars[j], "http_response_header")) {
+ int i;
+ for (i = 0; i < ssa_vars_count; i++) {
+ if (ssa->vars[i].var == j) {
+ ssa_var_info[i].type |= MAY_BE_ARRAY | MAY_BE_ARRAY_KEY_LONG | MAY_BE_ARRAY_OF_STRING | MAY_BE_RC1 | MAY_BE_RCN;
}
}
}