]> granicus.if.org Git - php/commitdiff
Fixed incorrect constant propagation
authorDmitry Stogov <dmitry@zend.com>
Thu, 30 Jun 2016 17:48:16 +0000 (20:48 +0300)
committerDmitry Stogov <dmitry@zend.com>
Thu, 30 Jun 2016 17:48:16 +0000 (20:48 +0300)
ext/opcache/Optimizer/zend_optimizer.c
ext/opcache/tests/wrong_inlining_001.phpt [new file with mode: 0644]

index 43b355ee3c52ef9ddd994964ad6b278dfaa9aa9c..f1c62ddd652d152da232019a17e6ef9d0f639fbe 100644 (file)
@@ -195,12 +195,9 @@ int zend_optimizer_update_op1_const(zend_op_array *op_array,
                        opline->opcode = ZEND_SEND_VAL;
                        opline->op1.constant = zend_optimizer_add_literal(op_array, val);
                        break;
-               case ZEND_SEND_VAR_NO_REF_EX:
-                       opline->opcode = ZEND_SEND_VAL_EX;
-                       opline->op1.constant = zend_optimizer_add_literal(op_array, val);
-                       break;
                case ZEND_SEPARATE:
                case ZEND_SEND_VAR_NO_REF:
+               case ZEND_SEND_VAR_NO_REF_EX:
                        zval_ptr_dtor(val);
                        return 0;
                case ZEND_CONCAT:
diff --git a/ext/opcache/tests/wrong_inlining_001.phpt b/ext/opcache/tests/wrong_inlining_001.phpt
new file mode 100644 (file)
index 0000000..5cc515c
--- /dev/null
@@ -0,0 +1,28 @@
+--TEST--
+Pass result of inlined function by reference
+--INI--
+opcache.enable=1
+opcache.enable_cli=1
+opcache.optimization_level=-1
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+function get_const() {
+    return 42;
+}
+
+function test() {
+    foo(get_const());
+}
+
+if (true) {
+    function foo(&$ref) {}
+}
+
+test();
+?>
+OK
+--EXPECTF--
+Notice: Only variables should be passed by reference in %swrong_inlining_001.php on line 7
+OK
\ No newline at end of file