From 18904aa3e2fa73a43c5b1b552134cf38a0302f7c Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 30 Dec 2016 22:23:12 +0100 Subject: [PATCH] Compact literals: Deduplicate empty array literals --- ext/opcache/Optimizer/compact_literals.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) 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; -- 2.50.1