From: Nikita Popov Date: Fri, 30 Dec 2016 21:23:12 +0000 (+0100) Subject: Compact literals: Deduplicate empty array literals X-Git-Tag: php-7.2.0alpha1~563 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=18904aa3e2fa73a43c5b1b552134cf38a0302f7c;p=php Compact literals: Deduplicate empty array literals --- diff --git a/ext/opcache/Optimizer/compact_literals.c b/ext/opcache/Optimizer/compact_literals.c index 6d549220ab..e557f02a11 100644 --- a/ext/opcache/Optimizer/compact_literals.c +++ b/ext/opcache/Optimizer/compact_literals.c @@ -123,6 +123,7 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx int l_null = -1; int l_false = -1; int l_true = -1; + int l_empty_arr = -1; HashTable hash; zend_string *key = NULL; void *checkpoint = zend_arena_checkpoint(ctx->arena); @@ -481,6 +482,22 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx } } break; + case IS_ARRAY: + if (zend_hash_num_elements(Z_ARRVAL(op_array->literals[i])) == 0) { + if (l_empty_arr < 0) { + l_empty_arr = j; + if (i != j) { + op_array->literals[j] = op_array->literals[i]; + info[j] = info[i]; + } + j++; + } else { + zval_dtor(&op_array->literals[i]); + } + map[i] = l_empty_arr; + break; + } + /* break missing intentionally */ default: /* don't merge other types */ map[i] = j;