]> granicus.if.org Git - php/commitdiff
Compact literals: Deduplicate empty array literals
authorNikita Popov <nikic@php.net>
Fri, 30 Dec 2016 21:23:12 +0000 (22:23 +0100)
committerNikita Popov <nikic@php.net>
Mon, 9 Jan 2017 23:21:38 +0000 (00:21 +0100)
ext/opcache/Optimizer/compact_literals.c

index 6d549220abccc02ae497b8cbab9b3262100a8501..e557f02a115366db6bee13eb1c84a0f310909a97 100644 (file)
@@ -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;