summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2019-07-04 17:13:04 +0200
committerNikita Popov <nikita.ppv@gmail.com>2019-07-04 17:13:04 +0200
commit9fbf9e3e1353b0082bdbdb136a95dcb2d4a5b0da (patch)
tree2469b11a8ae2ebafde9ec51783c859d9fa8d1ecd /ext
parent806e38a3a4a9409f89a44831b2869b831ff886be (diff)
parenta0e762405955b9e3b63ca8f164006afc6bb6b435 (diff)
downloadphp-git-9fbf9e3e1353b0082bdbdb136a95dcb2d4a5b0da.tar.gz
Merge branch 'PHP-7.4'
Diffstat (limited to 'ext')
-rw-r--r--ext/opcache/Optimizer/compact_literals.c17
1 files changed, 11 insertions, 6 deletions
diff --git a/ext/opcache/Optimizer/compact_literals.c b/ext/opcache/Optimizer/compact_literals.c
index ec01302aac..50ccd7d256 100644
--- a/ext/opcache/Optimizer/compact_literals.c
+++ b/ext/opcache/Optimizer/compact_literals.c
@@ -431,16 +431,18 @@ literals_handle_static_prop:
j++;
}
break;
- case IS_STRING:
+ case IS_STRING: {
if (LITERAL_NUM_RELATED(info[i].flags) == 1) {
key = zend_string_copy(Z_STR(op_array->literals[i]));
- } else {
+ } else if ((info[i].flags & LITERAL_KIND_MASK) != LITERAL_VALUE) {
key = zend_string_init(Z_STRVAL(op_array->literals[i]), Z_STRLEN(op_array->literals[i]), 0);
ZSTR_H(key) = ZSTR_HASH(Z_STR(op_array->literals[i])) +
LITERAL_NUM_RELATED(info[i].flags) - 1;
+ } else {
+ /* Don't merge LITERAL_VALUE that has related literals */
+ key = NULL;
}
- pos = zend_hash_find(&hash, key);
- if (pos != NULL &&
+ if (key && (pos = zend_hash_find(&hash, key)) != NULL &&
Z_TYPE(op_array->literals[Z_LVAL_P(pos)]) == IS_STRING &&
LITERAL_NUM_RELATED(info[i].flags) == LITERAL_NUM_RELATED(info[Z_LVAL_P(pos)].flags) &&
(LITERAL_NUM_RELATED(info[i].flags) != 2 ||
@@ -458,8 +460,10 @@ literals_handle_static_prop:
} else {
map[i] = j;
ZVAL_LONG(&zv, j);
- zend_hash_add_new(&hash, key, &zv);
- zend_string_release_ex(key, 0);
+ if (key) {
+ zend_hash_add_new(&hash, key, &zv);
+ zend_string_release_ex(key, 0);
+ }
if (i != j) {
op_array->literals[j] = op_array->literals[i];
info[j] = info[i];
@@ -474,6 +478,7 @@ literals_handle_static_prop:
}
}
break;
+ }
case IS_ARRAY:
if (zend_hash_num_elements(Z_ARRVAL(op_array->literals[i])) == 0) {
if (l_empty_arr < 0) {