]> granicus.if.org Git - php/commitdiff
Do not swap operands in array addition
authorNikita Popov <nikic@php.net>
Sun, 13 Dec 2015 23:28:41 +0000 (00:28 +0100)
committerNikita Popov <nikic@php.net>
Sun, 13 Dec 2015 23:29:05 +0000 (00:29 +0100)
As we support constant array operands nowadays, the original check
didn't work anymore.

Zend/tests/array_addition_not_commutative.phpt [new file with mode: 0644]
ext/opcache/Optimizer/pass3.c

diff --git a/Zend/tests/array_addition_not_commutative.phpt b/Zend/tests/array_addition_not_commutative.phpt
new file mode 100644 (file)
index 0000000..f4e5342
--- /dev/null
@@ -0,0 +1,19 @@
+--TEST--
+Array addition is not commutative -- do not swap operands
+--FILE--
+<?php
+
+$array = [1, 2, 3];
+$array = [4, 5, 6] + $array;
+var_dump($array);
+
+?>
+--EXPECT--
+array(3) {
+  [0]=>
+  int(4)
+  [1]=>
+  int(5)
+  [2]=>
+  int(6)
+}
index 3e589df628686b2541526b9c00726a4fa44d589e..43258c7d9f23d86d678387c0741a8841146ee603 100644 (file)
@@ -106,7 +106,9 @@ void zend_optimizer_pass3(zend_op_array *op_array)
                                                zend_uchar tmp_type = opline->op1_type;
                                                znode_op tmp = opline->op1;
 
-                                               if (opline->opcode != ZEND_ADD || ZEND_OP1_TYPE(opline) == IS_CONST) {
+                                               if (opline->opcode != ZEND_ADD
+                                                               || (ZEND_OP1_TYPE(opline) == IS_CONST
+                                                                       && Z_TYPE(ZEND_OP1_LITERAL(opline)) != IS_ARRAY)) {
                                                        /* protection from array add: $a = array + $a is not commutative! */
                                                        COPY_NODE(opline->op1, opline->op2);
                                                        COPY_NODE(opline->op2, tmp);