]> granicus.if.org Git - php/commitdiff
SCCP: Fix handling of ASSIGN_OBJ_REF
authorNikita Popov <nikita.ppv@gmail.com>
Tue, 28 May 2019 14:14:46 +0000 (16:14 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Tue, 28 May 2019 14:15:37 +0000 (16:15 +0200)
The generic BOT handling is not away of OP_DATA, so need to handle
this opcode before we get to that.

ext/opcache/Optimizer/sccp.c
ext/opcache/tests/opt/sccp_029.phpt [new file with mode: 0644]

index e81c99d61b4c5d695842676d63614b75263f4b2b..e09d5d6849992cbb23ab3f463c2e67cc9ebeba7c 100644 (file)
@@ -1440,6 +1440,17 @@ static void sccp_visit_instr(scdf_ctx *scdf, zend_op *opline, zend_ssa_op *ssa_o
                                SET_RESULT_BOT(result);
                        }
                        return;
+               case ZEND_ASSIGN_STATIC_PROP_REF:
+               case ZEND_ASSIGN_OBJ_REF:
+                       /* Handled here because we also need to BOT the OP_DATA operand, while the generic
+                        * code below will not do so. */
+                       SET_RESULT_BOT(result);
+                       SET_RESULT_BOT(op1);
+                       SET_RESULT_BOT(op2);
+                       opline++;
+                       ssa_op++;
+                       SET_RESULT_BOT(op1);
+                       break;
        }
 
        if ((op1 && IS_BOT(op1)) || (op2 && IS_BOT(op2))) {
@@ -1915,16 +1926,6 @@ static void sccp_visit_instr(scdf_ctx *scdf, zend_op *opline, zend_ssa_op *ssa_o
                        SET_RESULT_BOT(result);
                        break;
                }
-               case ZEND_ASSIGN_STATIC_PROP_REF:
-               case ZEND_ASSIGN_OBJ_REF:
-                       SET_RESULT_BOT(result);
-                       SET_RESULT_BOT(op1);
-                       SET_RESULT_BOT(op2);
-                       opline++;
-                       ssa_op++;
-                       op1 = get_op1_value(ctx, opline, ssa_op);
-                       SET_RESULT_BOT(op1);
-                       break;
                default:
                {
                        /* If we have no explicit implementation return BOT */
diff --git a/ext/opcache/tests/opt/sccp_029.phpt b/ext/opcache/tests/opt/sccp_029.phpt
new file mode 100644 (file)
index 0000000..3a16477
--- /dev/null
@@ -0,0 +1,27 @@
+--TEST--
+SCCP 029: Don't propagate assignments to references to typed properties
+--INI--
+opcache.enable=1
+opcache.enable_cli=1
+opcache.optimization_level=-1
+opcache.preload=
+--SKIPIF--
+<?php require_once('skipif.inc'); ?>
+--FILE--
+<?php
+
+class Test { 
+    public string $x = "x";
+}
+function test() {
+    $test = new Test();
+    $ref = "y";
+    $test->x =& $ref;
+    $ref = 42;
+    var_dump($ref);
+}
+test();
+
+?>
+--EXPECT--
+string(2) "42"